考研複試專業課面試——數據結構

記:此篇博客是關於考研複試中專業課面試的相關知識點,按個人理解來總結的,用來鍛鍊自己的邏輯思維,可能不太準確,希望指正。

1、數組和鏈表的區別?

    從邏輯結構來看:數組的存儲長度是固定的,它不能適應數據動態增減的情況,即數組大小定義之後不能改變,當數據增加時會超出數組的長度,當數據減少時會造成內存浪費。鏈表與數組相反,它能夠動態分配存儲空間以適應數據動態增減的情況,並且易於進行插入和刪除操作。

    從訪問方式來看:數組在內存中是一片連續的存儲空間,可以通過數組下標對數組進行隨機訪問,訪問效率較高。鏈表是連式存儲結構,他的存儲空間不是必須連續的,可以是任意的,因此鏈表的訪問必須從前往後依次進行,訪問效率較數組來說比較低。

    如果從第i個位置插入多個元素,對於數組來說每一次插入都需要往後移動元素,每一次的時間複雜度都是O(n),而單鏈表來說只需要在第一次尋找i的位置時時間複雜度爲O(n),其餘的插入和刪除操作時間複雜度均爲O(1),大大提高了插入和刪除的效率。所以當插入和刪除操作頻繁時,鏈表的優勢就越明顯。

2、單鏈表結構和順序存儲結構的區別?

    存儲分配方式:順序存儲結構是用一段連續的存儲空間來存儲數據元素,可以進行隨機訪問,訪問效率較高。鏈式存儲結構是用任意的存儲空間來存儲數據元素,不可以進行隨機訪問,訪問效率較低。

    時間性能:當進行插入和刪除操作時,順序存儲結構每次都需要移動元素,總的時間複雜度爲O(n^2),而單鏈表在確定i位置的指針後,其時間複雜度僅爲O(1)。

    空間性能:由於順序存儲結構需要進行預分配存儲空間,所以容易造成空間浪費或者溢出。鏈式存儲結構不需要預分配存儲空間,元素個數不受限制。

3、頭指針和頭結點的區別?

    頭指針:是指向第一個節點存儲位置的指針,具有標識作用,頭指針是鏈表的必要元素,無論鏈表是否爲空,頭指針都存在。

    頭結點:是放在第一個元素節點之前,便於在第一個元素節點之前進行插入和刪除的操作,頭結點不是鏈表的必須元素,可有可無,頭結點的數據域也可以不存儲任何信息。

    雙向鏈表:即在單鏈表的每個節點上添加一個指向其前驅結點的指針域,雙向鏈表中每個節點都有兩個指針域,分別指向其直接前驅和直接後繼,用空間換取了時間上的性能優化。

4、邏輯結構與物理結構?

    數據的邏輯結構包括4種,(1)集合:數據元素之間除了有相同的數據類型再沒有其他的關係 (2)線性結構:數據元素之間是一對一的關係 (3)樹形結構:數據元素之間是一對多的關係 (4)圖狀結構:數據元素之間是多對多的關係。

    物理結構也有4中,(1)順序存儲結構 (2)鏈式存儲結構 (3)索引存儲結構 (4)散列存儲結構

5、鄰接矩陣與鄰接表的區別? 

    鄰接矩陣表示:無向圖的鄰接矩陣是對稱的,矩陣的行或列的有效元素的個數之和是節點的度。有向圖的鄰接矩陣不一定對稱,矩陣中行的有效元素的個數之和是節點的出度,列的有效元素的個數之和是節點的入度。

    鄰接表表示:無向圖的每條邊在鄰接表中存儲兩次,若想知道節點的度,只需要求出對應鏈表中節點的個數即可。有向圖的邊在鄰接表中僅存儲一次,若想知道節點的出度,則需要遍歷對應的鏈表,若要求節點的入度則還需要遍歷其他的鏈表。

    鄰接矩陣的優點是可以很方便的知道兩個節點之間是否存在邊,以及快速的添加或刪除邊;缺點是如果鄰接矩陣中節點個數比較少容易造成存儲空間的浪費。

    鄰接表的優點是節省空間,只給實際存在的邊分配存儲空間;缺點是在涉及度時可能需要遍歷整個鏈表。

6、用循環比遞歸的效率高嗎?

    循環和遞歸兩者是可以互換的,不能決定性的說循環的效率比遞歸高。

    遞歸的優點是:代碼簡潔清晰,容易檢查正確性;缺點是:當遞歸調用的次數較多時,要增加額外的堆棧處理,有可能產生堆棧溢出的情況,對執行效率有一定的影響。

    循環的優點是:結構簡單,速度快;缺點是:它並不能解決全部問題,有的問題適合於用遞歸來解決不適合用循環。

