1. 程式人生 > >408計算機學科專業基礎綜合——資料結構

408計算機學科專業基礎綜合——資料結構

第1章 緒論

1.1 資料結構的基本概念

資料元是資料的基本單位,一個資料元素可由若干個資料項完成,資料項是構成資料元素的不可分割的最小單位。例如,學生記錄就是一個數據元素,它由學號、姓名、性別等資料項組成。

資料物件是具有相同性質的資料元素的集合,是資料的一個子集。

資料型別是一個值的集合和定義在此集合上一組操作的總稱。

  • 原子型別:其值不可再分的資料型別
  • 結構型別:其值可以再分解為若干成分(分量)的資料型別
  • 抽象資料型別:抽象資料組織和與之相關的操作

抽象資料型別(ADT)是指一個數學模型以及定義在該模型上的一組操作。抽象資料型別的定義僅取決於它的一組邏輯特性,而與其在計算機內部如何表示和實現無關。通常用(資料物件、資料關係、基本操作集

)這樣的三元組來表示。

資料結構的三要素:

  1. 邏輯結構是指資料元素之間的邏輯關係,即從邏輯關係上描述資料,獨立於計算機。分為線性結構和非線性結構,線性表、棧、佇列屬於線性結構,樹、圖、集合屬於非線性結構。
  2. 儲存結構是指資料結構在計算機中的表示(又稱映像),也稱物理結構,包括資料元素的表示和關係的表示,依賴於計算機語言,分為順序儲存(隨機存取)、鏈式儲存(無碎片)、索引儲存(檢索速度快)、雜湊儲存(檢索、增加、刪除快)。
  3. 資料的運算:包括運算的定義和實現。運算的定義是針對邏輯結構的,指出運算的功能;運算的實現是針對儲存結構的,指出運算的具體操作步驟。

選擇題

1.可以用(抽象資料型別)定義一個完整的資料結構。

3.以下屬於邏輯結構的是(有序表) A 順序表 B 雜湊表 C 有序表 D 單鏈表

4.以下與資料的儲存結構無關的術語是(棧) A 迴圈佇列 B 連結串列 C 雜湊表 D 棧

6.在儲存資料時,通常不僅要儲存各資料元素的值,還要儲存(資料元素之間的關係)

7.鏈式儲存設計時,結點內的儲存單元地址(一定連續),不同結點間可以(不連續)

1.2 演算法和演算法評價

演算法是對特定問題求解步驟的一種描述,有五個特性:有窮性、確定性、可行性、輸入、輸出。一個演算法有零個或多個的輸入,有一個或多個的輸出

時間複雜度是指該語句在演算法中被重複執行的次數,不僅依賴於問題的規模n,也取決於待輸入資料的性質。

空間複雜度定義為該演算法所耗費的儲存空間。演算法原地工作是指演算法所需輔助空間是常量,即O(1)。

第2章 線性表

2.1 線性表的定義和基本操作

線性表是具有相同資料型別的n個資料元素有限序列。除第一個元素外,每個元素有且僅有一個直接前驅;除最後一個元素外,每個元素有且僅有一個直接後繼。

注意:線性表是一種邏輯結構,表示元素之間一對一的相鄰關係。順序表和連結串列是指儲存結構。兩者屬於不同層面的概念,因此不要混淆。

選擇題

2.以下(由100個字元組成的序列)是一個線性表。 A 由n個實陣列成的集合 B 由100個字元組成的序列 C 所有整陣列成的序列(無窮) D 鄰接表(儲存結構)

2.2 線性表的順序表示

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

順序表的特點是表中元素的邏輯順序與其物理順序相同。 順序表最主要的特點是隨機訪問(隨機存取),即通過首地址和元素序號可以在O(1)的時間內找到指定的元素。但插入和刪除操作需要移動大量元素。 順序表的儲存密度高,每個結點只儲存資料元素。

順序表插入操作: 最好情況:在表尾插入,元素後移語句不執行,時間複雜度為O(1) 最壞情況:在表頭插入,元素後移語句將執行n次,時間複雜度為O(n) 平均情況:平均時間複雜度為O(n)

