考研數據結構複試題目整理

數據結構複試題目自整理

說複試題目過於牽強,只是自己整理的一些知識點而已,爲了便於理解和背誦,有些部分定義和說明儘量簡明扼要,如有錯誤請多多指教!(不可轉載)

只涉及簡答形式,代碼未總結(有用點點贊啊啊我升到3級就可以自定義標籤了謝謝~)

1.大O什麼意思?

在時間複雜度中,一個算法中所有語句被重複執行的次數記爲T(n),時間複雜度用來分析T(n)的數量級,也就是算法中基本語句被執行的次數,O的含義就是表示基本語句的數量級也就是算法的數量級。
在空間複雜度中,同樣用O來表示基本運算所耗費的存儲空間。

2.簡述數據結構的三要素

邏輯結構:從邏輯上描述數據,即數據之間的邏輯關係。(線性結構和非線性結構)
物理結構:數據在計算機內的存儲方式(順序存儲,鏈式存儲,索引存儲,散列存儲)
數據的運算:數據的運算包括數據的定義與實現,運算的定義是針對邏輯結構的,指出運算的功能;運算的實現是針對存儲結構的,指出運算的具體操作步驟。

3.循環比遞歸效率高嗎?

並不能絕對的說循環比遞歸效率高。
遞歸的優點是:代碼簡潔清晰,容易檢查代碼的正確性。缺點是:當遞歸調用的次數很多時,對執行效率會有一定的影響。
循環的優點是:結構簡單,速度快;缺點是:並不能解決所有問題,有些問題適合用遞歸來解決而不適合用循環。

4.簡述各存儲結構

順序存儲:採用一組連續的存儲空間存儲數據。
優點:簡單,可以實現隨機存取,元素佔用最少的存儲空間。
缺點:只能使用連續的存儲單元,會產生較多的外部碎片。
鏈式存儲:數據的存儲空間是離散的,藉助元素中的指針來表示元素之間的邏輯關係。
優點:不會產生外部碎片,能充分利用所有存儲單元。
缺點:只能順序存取,每個元素因爲存儲指針而佔用額外的存儲空間。
索引存儲:在存儲元素數據的同時還建立附加的索引表。
優點:檢索速度快。
缺點:索引表會佔用額外的存儲空間。
散列存儲:根據元素的關鍵字直接得出元素的存儲地址。
優點:檢索,增加,刪除元素的速度都很快。
缺點:散列函數選擇不好可能會出現元素單元的衝突,而解決衝突需要額外的開銷。

5.簡述算法的特性?

(1)有窮性:一個算法必須在執行有窮步後結束。
(2)確定性:算法中的每條指令必須由確切的含義,不能有二義性。
(3)可行性:算法中描述的操作能夠通過有限次的基本運算來實現。
(4)輸入:一個算法必須有0個或者有限個輸入。
(5)輸出:一個算法必須有1個或者有限個輸出。
一個好的算法應該保證:
正確性(算法能夠正確的解決問題),可讀性(易於人們理解),健壯性(輸入非法數據時算法能夠進行處理,不會出現莫名其妙的結果)。

6.順序表與鏈表的比較

(1)存取方式:順序表可以順序存取,隨機存取,鏈表是能順序存取。
(2)邏輯結構和物理結構上:順序存儲是邏輯上相鄰的元素物理上也相鄰,鏈式存儲是邏輯上相鄰的元素物理上不一定相鄰。
(3)插入刪除操作:順序表插入刪除操作平均需要移動半個表長的元素,鏈表只需要修改相應的指針即可。
(4)空間分配:順序存儲在靜態存儲分配下需要預先分配足夠大的空間,動態存儲分配雖然可以擴充空間,但是需要移動大量的元素;鏈式存儲空間在需要時申請即可。

7.頭指針與頭結點的區別

頭指針:是指向第一個節點存儲位置的指針,具有標識作用,頭指針是鏈表的必要元素,無論鏈表是否爲空,頭指針都存在。
頭結點:是放在第一個元素節點之前,便於在第一個元素節點之前進行插入和刪除的操作,頭結點不是鏈表的必須元素,可有可無,頭結點的數據域也可以不存儲任何信息。

8.棧和隊列的區別

隊列和棧都是操作受限的線性表,隊列是隻允許在一段插入,在另一端刪除的線性表,進入隊列的元素按先入先出的原則進行處理;棧是指能在表尾進行插入和刪操作的線性表,對於插入到棧的元素按先進後出的規則進行處理,插入和刪除操作都在棧頂進行。

9.共享棧