7、貪心算法和動態規劃以及分治法的區別?

    貪心算法顧名思義就是做出在當前看來是最好的結果,它不從整體上加以考慮,也就是局部最優解。貪心算法從上往下,從頂部一步一步最優,的到最後的結果,它不能保證全局最優解,與貪心策略的選擇有關。

    動態規劃是把問題分解成子問題,這些子問題可能有重複,可以記錄下前面子問題的結果防止重複計算。動態規劃解決子問題,前一個子問題的解對後一個子問題產生一定的影響。在求解子問題的過程中保留哪些有可能得到最優的局部解,丟棄其他局部解,直到解決最後一個問題時也就是初始問題的解。動態規劃是從下到上,一步一步找到全局最優解。

8、單鏈表和雙鏈表?

    當存儲多個類型一樣的數據元素的時候可以用數組來存儲,數組可以根據下標進行隨機訪問,但數組有一個缺陷是不能動態的進行插入和刪除操作,而鏈表剛好彌補了這個缺陷,對於元素的插入和刪除很方便,但是訪問的效率下降了很多。

    單鏈表是隻有一個指針指向其後繼節點的地址,只要知道單鏈表的首地址便能夠遍歷整個鏈表,由於單鏈表的存儲空間不一定連續,所以不能進行隨機訪問,只有通過next指針才能夠訪問到下一個節點。單鏈表只能向後訪問,而不能夠逆向訪問,爲了克服這一缺陷,有了使用更廣泛的雙鏈表,即在單鏈表的基礎上添加一個指向其前驅節點的指針域,實現雙向遍歷,但是也只能順序訪問,用空間換取了時間上的性能改進。

9、棧和隊列的區別?

    隊列是允許在一段進行插入另一端進行刪除的線性表。隊列顧名思義就像排隊一樣,對於進入隊列的元素按“先進先出”的規則處理,在表頭進行刪除在表尾進行插入。由於隊列要進行頻繁的插入和刪除,一般爲了高效,選擇用定長數組來存儲隊列元素,在對隊列進行操作之前要判斷隊列是否爲空或是否已滿。如果想要動態長度也可以用鏈表來存儲隊列,這時要記住隊頭和對位指針的地址。

    棧是隻能在表尾進行插入和刪除操作的線性表。對於插入到棧的元素按“後進先出”的規則處理,插入和刪除操作都在棧頂進行,與隊列類似一般用定長數組存儲棧元素。由於進棧和出棧都是在棧頂進行,因此要有一個size變量來記錄當前棧的大小,當進棧時size不能超過數組長度,size+1,出棧時棧不爲空,size-1。

10、棧和隊列的相同之處和不同之處?

    相同點:(1)棧和隊列都是線性結構 (2)棧和隊列在插入時都是在表尾進行 (3)棧和隊列都可以用順序結構或者鏈表表示 (4)棧和隊列插入和刪除操作的時間複雜度和空間複雜度都一樣。

    不同點:(1)在刪除元素時位置不同,棧在表尾進行,隊列在表頭進行 (2)用鏈表存儲時,棧可以實現多棧空間共享(共享棧),隊列卻不行。

11、算法的特點?

    算法的五大特性:確定性、有窮性、可行性,有0個或多個輸入、有1個或多個輸出

    時間複雜度:算法的執行時間與原操作的執行次數之和成正比

    空間複雜度:如果輸入數據所佔空間只取決於問題本身,而與算法無關,只需要分析除了輸入和程序之外的輔助變量所佔用的空間即可。

12、線性鏈表?

    線性鏈表中一個節點代表一個存儲空間,即存儲節點,簡稱節點。每一個節點包括兩部分,分別是指針域,用來存儲指向下一個或前一個節點的地址,數據域用來存儲數據元素的值。鏈式存儲結構中,存儲空間是可以不連續的,也就是數據的存儲順序與數據元素的邏輯結構可以不相同,數據元素之間的邏輯關係由指針域來確定。且鏈式存儲結構可以用來表示線性結構也可以用來表示非線性結構。