順序表刪除操作: 最好情況:刪除表尾元素,無需移動元素,時間複雜度為O(1) 最壞情況:刪除表頭元素,需要移動除第一個元素外的所有元素,時間複雜度為O(n) 平均情況:平均時間複雜度為O(n)

順序表按值查詢(順序查詢): 最好情況:查詢的元素就在表頭,僅需比較一次,時間複雜度為O(1) 最壞情況:查詢的元素在表尾或不存在時,需要比較n次,時間複雜度為O(n) 平均情況:平均時間複雜度為O(n)

選擇題

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

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

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

2.3 線性表的鏈式表示

鏈式儲存線性表時,不需要使用地址連續的儲存單元,即它不要求邏輯上相鄰的兩個元素在物理位置上也相鄰,對線性表的插入和刪除不需要移動元素,只需要修改指標。

單鏈表是非隨機儲存的儲存結構,即不能直接找到表中某個特定的結點。

頭結點和頭指標的區分:不管帶不帶頭結點,頭指標始終指向連結串列的第一個結點,而頭結點是帶頭結點連結串列中的第一個結點,結點內通常不儲存資訊。

採用頭插法建立單鏈表:從一個空表開始,生成新結點,並將讀取到的資料存放在新結點的資料域中,然後將新結點插入到當前連結串列的表頭,即頭結點之後。 讀入資料的順序與生成的連結串列中元素的順序是相反的。 每個結點插入的時間為O(1),設單鏈表長為n,則總的時間複雜度為O(n)。

採用尾插法建立單鏈表:將新結點插入到當前連結串列的表尾上,為此必須增加一個尾指標r,使其始終指向當前連結串列的尾結點。 時間複雜度和頭插法相同。

按序號查詢結點值:在單鏈表中從第一個結點出發,順指標next域逐個往下搜尋,直到找到第i個結點為止,否則返回最後一個結點指標域NULL。 時間複雜度為O(n)。

按值查詢表結點:從單鏈表第一個結點出發,由前往後依次比較表中各結點資料域的值,若某結點資料域的值等於給定值e,則返回該結點的指標,否則返回NULL。 時間複雜度為O(n)。

插入結點操作:先檢查插入位置的合法性,然後找到待插入位置的前驅結點,即第i-1個結點,再在其後插入新結點。 主要的時間開銷在於查詢第i-1個元素,時間複雜度為O(n)。若是在給定的結點後面插入新結點,則時間複雜度僅為O(1)。

刪除結點操作:先檢查刪除位置的合法性,然後找到待刪除位置的前驅結點,即第i-1個結點,再將其刪除。 時間複雜度為O(n)。

雙鏈表結點中有兩個指標prior和next,分別指向其前驅結點和後繼結點。雙鏈表中執行按值查詢和按位查詢的操作和單鏈表相同,但雙鏈表插入、刪除操作的時間複雜度僅為O(1)。

迴圈單鏈表和單鏈表的區別在於,表中最後一個結點的指標不是NULL,而改為指向頭結點,從而整個連結串列形成一個環。故表中沒有指標域為NULL的結點。 迴圈雙鏈表 L中,某結點*p為尾結點時,p->next=L;當迴圈雙鏈表為空表時,其頭結點的prior域和next域都等於L。

靜態連結串列是藉助陣列來描述線性表的鏈式儲存結構,結點也有資料域data和指標域next,這裡的指標是結點的相對地址(陣列下標),又稱為遊標。

順序表和連結串列的比較:

  1. 存取方式:順序表可以順序存取,也可以隨機存取,連結串列只能從表頭順序存取元素。
  2. 邏輯結構與物理結構:採用順序儲存時,邏輯上相鄰的元素,其對應的物理儲存位置也相鄰。而採用鏈式儲存時,邏輯上相鄰的元素,其物理儲存位置則不一定相鄰。
  3. 查詢、插入和刪除操作:對於按值查詢,當順序表在無序的情況下,兩者的時間複雜度均為O(n);而當順序表有序時,可採用折半查詢,時間複雜度為O(logn)。對於按序號查詢,順序表支援隨機訪問,時間複雜度僅為O(1),而連結串列的平均時間複雜度為O(n)。連結串列插入、刪除較優,只需修改相關結點的指標域即可。
  4. 空間分配:鏈式儲存的結點空間只在需要的時候申請分配。
  5. 通常較穩定的線性表選擇順序儲存,而頻繁做插入、刪除操作的線性表(即動態性較強)宜選擇鏈式儲存。

