考研複試問答(數據結構部分)

轉載請註明出處:https://blog.csdn.net/xuezoutianya/article/details/106038718

1、算法的特徵?
    答:有窮性、確定性、可行性、輸入、輸出

2、時間複雜度的概念?
    答:時間複雜度是算法中所有語句的頻度之和的數量級,也是算法中基本運算的頻度的數量級。

3、什麼是原地工作?
    答:原地工作指算法所需的輔助空間爲常量。

4、線性表的定義?
    答:線性表是具有相同類型的n個數據元素的有限序列。

5、單鏈表的建立過程?
    答:頭插法:待插入的結點next域指向頭結點的下一個結點,頭結點的next域指向待插入的結點
        尾插法:(設置一個尾指針指向尾結點)尾結點的next域指向待插入的結點,尾指針指向待插入的結點

6、爲什麼單鏈表要加頭結點?
    答:1.方便單鏈表的特殊操作(如在第一個結點之前插入結點),保證單鏈表操作的統一性
        2.帶頭結點的單鏈表無論是否爲空,頭指針始終指向頭結點,保證對空表和非空表的操作統一性

7、爲了區分循環隊列的隊空和隊滿,有哪些方法?
    答:1.犧牲一個單元來區分隊空和隊滿,隊空條件:front==rear;隊滿條件:(rear+1)%MaxSize==front
        2.類型中增加一個表示元素個數的數據成員,隊空條件:size==0;隊滿條件:size==MaxSize
        3.類型中增加一個用於標記的數據成員,若因刪除導致front==rear,則隊空;若因插入導致front==rear,則隊滿

8、樹和二叉樹的概念?
    答:非空樹:1.有且僅有一個根結點 2.除根以外的結點可分爲多個互不相交的有限集合,其中每個集合本身又是一棵樹,稱爲根節點的子樹。
        二叉樹:1.可以爲空二叉樹 2.由一個根結點和兩個互不相交的根的左子樹和右子樹組成,且左、右子樹也都是二叉樹。

9、二叉樹和度爲2的有序樹的區別:
    答:1.度爲2的樹至少有3個結點,而二叉樹可以爲空。
        2.度爲2的有序樹的孩子結點的左右次序是相對於另一孩子結點而言的,而二叉樹的孩子結點次序不是相對於另一結點而言,是確定的。

10、二叉樹怎麼存儲?
    答:1.順序存儲:用一組地址連續的存儲單元依次自上而下、自左向右存儲完全二叉樹上的結點信息。這種方式僅適用於完全二叉樹。
        2.鏈式存儲:用一個鏈表來存儲一棵二叉樹,二叉樹中的每個結點用鏈表的一個鏈結點來存儲。含有n個結點的二叉鏈表中有n+1個空鏈域。

11、完全二叉樹的定義?
    答:高度爲h,有n個結點的二叉樹,每個結點都與高度爲h的滿二叉樹中編號爲1~n的結點一一對應時,稱爲完全二叉樹。

12、二叉樹的層次遍歷過程?
    答:1.把根結點入隊
        2.把隊頭元素出隊,訪問這個元素
        3.依次把該元素的左、右孩子入隊
        4.重複2,3過程,直到隊列爲空

13、線索二叉樹的概念及構造過程?
    答:概念:加上線索的二叉樹成爲線索二叉樹。
        線索化:在遍歷二叉樹的過程中,檢查當前結點左、右指針域是否爲空,若爲空,將它們改爲指向前驅結點或後繼結點的線索。

14、樹的存儲結構有哪些?樹、森林與二叉樹怎麼轉換?
    答:存儲結構:雙親表示法(鍵值對形式,鍵爲結點編號,值爲父結點編號),孩子表示法(指針數組形式,將當前結點的所有孩子結點用鏈表串起來),孩子兄弟表示法(左孩子右兄弟)
        樹轉換爲二叉樹:每個結點左指針指向它的第一個孩子結點,右指針指向它在樹中的相鄰兄弟結點,即“左孩子右兄弟”。
        二叉樹轉換爲樹:若二叉樹非空,則根結點及其左子樹爲第一棵樹的二叉樹形式,右子樹可視爲一個除了第一棵樹外的森林轉換後的二叉樹,應用同樣的方法,直到最後產生一棵沒有右子樹的二叉樹爲止。