13、樹與二叉樹的相關概念?

    樹是非線性結構,其元素之間有明顯的層次關係。在樹的結構中,每個節點都只有一個前件稱爲父節點,沒有前件的節點爲樹的根節點,簡稱爲樹的根;每個節點可以有多個後件成爲節點的子節點,沒有後件的節點稱爲葉子節點。

    在樹的結構中,一個節點所擁有的子節點個數稱爲該節點的度,樹中最大的節點的度爲樹的度,樹的最大的層次稱爲樹的深度

    二叉樹:在二叉樹中只有一個根節點,一個節點最多隻能有兩個子節點,稱爲左子樹和右子樹。

    滿二叉樹:滿二叉樹是指除了最後一層外其他節點均有兩顆子樹,第k層有2^(k-1)個節點,深度爲m的樹共有2^m-1個節點

    完全二叉樹:完全二叉樹是指除了最後一層外,其他任何一層的節點數均達到最大值,且最後一層也只是在最右側缺少節點

    二叉樹的存儲:二叉樹可以用鏈式存儲結構來存儲,滿二叉樹和完全二叉樹可以用順序存儲結構來存儲

    二叉樹的遍歷:二叉樹有先序遍歷(根左右),中序遍歷(左根右)和後續遍歷(左右根)

14、圖的相關概念?

    圖的表示:G=(V,E)=(頂點,邊);無向完全圖有n(n-1)/2條邊,有向完全圖有n(n-1)條邊

    迪傑斯特拉(dijkstra)算法:迪傑斯特拉算法是經典的單源最短路徑算法,用於求某一頂點到其他頂點的最短路徑,它的特點是以起始點爲中心層層向外擴展,直到擴展的終點爲止,迪傑斯特拉算法要求邊的權值不能爲負權。

    弗洛伊德(Floyd)算法:弗洛伊德算法是經典的求任意頂點之間的最短路徑,其邊的權值可爲負權,該算法的時間複雜度爲O(N^3),空間複雜度爲O(N^2)。 

    普里姆(prim)算法:用來求最小生成樹,其基本思想爲:從聯通網絡N={V,E}中某一頂點u0出發,選擇與他關聯的最小權值的邊,將其頂點加入到頂點集S中,此後就從一個頂點在S集中,另一個頂點不在S集中的所有頂點中選擇出權值最小的邊,把對應頂點加入到S集中,直到所有的頂點都加入到S集中爲止。

    克魯斯卡爾(kruskal)算法:用來求最小生成樹,其基本思想爲:設有一個有N個頂點的聯通網絡N={V,E},初試時建立一個只有N個頂點,沒有邊的非連通圖T,T中每個頂點都看作是一個聯通分支,從邊集E中選擇出權值最小的邊且該邊的兩個端點不在一個聯通分支中,則把該邊加入到T中,否則就再從新選擇一條權值最小的邊,直到所有的頂點都在一個聯通分支中爲止。

15、深度優先搜索步驟?

    (1)訪問起始點v

    (2)若v的第一個鄰接點沒有被訪問過,則深度遍歷該鄰接點;

    (3)若v的第一個鄰接點已經被訪問,則訪問其第二個鄰接點,進行深度遍歷;重複以上步驟直到所有節點都被訪問過爲止

16、廣度優先搜索的步驟?

    (1)訪問起始點v

    (2)依次遍歷v的所有未訪問過得鄰接點

    (3)再依次訪問下一層中未被訪問過得鄰接點;重複以上步驟,直到所有的頂點都被訪問過爲止

17、拓撲排序的概念以及實現?

    拓撲排序在工程中的應用十分重要,它可以決定哪些子工程必須要先執行,哪些子工程要在某些工程完成後才能執行。把以頂點爲活動,邊爲活動間先後順序關係的有向圖成爲頂點活動網,簡稱爲AOV網。一個AOV網應該是有向無環圖,不應該存在迴路,如果要存在迴路的話則該回路上的所有活動都無法執行。在AOV網中如果不存在迴路,則可以把所有的活動排列成一個序列,稱該序列爲拓撲序列,拓撲序列並不是唯一的。形成拓撲序列的過程稱爲拓撲排序。

    拓撲排序的步驟:

    (1)在有向圖中任意選擇一個沒有前驅的節點輸出

    (2)從圖中刪去該節點以及與他相連的邊

    (3)重複以上步驟,直到所有的頂點都輸出或者當前圖中不存在無前驅的頂點爲止,後者代表該圖是有環圖,所以可以通過拓撲排序來判斷一個圖是否存在環。

18、關鍵路徑的相關概念?

    AOE網是一種以頂點爲事件,弧爲活動,權爲活動的持續時間的帶權有向無環圖,通常AOE網用來估算工程的完成時間。

    關鍵路徑:在AOE網中,從起始點到終點的最大路徑長度的路徑爲關鍵活動。最大路徑長度是指:該路徑上的活動持續時間之和最大。

    關鍵活動:關鍵路徑上的活動爲關鍵路徑,關鍵活動的最早開始時間等於最晚開始時間。由於AOE網中的某些活動是可以同時發生的,所以完成整個工程的時間應該是從始點到終點的最大路徑長度,關鍵路徑長度即爲工程的最短完成時間。