利用棧底位置相對不變的特性,可以讓兩個順序棧共享一個一維數組空間,將兩個棧的棧底設在共享空間的兩端,兩個棧頂向共享空間的中間延伸,這樣能夠更有效的利用存儲空間。

10.隊列在計算機系統中的應用

隊列可以用於層次遍歷和廣度優先遍歷
1.可以解決主機與外部設備之間速度不匹配的問題:以打印機爲例,設置一個打印數據緩衝區數據按隊列存儲,主機先向緩衝區中寫入數據,打印機按先進先出原則一次取出數據並打印。
2.解決多用戶引起的資源競爭問題:以CPU資源的競爭爲例,多個用戶提出對CPU是使用請求,系統按照用戶請求在時間上的先後順序,排成隊列將CPU依次分配。

11.串的存儲結構

(1)定長順序存儲表示:採用一組連續的存儲空間存儲串的字符序列;
(2)堆分配存儲表示:依然採用一組連續的存儲空間存儲串的字符序列,但是存儲空間是在運行過程中動態分配的。

12.簡述KMP算法

思想:如果已匹配相等的前綴序列中有某個後綴正好是子串的前綴,就可以將子串向後滑動到與這些後綴相匹配的位置。

13.名詞解釋,滿二叉樹,完全二叉樹,二叉排序樹,平衡二叉樹。

滿二叉樹:高度爲H,結點數爲2^H-1的二叉樹爲滿二叉樹。
完全二叉樹:除最後一層外,其餘各層的節點數量達到最大值,並且最後一層只能在右側缺少節點。
二叉排序樹:左子樹上所有的關鍵字均小於根結點,右子樹上所有關鍵字均大於根結點。左子樹和右子樹又分別是一棵二叉排序樹。
平衡二叉樹:樹中每一個結點的左子樹,右子樹高度之差的絕對值小於等於1

14.二叉樹的存儲結構

順序存儲:用一組連續的地址單元自上到下,自左到右的存儲完全二叉樹的結點元素。
鏈式存儲:採用二叉鏈表來存儲樹的每個節點。

15.線索二叉樹

將二叉鏈表中的空指針改成指向前驅節點或後繼的線索。線索鏈表解決了無法直接找到該結點在某種遍歷序列中的前驅和後繼結點的問題,解決了 二叉鏈表找左、右孩子困難的問題。

16.樹的存儲結構

雙親表示法:採用一組連續的存儲空間存儲每個結點,同時在每個結點後面增設一個僞指針指向其雙親節點。
孩子表示法:將每個結點的孩子結點用單鏈錶鏈接起來形成一個線性結構。
孩子兄弟表示法:以二叉鏈表作爲樹的存儲結構,其左指針指向第一個孩子結點,右指針指向其相鄰的兄弟結點。可以方便地實現樹轉換爲二叉樹的操作,易於查 找結點的孩子等,但缺點是從當前結點查找其雙親結點比較麻煩。

17.哈夫曼樹

權:樹中的結點往往被賦予一個有意義的數值稱爲該結點的權。
結點的帶權路徑長度:從樹的根到任意節點的路徑長度與該結點的權值之積稱爲該結點的帶權路徑長度。
樹的帶權路徑長度:樹中所有葉結點的帶權路徑之和爲該樹的帶權路徑長度。
哈夫曼樹:帶權路徑長度最小的樹爲哈夫曼樹。

18.構造哈夫曼樹的算法

將樹中的每個結點都看成一個獨立的二叉樹構成森林F,從F中選擇根結點最小的兩棵樹構成一棵新的二叉樹,二叉樹的根結點爲兩個結點之和,並將這兩個樹從F中刪除,將新構成的樹併入F中,重複上述過程,直到F中只剩下一個樹。
特點:哈夫曼樹中不存在度爲1的結點,權值越小的結點距離根結點的路徑長度越大。

19.圖的名詞解釋

連通圖:在無向圖中如果兩頂點之間有路徑存在,就稱這兩個頂點是連通的。如果無向圖中任意兩個頂點是連通的,就稱圖爲連通圖。
極大連通子圖(連通分量):該連通子圖包含所有的邊。
極小連通子圖:在保證連通的情況邊最少的子圖。
強連通圖:在有向圖中,如果頂點m到頂點n有路徑存在且n到m也有路徑存在,就稱這兩個頂點是強連通的。圖中任何兩個頂點都是強連通的,該圖就是強連通圖。
強連通分量:有向圖中的極大強連通子圖爲強連通分量。
生成樹:連通圖中包含所有頂點的極小連通子圖。
網:在圖中每條邊都可以標上具有某個意義的數值,稱爲該邊的權值。邊上帶權值得圖爲網,

20.圖的存儲方式