15、二叉排序樹的定義?簡述其原理及查找過程?
    答:1.若左子樹非空,則左子樹上所有結點關鍵字值均小於根節點的關鍵字值。
        2.若右子樹非空,則右子樹上所有結點關鍵字值均大於根節點的關鍵字值。
        3.左、右子樹也都是二叉排序樹。
        查找過程:若查找的關鍵字等於根結點的關鍵字值,成功。否則,若小於根結點的關鍵字值,遞歸查左子樹。若大於根結點的關鍵字值,遞歸查右子樹。若子樹爲空,查找不成功。

16、什麼是平衡因子?什麼是平衡二叉樹?
    答:某結點的平衡因子是該結點左子樹與右子樹的高度差。
        平衡二叉樹又被稱爲AVL樹,它的左右兩個子樹都是平衡二叉樹且左右兩個子樹的高度差的絕對值不超過1。

17、哈夫曼樹的概念以及哈夫曼樹的構造?哈夫曼樹的應用?前綴編碼和哈夫曼編碼的關係?
    答:概念:哈夫曼樹是帶權路徑長度最小的二叉樹(樹的帶權路徑長度爲所有葉結點的帶權路徑長度之和)
        構造過程:    1.將n個結點分別作爲n棵僅含一個結點的二叉樹,構成森林F
                    2.構造一個新結點,從F中選取兩棵根結點權值最小的樹作爲新結點的左右子樹,並且將新結點的權值置爲左右子樹上根結點的權值之和。
                    3.從F中刪除剛纔選出的兩顆樹,同時將新得到的樹加入F中。
                    4.重複2,3過程,直到F中只剩下一棵樹爲止。
        應用:哈夫曼編碼(長度最短的前綴編碼)。

18、圖的相關概念?
    答:有向圖:若邊集是有向邊的有限集合,則圖爲有向圖
        無向圖:若邊集是無向邊的有限集合,則圖爲無向圖
        簡單圖:1.不存在重複邊 2.不存在頂點到自身的邊
        簡單迴路/簡單環:除了第一個頂點和最後一個頂點之外,其餘頂點不重複出現的迴路,稱爲簡單迴路/簡單環。
        完全圖:任意兩個頂點之間都存在邊
        連通:若無向圖中從頂點v到頂點w有路徑存在,則稱v和w是連通的
        連通圖:若無向圖中任意兩個頂點都是連通的,則稱圖爲連通圖
        連通分量:無向圖中的極大連通子圖稱爲連通分量
        生成樹:包含圖中所有頂點的一個極小連通子圖

19、樹和圖的區別?
    答:1.樹是圖的子集
        2.非空樹有且僅有一個根結點,且樹的非根節點必定有一個父節點,圖沒有
        3.樹是層次結構,圖是網絡結構

20、圖的存儲方式有哪些?
    答:鄰接矩陣,鄰接表,十字鏈表(有向圖),鄰接多重表(無向圖)。
        (圖的鄰接矩陣表示是唯一的,且無向圖的鄰接矩陣一定是一個對稱矩陣)

21、廣度優先搜索的過程?深度優先搜索的過程?兩者的時間複雜度?
    答:廣度搜索的過程:首先訪問起始頂點v,接着由v出發,依次訪問v的各個未訪問過的鄰接頂點w1,w2,...,wi,然後依次訪問w1,w2,...,wi的所有未被訪問過的鄰接頂點。
        深度搜索的過程:首先訪問起始頂點v,然後由v出發,訪問與v鄰接且未被訪問的任一頂點w1,再訪問與w1鄰接且未被訪問的任一頂點w2...重複上述過程。
        時間複雜度:鄰接矩陣O(V^2),鄰接表O(V+E)