選擇題

2.對於一個線性表即要求能夠進行較快速地插入和刪除,又要求儲存結構能反映資料之間的邏輯關係,則應該用鏈式儲存方式。

4.下列關於線性表說法正確的是(D) I. 順序儲存方式只能用於儲存線性結構(同樣適合圖和樹的儲存,如滿二叉樹的順序儲存) II. 取線性表的第i個元素的時間與i的大小有關(無關,順序儲存) III. 靜態連結串列需要分配較大的連續空間,插入和刪除不需要移動元素 IV. 在一個長度為n的有序單鏈表中插入一個新結點並仍保持有序的時間複雜度為O(n) V. 若用單鏈表來表示佇列,則應該選用帶尾指標的迴圈連結串列 A I、II B I、III、IV、V C IV、V D III、IV、V

7.給定有n個元素的一維陣列,建立一個有序單鏈表的最低時間複雜度是(O(nlogn))

8.將長度為n的單鏈錶鏈接在長度為m的單鏈表後面,其演算法的時間複雜度為O(m)

9.單鏈表中,增加一個頭結點的目的是為了(方便運算的實現)。

10.在一個長度為n的帶頭結點的單鏈表h上,設有尾指標r,則執行(刪除單鏈表中最後一個元素)操作與連結串列的表長有關。

11.對於一個頭指標為head的帶頭結點的單鏈表,判定該表為空表的條件是(head->next==NULL);對於不帶頭結點的單鏈表,則判定空表的條件是(head == NULL)

13.某線性表中最常見的操作是在最後一個元素之後插入一個元素和刪除第一個元素,則採用(僅有尾指標的單迴圈連結串列)儲存方式最省時間。

18.與單鏈表相比,雙鏈表的優點之一是(訪問前後相鄰結點更靈活)。

19.帶空結點的雙迴圈連結串列L為空的條件是(L->prior==L && L->next == L)

20.一個連結串列最常用的操作是在末尾插入結點和刪除結點,則選用(帶頭結點的雙迴圈連結串列)最節省時間。

21.設對n個元素的線性表的運算只有4種:刪除第一個元素;刪除最後一個元素;在第一個元素之前插入新元素;在最後一個元素之後插入新元素,則最好使用(只有頭結點指標沒有尾結點指標的迴圈雙鏈表)。

22.一個連結串列最常用的操作是在最後一個元素之後插入一個元素和刪除第一個元素,則選用(不帶頭結點且有尾指標的單迴圈連結串列)最節省時間。

25.需要分配較大的空間,插入和刪除不需要移動元素的線性表,其儲存結構為(靜態連結串列)。

第3章 棧和佇列

3.1 棧

棧:後進先出(LIFO),又稱為後進先出的線性表

順序棧的實現: 棧頂指標:S.top,初始時設定S.top=-1棧頂元素:S.data[S.top]。 進棧操作:棧不滿時,棧頂指標先加1,再送值到棧頂元素。S.data[++S.top]=x出棧操作:棧非空時,先取棧頂元素值,再將棧頂指標減1。x=S.data[S.top–]棧空條件:S.top==-1;棧滿條件:S.top==Maxsize-1;棧長:S.top+1

注意:如果棧頂指標初始化為S.top=0,即棧頂指標指向棧頂元素的下一個位置,則入棧操作變為S.data[S.top++]=x;出棧操作變為x=S.data[–S.top]。相應的棧空、棧滿條件也會發生變化。

