1. 程式人生 > 其它 >【認證】線性表的順序表示【408統考】

【認證】線性表的順序表示【408統考】

順序表的定義

一組地址連續的儲存單元依次儲存線性表中的資料元素,從而使得邏輯上相鄰的兩個元素在物理位置上也相鄰

順序表的特點

邏輯順序與其物理順序相同

線性表L儲存的起始位置為LOC(A),sizeof(ElemType)是每個資料元素所佔用儲存空間的大小,則表L所對應的順序儲存

線性表的順序儲存結構是一種隨即存取的儲存結構

通常用高階程式設計語言中的陣列來描述線性表的順序儲存結構

檢視程式碼
#define MaxSize 50            //定義線性表的最大長度
typedef struct{
    ElemType data[MaxSize];   //順序表的元素
    int length;               //順序表的當前長度
}SqList;                      //順序表的型別定義

 

一維陣列可以靜態分配,也可以是動態分配

靜態分配時,由於陣列的大小和空間事先已經固定,一旦空間佔滿,再加入新的資料就會產生溢位,進而導致程式崩潰

動態分配時,儲存陣列的空間是在程式執行過程中通過動態儲存分配語句分配的,一旦資料空間佔滿,就另外開闢一塊更大的儲存空間,用以替換原來的儲存空間,從而達到擴充儲存陣列空間的目的,而不需要為線性表一次性地劃分所有空間。

動態分配並不是鏈式儲存,它同樣屬於順序儲存結構,物理結構沒有變化,依然是隨機存取方式,只是分配的空間大小可以在執行時動態決定。

#define InitSize 100          //表長度的初始定義
typedef struct{
    ElemType *data;           //指示動態分配陣列的指標
    int MaxSize,length;       //陣列的最大容量和當前個數
}SqList;                      //動態分配陣列順序表的型別定義

C的初試動態分配語句為

L.data=(ElemType*)malloc(sizeof(ElemType)*InitSize);

C++的初始動態分配語句為

L.data=new ElemType[InitSize];

 

順序表最主要的特點是隨機訪問,即通過首地址和元素序號可在時間0(1)內找到指定的元素。

順序表的儲存密度高,每個結點只儲存資料元素。

順序表邏輯上相鄰的元素物理上也相鄰,所以插入和刪除操作需要移動大量元素。

順序表上基本操作的實現

插入操作

在順序表L的第i (1<=i<=L. 1ength+1)個位置插入新元素e。

bool ListInsert(SqList &L,int i,ElemType e){
    if(i<1||i>L.length+1)
        return false;
    if(L.length>=MaxSize)
        return false;
    for(int j=L.length;j>=i;j--)
        L.data[j]=L.data[j-1];
    L.data[i-1]=e;
    L.length++;
    return true;
}

最好情況:在表尾插入(即i=n+ 1),元素後移語句將不執行,時間複雜度為0(1)。

最壞情況:在表頭插入(即i= 1),元素後移語句將執行n次,時間複雜度為0(n)。