22、圖的遍歷序列是否唯一?
    答:由於圖的鄰接矩陣表示唯一,鄰接表表示不唯一,所以基於鄰接矩陣的遍歷所得到的dfs序列和bfs序列是唯一的,基於鄰接表的遍歷所得到的dfs序列和bfs序列是不唯一的。

23、非連通圖如何訪問每一個結點?
    答:對每個連通分量調用一次DFS/BFS。

24、什麼是最小生成樹?最小生成樹有什麼性質?
    答:概念:最小生成樹是邊的權值之和最小的生成樹。
        性質:    1.最小生成樹不是唯一的
                2.最小生成樹的邊的權值之和總是唯一的
                3.最小生成樹的邊數爲頂點數減1

25、怎麼構建一棵最小生成樹?最小生成樹應用在有向圖還是無向圖中?
    答:普里姆算法:先將圖中的任意一個頂點放進集合中,然後比較所有集合內的頂點與集合外的頂點連成的線的權值,把那個能連權值最小的線的頂點和相應的邊也放進集合裏面。重複此步驟,直到所有頂點都加入集合。
        克魯斯卡爾算法:先在圖中建立一個空集,然後在集合外選擇權值最小的邊,若這條邊加入集合後不構成迴路則將該邊和邊兩端的頂點也加入集合。重複此步驟,直到集合中有n-1條邊。
        有向圖的最小生成樹叫最小樹形圖,有避圈法(Kruskal算法)與破圈法,破圈法:在圖中找一個迴路,保證圖連通的前提下去掉迴路中權值最大的的邊,重複上述過程,直到圖保持連通且沒有迴路。

26、迪傑斯特拉算法的過程?
    答:先將圖中的某個頂點作爲源點放進集合中,然後比較源點到集合外的各個頂點的當前最短路徑,把本輪求得的當前最短路徑的頂點放進集合,然後更新源點到集合外的各個頂點的當前最短路徑。重複上述過程,直到所有頂點都加入集合。
    (新加入一個未收錄的頂點時,源點與集合內的頂點的當前最短路徑不會更新,即源點與集合內的頂點的當前最短路徑不會因爲新收錄頂點而變得更短)

27、什麼是AOV網?什麼是拓撲排序?什麼是AOE網?什麼是關鍵路徑?
    答:AOV網:即頂點表示活動的網絡(有向無環圖中,頂點表示活動,有向邊表示活動之間的前驅後繼關係)
        拓撲排序:1.由有向無環圖的頂點組成的序列 2.每個頂點出現且只出現一次 3.若頂點A排在頂點B之前,則不存在從頂點B到頂點A的路徑
        AOE網:即用邊表示活動的網絡(帶權有向圖中,頂點表示事件,有向邊表示活動,邊的權值表示完成活動的開銷)
        關鍵路徑:AOE網(用邊表示活動的網絡)中,從源點到匯點的所有路徑中具有最大路徑長度的路徑稱爲關鍵路徑

28、有哪些查找方法?
    答:1.線性結構有順序查找,折半查找,分塊查找(索引順序查找)
        2.樹形結構有二叉排序樹,平衡二叉樹,b樹,b+樹
        3.散列結構有散列表

29、折半查找的基本思路?適用範圍?判定樹高度
    答:基本思路:首先將給定值與表中間位置元素比較,若相等,則查找成功,返回該元素存儲位置;若不等,則所需查找的元素只能在中間元素以外的前半部分或後半部分,然後在縮小的範圍內繼續上述查找過程,重複上述過程,直到找到爲止,或確定表中沒有所需要查找的元素,則查找不成功,返回查找失敗的信息。
        適用範圍:該查找僅適用於線性表的順序存儲結構,且要求元素按關鍵字有序排列。
        判定樹高:log2(n+1)向上取整