共享棧:利用棧底位置相對不變的特性,可以讓兩個順序棧共享一個一維資料空間,將兩個棧的棧底分別設定在共享空間的兩端,兩個棧頂向共享空間的中間延伸。 兩個棧的棧頂指標都指向棧頂元素,top0=-1時0號棧為空,top1=Maxsize時1號棧為空;僅當兩個棧頂指標相鄰(top1-top0=1)時,判斷為棧滿當0號棧進棧時top0先加1再賦值,1號棧進棧時top1先減1再賦值;出棧時剛好相反,0號棧先出棧再減1,1號棧先出棧再加1. 共享棧是為了更有效地利用儲存空間,其存取資料的時間複雜度均為O(1)。

鏈棧的優點是便於多個棧共享儲存空間和提高其效率,且不存在棧滿上溢的情況。通常採用單鏈表實現,並規定所有操作都是在單鏈表的表頭進行的。這裡規定鏈棧沒有頭結點,Lhead指向棧頂元素。 採用鏈式儲存,便於結點的插入和刪除。對於帶頭結點和不帶頭結點的鏈棧,在具體的實現方面有所不同。

選擇題

1.棧和佇列具有相同的(邏輯結構)。

2.棧是(限制存取點的線性結構)。 A 順序儲存的線性結構(還有鏈棧,非順序儲存) B 鏈式儲存的非線性結構 C 限制存取點的線性結構 D限制存取點的非線性結構(棧肯定是線性結構)

7.設連結串列不帶頭結點且所有操作均在表頭進行,則下列最不適合作為鏈棧的是(只有表頭結點指標,沒有表尾指標的單向迴圈連結串列)。

11.3個不同的元素依次進棧,能得到(5)中不同的出棧序列。1/(n+1) * ((2n)!/(n!*n!))

26.採用共享棧的好處是(節省儲存空間,降低發生上溢的可能)。

27.下列關於棧的敘述中,錯誤的是(I、III、IV) I. 採用非遞迴方式重寫遞迴程式時必須使用棧(反例:斐波那契數列一個迴圈即可) II. 函式呼叫時,系統要用棧儲存必要的資訊 III. 只要確定了入棧次序,即可確定出棧次序(不確定) IV. 棧是一種受限的線性表,允許在其兩端進行操作(一端而已,棧頂)

3.2 佇列

佇列也是一種操作受限的線性表,只允許在表的一端進行插入,而在表的另一端進行刪除。(先進先出的線性表)

佇列的順序實現是指分配一塊連續的儲存單元存放佇列中的元素,並附設兩個指標front和rear分別指示隊頭元素和隊尾元素的位置。設隊頭指標指向隊頭元素,隊尾指標指向隊尾元素的下一個位置(也可以讓rear指向隊尾元素,front指向隊頭元素的前一個位置)。 初始狀態(隊空條件):Q.front==Q.rear == 0. 進隊操作:隊不滿時,先送值到隊尾元素,再將隊尾指標加1。 出隊操作:隊不空時,先取隊頭元素值,再將隊頭指標加1.

迴圈佇列,即把儲存佇列元素的表從邏輯上看成一個環。 初始時:Q.front==Q.rear == 0. 出隊:隊首指標進1,Q.front=(Q.front+1)%MaxSize 入隊:隊尾指標進1,Q.rear=(Q.rear+1)%MaxSize 佇列長度:(Q.rear+MaxSize-Q.front)%MaxSize 出隊入隊時:指標都按順時針方向進1.

為了區分隊空還是隊滿的情況,有三種處理方式: 1)犧牲一個單元來區分隊空和隊滿,隊頭指標在隊尾指標的下一位置作為隊滿的標誌: 隊滿條件為:(Q.rear+1)%MaxSize == Q.front 隊空條件仍為:Q.front==Q.rear 佇列中元素的個數:(Q.rear-Q.front+MaxSize)%MaxSize 2)型別中增設表示元素個數的資料成員: 隊空條件為:Q.size== 0 隊滿條件為:Q.size == Maxsize 3)型別中增設tag資料成員,以區分是隊滿還是隊空。

佇列的鏈式表示稱為鏈佇列,是一個同時帶有隊頭指標和隊尾指標的單鏈表。頭指標指向隊頭結點,尾指標指向隊尾結點,即單鏈表的最後一個結點。 當Q.front==NULL && Q.rear == NULL時,鏈式佇列為空。