鄰接矩陣法:用一個一維數組存儲圖的頂點信息,用二維數組存儲各頂點的鄰接關係。存儲頂點鄰接關係的二維數組稱爲鄰接矩陣。
鄰接表法:圖中每個頂點與其有鄰接關係的頂點拉成一個單鏈表,每個頂點都有一個單鏈表。
十字鏈表法:十字鏈表法是有向圖的一種鏈式存儲結構。在十字鏈表中,有向圖中的每一條弧都有一個對應的節點,每個頂點都有對應的一個節點。
鄰接多重表法:

21.廣度優先搜索

類似於層次遍歷,先訪問起始頂點,在訪問與其相鄰的所有頂點,再順序訪問與這些頂點相鄰的頂點,重複上述過程,知道圖中所有頂點都被訪問過爲止。

22.深度優先搜索

類似於先序遍歷,從起始頂點出發,先訪問與其相鄰的頂點,再訪問與該頂點相鄰且未被訪問過的頂點,重複上述步驟,當與其相鄰的所有頂點都被訪問過,依次回退曾經訪問過的頂點,若某個頂點還有與其相鄰且未被訪問過的頂點,則從該點開始重複上述過程,直到所有頂點均被訪問過。

23.最小生成樹(普里姆算法,克魯斯卡爾算法)

最小生成樹:包含圖中所有的頂點且含有最少的邊且不構成迴路。

24.普里姆算法

從圖中任一頂點出發,構成一棵樹,然後從與這棵樹相鄰的邊中選擇最小的邊,並將這條邊和所連接的頂點併入樹中,在選擇與該樹相鄰的最小邊且不構成迴路,將邊和頂點併入,重複上述過程,直到所有頂點均已併入樹中。

25.克魯斯卡爾算法

假設圖中每個頂點自成一個連通分量,按照圖中邊的權值由小到大的順序,不斷選取未被選取過且權值最小的邊,若邊的兩個頂點在不同的連通分量上,就將該邊及其頂點併入生成樹中,如此重複,直到所有頂點均已併入。

26.最短路徑

當圖是帶權圖時,把從一個頂點到圖中任意一個頂點的路徑所經過的邊的權值之和稱爲該路徑的帶權路徑長度。把帶權路徑最短的那條路徑稱爲最短路徑。

27.迪傑斯特拉算法

設有兩個頂點集S和T,S中存放當前已經找到最短路徑的頂點,T中存放圖中剩餘頂點,開始時S中只有源點,然後不斷地從集合T中選取到源點的路徑長度最短的頂點併入集合S中,集合S每併入一個頂點就要修改源點到集合T中頂點的最短路徑長度值,不斷重複上述過程,直到集合T中頂點全部併入S。

28.弗洛伊德算法

總結的不標準先不放了

29.拓撲排序

AOV網:用頂點表示活動,有向邊表示活動之間的關係的有向圖記爲AOV網。
在AOV網中選擇一個沒有前驅的頂點輸出,並刪除該頂點和以該頂點爲起點的所有有向邊,重複上述過程直到AOV網爲空或者不存在無前驅的頂點爲止。

30.關鍵路徑

在帶權有向圖中,用頂點表示時間,以有向邊表示活動,以邊上的權值表示完成該活動所需要的時間,稱爲AOE網。

AOV網與AOE網的區別:

AOV網和AOE網都是有向無環圖,區別在於它們的頂點和邊所代表的含義是不同的,AOE網中的邊有權值,AOV網的邊無權值,僅代表活動之間的關係。
關鍵路徑:從源點到匯點的所有路徑中,具有最大路徑長度的路徑稱爲關鍵路徑,在這條路徑上活動稱爲關鍵活動,完成整個工程的最短時間就是關鍵路徑的長度。

31.查找

靜態查找:若一個查找表的操作無需動態的修改表,稱爲靜態查找。
動態查找:需要動態的插入和刪除的查找表稱爲動態查找表。
平均查找長度:所有查找過程中進行關鍵字比較次數的平均值。

32.順序查找

從線性表的一端開始,逐個比較關鍵字的值是否滿足查詢條件。
優點:對數據元素的存儲沒有要求,順序存儲或鏈式存儲均可。
缺點:平均查找長度大,效率低。

33.折半查找

若順序表有序,先將關鍵字與表中間元素比較,若相等則查找成功,否則在除中間元素以外的前半部分或後半部分進行同樣的查找,如此重複直到查找成功或者確定表中沒有要查找的元素,查找失敗。
優點:比順序查找效率高
缺點:查找表必須有序且必須採用順序存儲結構。

34.分塊查找