30、分塊查找的分塊思路?分塊查找中索引表的組成?分塊查找的過程?
    答:分塊思路:塊內無序,塊間有序
        索引表項:key是各塊最大關鍵字,value是各塊中第一個元素的地址
        查找過程:第一步是順序查找或者折半查找索引表確定待查元素所在的塊;第二步是在塊內順序查找

31、b樹和b+樹的區別?
    答:1.b+樹結點的子樹個數等於關鍵字個數,b樹結點的子樹個數爲關鍵字個數加一
        2.b+樹只有葉結點包含信息,非葉結點起索引作用;b樹的葉結點不含信息,非葉結點含信息
        3.b+樹葉結點和非葉結點關鍵字可重複,b樹中所有結點關鍵字不重複
        4.b+樹的相鄰葉結點按大小順序相互鏈接,b樹沒有

32、什麼是哈希表?什麼是哈希衝突?處理衝突的方法?什麼是裝填因子?什麼是堆積?
    答:哈希表是根據關鍵字而直接進行訪問的數據結構。
        哈希衝突是散列函數可能會把兩個或兩個以上的不同關鍵字映射到同一地址的情況。
        常用散列函數:    1.直接定址法
                        2.除留餘數法
                        3.數字分析法
                        4.平方取中法
                        5.摺疊法
        處理衝突的方法:1.開放定址法(線性探測法,平方探測法,再散列法,僞隨機序列法)
                        2.拉鍊法
        裝填因子:散列表的裝填因子定義爲:α= 填入表中的元素個數 / 散列表的長度
        堆積:開放定址法中同義詞衝突的探查序列和非同義詞之間不同的探查序列交織在一起

33、各種排序的時間複雜度,空間複雜度和穩定性?
    答:                        時間複雜度                        空間複雜度    是否穩定
    直接插入排序    最好O(n),平均O(n^2),最壞O(n^2)                O(1)        是
    冒泡排序        最好O(n),平均O(n^2),最壞O(n^2)                O(1)        是
    簡單選擇排序    最好O(n^2),平均O(n^2),最壞O(n^2)                O(1)        否
    希爾排序                                                        O(1)        否
    快速排序        最好O(nlogn),平均O(nlogn),最壞O(n^2)            O(logn)        否
    堆排序            最好O(nlogn),平均O(nlogn),最壞O(nlogn)        O(1)        否
    2路歸併排序        最好O(nlogn),平均O(nlogn),最壞O(nlogn)        O(n)        是
    基數排序        最好O(d(n+r)),平均O(d(n+r)),最壞O(d(n+r))        O(r)        是

34、快速排序的原理,運用了什麼思想?
    答:1.在待排序表L中任取一個元素作爲基準,通過一趟排序將待排序表劃分爲兩個部分L1和L2,使得L1中的所有元素小於基準元素,L2中的所有元素大於等於基準元素,則基準元素放在了其最終位置上。
        2.然後遞歸地對兩個子表上述過程,直到每部分只有一個元素或空爲止,即所有元素放在了其最終位置上。
        快速排序運用了分而治之地思想(分治法)。
        
35、什麼是堆?堆的構造過程?
    答:概念:堆是一種數據結構,可以把堆看成一個完全二叉樹,並且這個完全二叉樹滿足:任何一個非葉節點的值都不大於(或不小於)其左右子樹的結點的值。若父親大孩子小,則爲大頂堆,若父親小孩子大,則爲小頂堆。
        構造過程:從最後一個結點的父結點開始,若當前結點關鍵字小於左右孩子中關鍵字較大者,則發生交換,交換後可能會破壞下一級的堆,此時需要用上述方法調整下一級的堆,直到以該結點爲根的子樹構成堆爲止。之後向前依次對各結點進行上述過程,直到根結點。