雙端佇列是指允許兩端都可以進行入隊和出隊操作的佇列,其元素的邏輯結構仍是線性結構。 輸出受限的雙端佇列:允許在一端進行插入和刪除,但在另一端只允許插入。 輸入受限的雙端佇列:允許在一端進行插入和刪除,但在另一端只允許刪除。

設有一個雙端佇列,輸入序列為1,2,3,4: (1)能由輸入受限的雙端佇列得到,但不能由輸出受限的雙端佇列得到的輸出序列是4,1,3,2 (2)能由輸出受限的雙端佇列得到,但不能由輸入受限的雙端佇列得到的輸出序列是4,2,1,3 (3)既不能由輸入受限的雙端佇列得到,又不能由輸出受限的雙端佇列得到的輸出序列是4,2,3,1

選擇題

11.最適合用做鏈隊的連結串列是(帶隊首指標和隊尾指標的非迴圈單鏈表)。

12.最不適合用做鏈式佇列的連結串列是(只帶隊首指標的非迴圈雙鏈表)。

13.在用單鏈表實現佇列時,隊頭在連結串列的(鏈頭)位置。

14.用鏈式儲存方式的佇列進行刪除操作時需要(頭尾指標可能都要修改)

15.在一個鏈佇列中,假設隊頭指標為front,隊尾指標為rear,x所指向的元素需要入隊,則需要執行的操作為(rear->next=x, x->next=null, rear=x)

16.假設迴圈單鏈表表示的佇列長度為n,隊頭固定在連結串列表尾,若只設頭指標,則進隊操作的時間複雜度為(O(n))

棧和佇列的應用

棧的應用:括號匹配、表示式求值、遞迴 佇列的應用:層次遍歷、計算機系統

選擇題

9.執行(廣度優先搜尋圖)操作時,需要使用佇列作為輔助儲存空間。

3.4 特殊矩陣的壓縮儲存

陣列是由n個相同型別的資料元素構成的有限序列。

陣列的儲存結構: 一維陣列 多維陣列:按行優先和按列優先

矩陣的壓縮儲存: 對稱矩陣、上(下)三角矩陣、對角矩陣

對稱矩陣:將對稱矩陣A[1…n][1…n]存放在一維陣列B[n(n+1)/2]中,只存放主對角線和下三角區的元素。元素下標之間的對應關係如下(陣列下標從0開始): k=i(i-1)/2+j-1(當i≥j,即下三角區和主對角線元素) k=j(j-1)/2+i-1(當i<j,即上三角區元素)

三角矩陣: 將下三角矩陣A[1…n][1…n]存放在一維陣列B[n(n+1)/2+1]中,儲存下三角區和主對角線上的元素,以及儲存對角線上方的常量一次。元素下標之間的對應關係如下(陣列下標從0開始): k=i(i-1)/2+j-1(當i≥j,即下三角區和主對角線元素) k=n(n+1)/2(當i<j,即上三角區元素)

上三角矩陣A[1…n][1…n]存放在一維陣列B[n(n+1)/2+1]中,儲存上三角區和主對角線上的元素,以及儲存對角線下方的常量一次。元素下標之間的對應關係如下(陣列下標從0開始): k=(i-1)(2n-i+2)/2+(j-i)(當i≤j,即上三角區和主對角線元素) k=n(n+1)/2(當i>j,即下三角區元素)

三對角矩陣:三對角矩陣3條對角線上的元素Ai,j在一維陣列B中存放的下標為k=2i+j-3;反之,若已知三對角矩陣中某元素Ai,j在一維陣列B中存放於第k個位置,則可求得i=(k+1)/3+1(向下取整),j=k-2i+3.

稀疏矩陣:將非零元素及其相應的行和列構成一個三元組(行標,列標,值)。

選擇題

注意:陣列下標從0開始還是從1開始,按列優先儲存還是按行優先儲存

9.適用於壓縮儲存稀疏矩陣的兩種儲存結構是(三元組表和十字連結串列

第4章 樹與二叉樹