將查找表分爲若干個子塊,塊內元素可以無序,各塊之間必須有序,也就是說,第一個塊內最大的關鍵字要小於第二個塊內所有記錄的關鍵字,第二個塊內最大的關鍵字要小於第三個塊內所有記錄的關鍵字以此類推,再建立一張索引表,表項中存放每個塊的最大關鍵字和第一個元素的地址。
查找步驟爲:
(1)在索引表中確定待查記錄所在的塊,可以順序查找也可以折半查找。
(2)在塊內順序查找。
吸取了順序查找和折半查找各自的優點。

35.B樹

B樹中所有結點的孩子樹的最大值爲B樹的階,用m表示,一棵m階B樹的特點爲:
(1)B樹中每一個結點最多有m棵子樹,即最多有m-1個關鍵字。
(2)B樹除根結點外的所有非葉結點最少有m/2(向上取餘)棵子樹,即m/2(向上取餘)-1個關鍵字。
(3)所有的葉節點都出現在同一層次且不帶信息。
B樹的查找:分兩步(1)在B樹中找結點(2)在節點內找關鍵字。由於B樹常存放在磁盤上,所以第一次查找操作是在磁盤上進行的,而後一個查找操作是在內存上進行的,即在找到目標結點之後,先將結點讀入內存,再對結點內採用順序查找或折半查找。
B樹的插入:(1)定位(2)插入(若被插入結點內關鍵字個數超出,就進行分裂)
B樹的刪除:(1)直接刪除(2)兄弟夠借(3)兄弟不夠借(要進行合併)

36.m階B樹與B+樹的比較

m 階的B+樹與m 階的B 樹的主要差異如下:

  1. 在B+樹中,具有n 個關鍵字的結點只含有n 棵子樹,即每個關鍵字對應一棵子樹;而在 B 樹中,具有n 個關鍵字的結點含有n+1棵子樹。
  2. 在B+樹中,葉結點包含信息,所有非葉結點僅起索引作用,非葉結點中的每個索引項只
    含有對應子樹的最大關鍵字和指向該子樹的指針。 在B樹中頁結點不攜帶任何信息。
  3. 在B+樹中,葉結點包含了全部關鍵字,即在非葉結點中出現的關鍵字也會出現在葉結點
    中;而在B 樹中,葉結點包含的關鍵字和其他結點包含的關鍵字是不重複的。

37.散列表

散列函數:一個把查找表中關鍵字映射成爲該關鍵字對應地址的函數。
散列表:根據關鍵字直接進行訪問的散列表,建立了關鍵字與存儲地址的直接映射關係。
散列函數的構造方法:
(1)直接定址法:直接取關鍵字的某個線性函數值爲其存儲地址。
(2)除留餘數法:假定散列表表長爲m,取一個不大於m且最接近m的質數p,通過關鍵字取餘p來得到關鍵字的存儲地址。
(3)平方取中法:取關鍵字平方的中間幾位作爲該關鍵字的存儲地址。
解決衝突的辦法:
(1)開放地址法:
1.線性探測法:衝突發生時順序查看錶中下一個單元,直到找出一個空閒單元爲止。(可能會造成大量元素在相鄰的散列地址上堆積,降低查找效率)
2.平方探測法:令增量序列爲0,1的平方,-1的平方……(能夠避免出現堆積問題,但是不能夠探測到散列表中的所有單元)
3.雙散列法:使用兩個散列函數,當第一個散列函數出現衝突時,就選用第二個散列函數。
(2)拉鍊法:把所有的同義詞連接到一個線性鏈表中,這個線性鏈表由散列地址唯一標識。

38.排序

內部排序:排序期間元素全部存放在內存中。(插入,交換,選擇,歸併,基數)
外部排序:排序期間元素無法同時存放在內存中,必須在排序期間根據要求不停地在內,外存移動。(多路歸併)

39.插入排序

直接插入排序:每次將一個待排序的記錄按其關鍵字的大小插入到已排好序的子序列中。(1.從前面的有序子表中查出待插入元素應該插入的位置2.將已排序的記錄逐步向後移動,給待插入元素騰出位置,並將待插入元素複製到插入位置。 適用順序存儲/鏈式存儲)

折半插入排序:如果是順序存儲的線性表,可以通過折半查找的方式來查找待插入元素在有序子序列的位置。確定待插入位置之後,可以統一的向後移動位置。

希爾排序:將待排序列按相隔某個增量分割成若干個子序列,對各個子序列進行直接插入排序,逐漸縮小增量,重複上述步驟,直到序列基本有序,再對全體記錄進行一次直接插入排序。

40.交換排序