36、爲什麼快速排序比堆排序快?
    答:逆序對:堆排序調整堆的過程中可能增加逆序對,做了很多無效的操作;而快排的每一次交換都離最終目標越來越近
        cache:堆排序的比較的幾乎都不是相鄰元素,對cache極不友好;相比之下快排比較的相鄰元素更多,對cache更友好

37、基數排序的過程?
    答:以最低位優先爲例,先對最低位進行一趟分配(考察對應位的值並放入相應的隊列)收集(每個隊列首尾相連),然後對次低位進行一趟分配收集,重複上述過程,直到最高位。時間複雜度O(d(n+r))

38、外部排序的過程?
    答:1.根據內存緩衝區的大小,將外存上的文件分成若干子文件,依次讀入內存並利用有效的內部排序方法對它們進行排序,並將排序後得到的有序子文件即歸併段重新寫回外存
        2.對歸併段進行逐趟歸併,使歸併段逐漸由小到大,直至得到整個有序文件爲止。

39、外部排序優化?
    答:增大歸併路數(內部歸併的比較次數受歸併路數影響-->採用敗者樹避免)
        減少歸併段數(各個歸併段中的元素個數可能不同-->用最佳歸併樹進行組織)

40、求解斐波拉契序列的算法及其時間複雜度?
    答:遞歸算法:求解F(n),必須先計算F(n-1)和F(n-2),以此類推,直至必須先計算F(1)和F(0),然後逆推得到F(n-1)和F(n-2)的結果,從而計算很多重複的值,算法的時間複雜度隨着N的增大呈現指數增長,時間複雜度爲O(2^n)
        迭代算法:從F(2)開始計算,最後用F(n-1)和F(n-2)兩個數相加求出結果,用變量保存上一次計算的結果,這樣可以避免大量的重複計算,算法的時間複雜度隨着n的增大呈現線性增長,時間複雜度爲O(n)
        (遞歸就是在過程或函數裏面調用自身,迭代是利用變量的原值推算出變量的一個新值)

41、單鏈表就地逆置算法?
    答:用指針p掃描原單鏈表,先將頭節點L的next域設置爲NULL,而變成一個空鏈表,然後將*p節點採用頭插法插入到L中。

42、鏈表查詢某個元素,平均時間複雜度是多少?
    答:O(n)

43、哨兵的作用?
    答:哨兵用來解決邊界問題,在查找方向的盡頭設置哨兵免去了查找位置越界的判斷

44、在一個老師學生關係中,學生學號與姓名一一對應,問採用什麼數據結構通過學號查找姓名的速度最快?
    答:哈希表,索引表

45、折半查找用數組存數據,如果對數據進行刪除和插入,就很麻煩,需要移動位置,那你設計一種數據結構解決這個問題?
    答:二叉排序樹,平衡二叉樹
    
46、行優先和列優先有什麼不同(定義上的不同和效率上的不同)若A與B相乘,選擇行優先還是列優先,爲什麼?
    答:存儲模式:行優先的矩陣存儲模式爲,按照行的格式存儲,一行存滿了,接着存儲第二行,列優先同理,一列存滿了,接着存儲第二列
        在內存使用上,因爲程序局部性原理,連續的存儲空間訪問更快。
        A採用行優先,B採用列優先。

47、如何尋找兩個鏈表的首個公共結點?
    答:1.先遍歷兩個鏈表,得到兩個鏈表的長度,進而計算出長度之差
        2.假設一個鏈表比另一個長k個結點,先在長的鏈表上遍歷k個結點,之後再同步遍歷就可以保證同時到達第一個公共結點

48、bfs和dfs遍歷全連通圖的生成樹的高度?生成樹算法?
    答:對於一些特殊的圖,比如只有一個頂點的圖,其BFS生成樹的樹高和DFS生成樹的樹高相等。
        一般的圖,根據圖的BFS生成樹和DFS樹的算法思想,BFS生成樹的樹高比DFS生成樹的樹高小。