19、對各種查找方法的概括?

    查找表是成爲集合的數據結構,各元素間的約束力最差的數據結構,各元素除了在同一個集合中就再沒有其他關係。查找分爲靜態查找表和動態查找表;靜態查找表包括:順序查找、折半查找、分塊查找;動態查找包括:二叉排序樹和平衡二叉樹。

    (1)順序查找:把待查關鍵字key放入哨兵位置(i=0),再從後往前依次把表中元素和key比較,如果返回值爲0則查找失敗,表中沒有這個key值,如果返回值爲元素的位置i(i!=0)則查找成功,設置哨兵的位置是爲了加快執行速度。他的時間效率爲O(n),其特點是:結構簡單,對順序結構和連式結構都適用,但是查找效率太低。

    (2)折半查找:要求查找表爲順序存儲結構並且有序,若關鍵字在表中則返回關鍵字的位置,若關鍵字不在表中時停止查找的典型標誌是:查找範圍的上界<=查找範圍的下界。

    (3)分塊查找:先把查找表分爲若干子表,要求每個子表的元素都要比他後面的子表的元素小,也就是保證塊間是有序的(但是子表內不一定有序),把各子表中的最大關鍵字構成一張索引表,表中還包含各子表的起始地址。他的特點是:塊間有序,塊內無序,查找時塊間進行索引查找,塊內進行順序查找。

    (4)二叉排序樹:二叉排序樹的定義爲:或者是一棵空樹,或者是一棵具有如下特點的樹:如果該樹有左子樹,則其左子樹的所有節點值小於根的值;若該樹有右子樹,則其右子樹的所有節點值均大於根的值;其左右子樹也分別爲二叉排序樹。在查找時可以進行動態的插入,插入節點要符合二叉排序樹的定義,這也是動態查找和靜態查找的區別,靜態查找不能進行動態插入。

    (5)平衡二叉樹:平衡二叉樹又稱爲AVL樹,它或者是一棵空樹或者具有如下特點:他的左子樹和右子樹的高度差的絕對值不能大於1,且他的左右子樹也都是平衡二叉樹。

    平衡因子:是指左子樹的高度減去右子樹的高度,它的值只能爲1,0,-1

    如果再一個平衡二叉樹中插入一個節點可能造成失衡,這時就要進行樹結構的調整,即平衡旋轉。包括4中情況:在左子樹的左子樹上插入節點時向右進行單向旋轉;在右子樹的右子樹上插入節點時向左進行單向旋轉;在左子樹的右子樹插入節點時先向左旋轉再向右旋轉;在右子樹的左子樹插入節點時先向右旋轉再向左旋轉。

20、哈希表的概念、哈希函數的構造方法、哈希衝突的解決辦法?

    哈希表又稱爲散列表,是根據關鍵字碼的值直接進行訪問的數據結構,即它通過把關鍵碼的值映射到表中的一個位置以加快查找速度,其中映射函數叫做散列函數,存放記錄的數組叫做散列表。

    哈希函數的構造方法包括:直接定址法,除留餘數法,數字分析法,平方取中法,摺疊法,隨機數法

    (1)直接定址法:取關鍵字的某個線性函數值作爲散列地址,H(key)=a*key+b。

    (2)除留餘數法:取關鍵字對p取餘的值作爲散列地址,其中p<m,即H(key)=key%p (p<m)。

    (3)數字分析法:當關鍵字的位數大於地址的位數,對關鍵字的各位分佈進行分析,選出分佈均勻的任意幾位作爲散列的地址,適用於所有關鍵字都已知的情況。

    (4)平方取中法:對關鍵字求平方,再取結果中的中間幾位作爲散列地址。

    (5)摺疊法:將關鍵字分爲位數相同的幾部分,然後取這幾部分的疊加和作爲散列地址。適用於關鍵字位數較多,且關鍵字中每一位上數字分佈大致均勻。

    (6)隨機數法:選擇一個隨機函數,把關鍵字的隨機函數值作爲散列地址。適合於關鍵字的長度不相同時。

    哈希衝突的解決方法包括:開放定址法和拉鍊法,當衝突發生時,使用某種探測技術形成一個探測序列,然後沿此序列逐個單單元查找,直到找到該關鍵字或者碰到一個開放的地址爲止,探測到開放的地址表明該表中沒有此關鍵字,若要插入,則探測到開放地址時可將新節點插入該地址單元。其中開放定址法包括:線性探查法,二次探查法,雙重散列法

    (1)線性探查法:基本思想,探查時從地址d開始,首先探查T[d],在探查T[d+1]...直到查到T[m-1],此後循環到T[0],T[1]...直到探測到T[d-1]爲止。

    (2)二次探查法:基本思想,探查時從地址d開始,首先探查T[d],再探查T[d+1^2],T[d+2^2]...等,直到探查到有空餘地址或者探查到T[d-1]爲止,缺點是無法探查到整個散列空間。

    (3)雙重散列法:基本思想,使用兩個散列函數來確定地址,探查時從地址d開始,首先探查T[d],再探查T[d+h1(d)],T[d+2*h1(d)]...

    鏈接法:將所有關鍵字爲同義詞的節點鏈接在同一個單鏈表中,若選定的散列表長度爲m,則可將散列表定義爲一個由m個頭指針組成的指針數組,凡是散列地址爲i的節點均插入到頭指針爲i的單鏈表中。