冒泡排序:從前到後(從後往前)依次兩兩比較相鄰元素的值,若爲逆序,就交換元素,每一趟排序完成之後,就有一個元素被放在最終位置上,重複上述步驟,當一趟排序不發生任何元素的交換爲止。
快速排序:每次從待排序列中選擇一個元素作爲樞軸(通常是序列的首元素),把比樞軸小的元素放前面,比樞軸大的元素放後面,最後確定樞軸元素的最終位置並將樞軸放入,再對樞軸前後得到的子序列再重複上述步驟,直到每部分只有一個元素或爲空爲止,則所有元素放在最終位置上。

41.選擇排序

簡單選擇排序:每趟排序選擇關鍵字最小的元素與序列前面的元素進行交換,每次排序均可確定一個元素的最終位置。
堆排序:先將待排元素建成初始堆,以大根堆爲例,堆頂元素爲最大值,將其輸出後,把堆底元素送入堆頂,此時堆不滿足大根堆的性質,將堆頂元素向下調整(從堆的最後一個非葉子節點開始,從左到右,從下到上的順序進行調整),成爲大根堆之後再輸出堆頂元素,重複上述過程,直到輸出所有元素。

42.歸併排序

“歸併”:就是將兩個或兩個以上的有序表組成一個新的有序表。
假定待排序表有n個記錄,將其視爲n個有序的子表,然後兩兩歸併得到n/2個有序子表,再進行兩兩歸併,直到合併成一個長度爲n的有序表爲止。

43.基數排序

創建0~9的十個數組,將待排序表的所有元素先按個位進行分類,將分類後的元素按索引大小取出形成新的隊列,再對隊列按十位,百位的順序進行分類,重複上述過程,最後形成一個有序序列。

44.選取排序算法需要考慮的因素

(1)待排元素的數目;
(2)穩定性的要求;
(3)元素本身信息量的大小;
(4)關鍵字的結構及其分佈情況;
若n較小,可直接採用直接插入排序或者簡單選擇排序。由於直接插入排序比簡單選擇排序移動的元素要多,所以當元素本身信息量比較大時可選用簡單選擇排序。
若待排序表已基本有序可以選用直接插入排序或者冒泡排序。
當n比較大時,可以選用快速排序、堆排序、歸併排序。快速排序被認爲是當前基於比較的內部排序中最好的排序方法,當待排序表記錄隨機分佈時,使用快速排序速度最快。堆排序所用存儲空間少於快速排序,且不會出現快速排序的最壞情況,這兩種算法都是不穩定的,若要穩定排序則選用歸併排序算法。

45.外部排序

採用多路歸併法,包括兩個相對獨立的階段:
(1)根據內部緩衝區的大小,將待排文件分成若干個大小合適的子文件,將子文件帶入內存採用內部排序算法排序完成後再寫回外存。
(2)對這些歸併段進行逐趟歸併,使歸併段逐漸由小到大,直到得到整個有序文件爲止。

46.提高外部排序算法的效率

由於待排文件無法全部放入內存,所以排序期間必須要頻繁的進行內外存之間數據的交換,這會耗費大量的時間。所以可以通過增加歸併路數來減少歸併趟數,進而減少I/O次數。而增加歸併路數又會增加內部排序的時間,所以引入了敗者樹。
增加初始歸併段個數,並且不受內存空間的限制,引入了置換-選擇算法。
文件經過置換-選擇算法之後得到的是長度不同的初始歸併段,如何組織長度不等的出使歸併段的歸併順序,使得I/O次數最少,就引入了最佳歸併樹。

47.敗者樹(大的爲失敗者,小的爲勝利者)

可視爲一棵完全二叉樹,每個葉結點存放各歸併段在歸併過程中參加比較的記錄,非葉結點用來記錄左右子樹中的“失敗者”,勝利者繼續向上比較直到根節點。輸出最後的勝利者。

48.置換選擇算法

根據緩衝區的大小,由外存讀入記錄,當記錄充滿緩衝區時,選擇最小的輸出,其空缺位置由下一個記錄來取代,輸出記錄稱爲當前初始歸併段的一部分,如果新輸出的記錄比新建立歸併段最大的記錄小,就不能成爲該歸併段的一部分,只能成爲下一個歸併段的選擇。重複上述步驟,直到緩衝區中所有記錄都比當前歸併段最大記錄小時,就生成了一個初始歸併段,用同樣的方法繼續生成下一個歸併段,直到全部記錄都處理完畢爲止。

49.最佳歸併樹

對於K路歸併算法,可用構造K叉哈夫曼樹的方法來構造最佳歸併樹。

整理不易,請點點贊生生級好吧~

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章