平均情況:假設pi (pr= 1/(n+ 1)是在第i個位置上插入一個結點的概率,則在長度為n的線性表中插入-個結點時,所需移動結點的平均次數為n/2

刪除操作

刪除順序表L中第i (1<=i<=L. length)個位置的元素,用引用變數e返回。

bool ListDelete(SqList &L,int i,Elemtype &e){
    if(i<1||i>L.length)
        return false;
    e=L.data[i-1];
    for(int j=i,j<L.length;j++)
        L.data[j-1]=L.data[j];
    L.length--;
    return true;
}

最好情況:刪除表尾元素(即i=n),無須移動元素,時間複雜度為0(1)。

最壞情況:刪除表頭元素(即i= 1),需移動除表頭元素外的所有元素,時間複雜度為O(n)。

平均情況:假設pi (p= 1/n)是刪除第i個位置上結點的概率,則在長度為n的線性表中刪除一個結點時,所需移動結點的平均次數為n-1/2

按值查詢【順序查詢】

在順序表L中查詢第一個元素值等於e的元素,並返回其位序

int LocateElem(SqList L,ElemType e){
    int i;
    for(i=0;i<L.length;i++)
        if(L.data[i]==e)
            return i+1;    //下標為i的元素值等於e,返回其位序1+1
        return 0;          //退出迴圈,說明查詢失敗
}

最好情況:查詢的元素就在表頭,僅需比較一-次, 時間複雜度為0(1)。

最壞情況:查詢的元素在表尾(或不存在)時,需要比較n次,時間複雜度為O(n)。

平均情況:假設p; (p;= 1/n)是查詢的元素在第i (1<=i<=L. length)個位置上的概率,則在長度為n的線性表中查詢值為e的元素所需比較的平均次數為n+1/2

 因此,線性表按值查詢演算法的平均時間複雜度為O(n)。

試題精選

單項選擇題

1.下述()是順序儲存結構的優點。

A.儲存密度大

B.插入運算方便

C.刪除運算方便

D.方便地運用於各種邏輯結構的儲存表示

2.線性表的順序儲存結構是一種( ).

A.隨機存取的儲存結構

B.順序存取的儲存結構

C.索引存取的儲存結構

D.雜湊存取的儲存結構

3.一個順序表所佔用的儲存空間大小與( )無關.

A.表的長度

B.元素的存放順序

C.元素的型別

D.元素中各欄位的型別

4.若線性表最常用的操作是存取第i個元素及其前驅和後繼元素的值,為了提高效率,應採用( )的儲存方式。

A.單鏈表

B.雙向連結串列

C.單迴圈連結串列

D.順序表

5.一個線性表最常用的操作是存取任一指定序號的元素並在最後進行插入、刪除操作,則利用( )儲存方式可以節省時間。

A.順序表

B.雙鏈表

C.帶頭結點的雙迴圈連結串列

D.單迴圈連結串列

6.在n個元素的線性表的陣列表示中,時間複雜度為0(1)的操作是( )。

I. 訪問第i(1≤i≤n)個結點和求第i (2≤i≤n)個結點的直接前驅

II.在最後一個結點後插入一個新的結點

II. 刪除第1個結點

IV. 在第i(1≤i≤n)個結點後插入一個結點

A. I

B. II、III

C. I、II

D. I、II、 III

7.設線性表有n個元素,嚴格說來,以下操作中,( ) 在順序表上實現要比在連結串列上實現的效率高。

I. 輸出第i(1≤i≤n)個元素值

II.交換第3個元素與第4個元案的值

III.順序輸出這n個元素的值

A. I

B. I、III

C. I、II

D. II、III

8.在一個長度為n的順序表中刪除第i(1≤i≤n)個元素時,需向前移動( )個元素。

A. n

B. i-1

C. n-i

D. n-i+ 1

9.對於順序表,訪問第i個位置的元素和在第i個位置插入-一個元素的時間複雜度為( )。

A.O(n),O(n)

B.O(n), O(1)

C.O(1),O(n)

D. O(1), O(1)

10.若長度為n的非空線性表採用順序儲存結構,在表的第i個位置插入一個數據元素,貝i的合法值應該是( ).

A. l≤i≤n

B.1≤i≤n+ 1

C. 0≤i≤n-l

D.0≤i≤n

11. 順序表的插入演算法中,當n個空間已滿時,可再申請增加分配m個空間,若申請失敗,則說明系統沒有()可分配的儲存空間。

A. m個

B. m個連續

C. n+m個

D. n+m個連續

綜合應用題

1.從順序表中刪除具有最小值的元素(假設唯一)並由函式返回被刪元素的值。空出的位置由最後一個元素填補,若順序表為空,則顯示出錯資訊並退出執行。

2.設計一個高效演算法,將順序表L的所有元素逆置,要求演算法的空間複雜度為0(1)。

3.對長度為n的順序表L,編寫一個時間複雜度為0(n)、空間複雜度為0(1)的演算法,該算法刪除線性表中所有值為x的資料元素.

4.從有序順序表中刪除其值在給定值s與1之間(要求s<1)的所有元素,若s或1不合理或順序表為空,則顯示出錯資訊並退出執行。

5.從順序表中刪除其值在給定值s與1之間(包含s和1,要求s<1)的所有元素,若s或1不合理或順序表為空,則顯示出錯資訊並退出執行。

6.從有序順序表中刪除所有其值重複的元素,使表中所有元素的值均不同。

7.將兩個有序順序表合併為一個新的有序順序表,並由函式返回結果順序表。

8. 已知在一維陣列A【m + n】中依次存放兩個線性表(a1, Q2, .... am)和(b1, b2, b... bn). 試編寫一個函式,將陣列中兩個順序表的位置互換,即將(b|, b2, b..", bn)放在(a1, a2, a,"", am)

的前面。

9.線性表(a1, a2, a,-. a,)中的元素遞增有序且按順序儲存於計算機內。要求設計一個演算法,完成用最少時間在表中查詢數值為x的元素,若找到,則將其與後繼元素位置相交換,若找不到,則將其插入表中並使表中元素仍遞增有序.

10. 【2010統考真題】設將n (n> 1)個整數存放到一維陣列R中。設計一個在時間和空間兩方面都儘可能高效的演算法。將R中儲存的序列迴圈左移p(0<p<n)個位置,即將R中的資料由(X, x.,.. Xx_ )變換為(Xp xp+1). 要求:

1)給出演算法的基本設計思想。

2)根據設計思想,採用C或C++或Java語言描述演算法,關鍵之處給出註釋。