49、怎麼用代碼實現圖的鄰接矩陣?鄰接表?
    答:二維數組實現圖的鄰接矩陣
        指針數組實現圖的鄰接表

50、什麼是紅黑樹?怎麼計算高度?
    答:紅黑樹是一種含有紅黑結點並能自平衡的二叉查找樹。紅黑樹的高度是logn

51、爲什麼基於比較的排序算法的時間複雜度下界是O(nlogn)?
    答:所有的基於比較的排序算法都是基於決策樹模型,決策樹的高度也就是排序算法比較的最多次數,決策樹的高度爲log(n!)近似nlogn

52、漢諾塔問題?
    答:將n個盤子從a柱移到c柱,首先將n-1個盤子從a柱移到b柱,然後將第n個盤子從a柱移到c柱,再將n-1個盤子從b柱移到c柱,那麼問題變成如何移動n-1個盤子
        依次類推,問題最終變成如何移動2個盤子,即將第1個盤子從a柱移到b柱,第2個盤子從a柱移到c柱,再將第1個盤子從b柱移到c柱
        最後反向逆推可以得到移動n-1個盤子的方法,進而解決移動n個盤子的方法

53、存在環的單鏈表尋找環的入口點?
    答:1.散列表法:將遍歷到的結點放在一個散列表中,如果當前遍歷的結點已經存在散列表中,說明有環,且該結點即環的入口。時間:O(n) 空間:O(n)
        2.快慢指針:兩個步進不同的指針遍歷鏈表,若鏈表有環,兩指針必然相遇,假設此時show走了n步,fast2n步。接下來,讓fast回到鏈表的頭部,重新走,每次步長1,那麼當fast和slow再次相遇的時候,就是環路的入口了。時間O(n),空間O(1)
        (因爲fash比slow快n,slow再走n步會回到相遇點,fast從鏈表首部走n步也會到相遇點,兩段路徑後面一小段重合,變成了找第一個公共結點的問題)

54、快速排序的優化思路?
    答:快速排序的優化思路是基準元素的選取
        可以選每個子部分中間位置的元素;或者是每個子部分中第一個,最後一個,中間的元素的中位數

55、在數據結構中用什麼可以進行優先級的進程調度
    答:大頂堆。可以將優先級作爲結點的權值,然後建隊,調堆,輸出最大權值的進程。

56、順序查找有序表的過程及其判定樹?
    答:順序查找有序表:在已知表的關鍵字有序的情況下,通過關鍵字與key的比較,能快速判斷是應該繼續查找還是查找失敗(n個關鍵字、n+1個失敗結點)

57、已知先序和後序遍歷序列可以唯一確定一棵樹嗎?
    答:不能,但可以確定二叉樹中結點的祖先關係,當兩個結點的先序序列爲XY,後序序列爲YX時,則X爲Y的祖先
        (先序,中序,後序,遍歷過程中經過結點的路線一樣,只是訪問結點的時機不同)

58、計算二叉樹高度的算法?
    答:1.遞歸、後序遍歷結點最大的棧即爲樹的高度
        2.使用層序遍歷,最大層次即爲二叉樹的高度

59、深度優先搜索形成的是什麼?森林唯一麼?
(森林,不能說樹)(不唯一,因爲鄰接表可能不唯一

60、怎麼取一個單鏈表的倒數第K個值
    答:兩個位置相差k的指針以相同步進遍歷單鏈表,當前者遍歷到底,則後者正指向倒數第k個結點

61、Dijkstra算法爲什麼權值不能爲負?
    答:因爲源點到集合內的頂點的當前最短路徑後續不會更新,只會更新源點到集合外的各個頂點的當前最短路徑

62、數組隊列的假溢滿現象
    答:當元素被插入到數組中下標最大的位置上之後,隊列的空間就用盡了,儘管此時數組的低地址還有空位置,這種現象叫做假溢出。

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