21、對各種內部排序的概括與總結?

    排序:是指把一個任意元素的序列排列成一個按關鍵字key有序的序列。內部排序包括:插入排序、選擇排序、交換排序、歸併排序、基數排序。其中插入排序包括:直接插入排序、折半插入排序、希爾排序;選擇排序包括:簡單選擇排序,堆排序;交換排序包括:冒泡排序、快速排序。

    (1)直接插入排序(穩定):基本思想爲:將序列分爲有序部分和無序部分,從無序部分依次選擇元素與有序部分比較找到合適的位置,將原來的元素往後移,將元素插入到相應位置上。時間複雜度爲:O(n^2),空間複雜度爲O(1)

    (2)折半插入排序(穩定):基本思想爲:設置三個變量low high mid,令mid=(low+high)/2,若a[mid]>key,則令high=mid-1,否則令low=mid+1,直到low>high時停止循環,對序列中的每個元素做以上處理,找到合適位置將其他元素後移進行插入。他的比較次數爲O(nlog2n),但是因爲要後移,因此時間複雜度爲O(n^2),空間複雜度爲O(1)。 優點是:比較次數大大減少。

    (3)希爾排序(不穩定):基本思想爲:先將序列分爲若干個子序列,對各子序列進行直接插入排序,等到序列基本有序時再對整個序列進行一次直接插入排序。優點是:讓關鍵字值小的元素能夠很快移動到前面,且序列基本有序時進行直接插入排序時間效率會提升很多,空間複雜度爲O(1)。

    (4)簡單選擇排序(不穩定):基本思想爲:將序列分爲2部分,每經過一趟就在無序部分找到一個最小值然後與無序部分的第一個元素交換位置。優點是:實現起來特別簡單,缺點是:每一趟只能確定一個元素的位置,時間效率低。時間複雜度爲O(n^2),空間複雜度爲O(1)。

    (5)堆排序(不穩定):設有一個任意序列,k1,k2,...,kn,當滿足下面特點時稱之爲堆:讓此序列排列成完全二叉樹,該樹具有以下特點,該樹中任意節點均大於或小於其左右孩子,此樹的根節點爲最大值或者最小值。優點是:對大文件效率明顯提高,但對小文件效率不明顯。時間複雜度爲O(nlog2n),空間複雜度爲O(1)。

    (6)冒泡排序(穩定):基本思路爲:每一趟都將元素進行兩兩比較,並且按照“前小後大”的規則進行交換。優點是:每一趟不僅能找到一個最大的元素放到序列後面,而且還把其他元素理順,如果下一趟排序沒有發生交換則可以提前結束排序。時間複雜度爲O(n^2),空間複雜度爲O(1)。

    (7)快速排序(不穩定):基本思路爲:在序列中任意選擇一個元素作爲中心,比它大的元素一律向後移動,比它小的元素一律向前移動,形成左右兩個子序列,再把子序列按上述操作進行調整,直到所有的子序列中都只有一個元素時序列即爲有序。優點是:每一趟不僅能確定一個元素,時間效率較高。時間複雜度爲O(nlog2n),空間複雜度爲O(log2n).

    (8)歸併排序(穩定):基本思想爲:把兩個或者兩個以上的有序表合併成一個新的有序表。時間複雜度爲O(nlogn),空間複雜度和待排序的元素個數相同。

    (9)基數排序:時間複雜度爲:對於n個記錄進行鏈式基數排序的時間複雜度爲O(d(n+rd)),其中每一趟分配的時間複雜度爲O(n),回收的時間複雜度爲O(rd)。

    各種排序的總結表格如下:

數據結構部分更新完畢~

 

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