3)說明你所設計演算法的時間複雜度和空間複雜度。

11. 【2011 統考真題】一個長度為L (L≥1)的升序序列S,處在第【L/27個位 置的數稱為S 的中位數。例如,若序列S=(11, 13,15, 17,19),則S|的中位數是15,兩個序列的中位數是含它們所有元素的升序序列的中位數。例如,若S2=(2,4,6,8, 20),則Si和S2的中位數是11.現在有兩個等長升序序列A和B,試設計一個在時間和空間兩方面都儘可能高效的演算法,找出兩個序列A和B的中位數。要求:

1)給出演算法的基本設計思想。

2)根據設計思想,採用C或C++或Java語言描述演算法,關鍵之處給出註釋。.

3)說明你所設計演算法的時間複雜度和空間複雜度。

12. 【2013統考真題】已知一個整數序列A= (ao, a.,.",an-1), 其中0≤a<n (0≤i<n)。若存在ap1=ap2= ... =apm=x 且m>n/2 (0≤px<n,1≤k≤m),則稱x為A的主元素。例如A=(0,5,5,3,5,7,5,5),則5為主元素;又如A=(0,5,5,3,5,1,5,7), 則A中沒有主元素。假設A中的n個元素儲存在一個一-維陣列中,請設計一個儘可能高效的演算法,找出A的主元素。若存在主元素,則輸出該元素;否則輸出-1.要求:

1)給出演算法的基本設計思想。

2)根據設計思想,採用C或C++或Java語言描述演算法,關鍵之處給出註釋。

3)說明你所設計演算法的時間複雜度和空間複雜度。

13. 【2018 統考真題】給定一個含n (n≥1)個整數的陣列,請設計一個在時間上儘可能高效的演算法,找出陣列中未出現的最小正整數。例如,陣列{-5, 3, 2, 3}中未出現的最小正整數是1;陣列{1,2,3}中未出現的最小正整數是4.要求:

1)給出演算法的基本設計思想.

2)根據設計思想,採用C或C++語言描述演算法,關鍵之處給出註釋。

3)說明你所設計演算法的時間複雜度和空間複雜度。

14. 【2020 統考真題】定義三元組(a,b,c) (a、b、 c均為正數)的距離D=|a-b|+|b-c|+|c-a|。給定3個非空整數集合S小、S2和S,"按升序分別儲存在3個數組中。請設計一個儘可能高效的演算法,計算並輸出所有可能的三元組(a, b,c) (a∈S,b∈S, c∈s;) 中的最小距離。例如Si={-1,0,9}, Sz={-25,-10, 10,11}, S3= {2,9, 17, 30,41},則最小距離為2,相應的三元組為(9, 10, 9)。要求:

1)給出演算法的基本設計思想。

2)根據設計思想,採用C語言或C++語言描述演算法,關鍵之處給出註釋。

3)說明你所設計演算法的時間複雜度和空間複雜度。