【數據結構與算法】數據結構基礎知識總結(面試考點)

數據結構

1. 數組和鏈表的區別?

  1. 邏輯結構上來看,數組必須實現定於固定的長度,不能適應數據動態增減的狀況,即數組的大小一旦定義就不能改變。當數據增長是,可能超過原先定義的元素的個數;當數據減小時,形成內存浪費;鏈表動態進行存儲分配,能夠適應數據動態地增減的狀況,且能夠方便地插入、刪除數據項。程序員

  2. 內存存儲的角度看;數組從棧中分配空間(用new則在堆上建立),對程序員方便快速,可是自由度小;鏈表從堆中分配空間,自由度大可是申請管理比較麻煩。面試

  3. 從訪問方式類看,數組在內存中是連續的存儲,所以能夠利用下標索引進行訪問;鏈表是鏈式存儲結構,在訪問元素時候只可以經過線性方式由前到後順序的訪問,因此訪問效率比數組要低。算法

2. 簡述快速排序過程

[!NOTE]
掌握全部常見的排序算法的手寫實現,以及複雜度相關細節知識。數據庫

  1. 選擇一個基準元素,一般選擇第一個元素或者最後一個元素,數組

  2. 經過一趟排序將待排序的記錄分割成獨立的兩部分,其中一部分記錄的元素值均比基準元素值小。另外一部分記錄的元素值比基準值大。數據結構

  3. 此時基準元素在其排好序後的正確位置指針

  4. 而後分別對這兩部分記錄用一樣的方法繼續進行排序,直到整個序列有序。blog

3. 各種排序算法對比(熟練掌握)

排序算法對比分析

3.1 時間複雜度來講

  1. 平方階(O(n2))排序
      各種簡單排序:直接插入、直接選擇和冒泡排序;排序

  2. 線性對數階(O(nlog2n))排序
      
    快速排序、堆排序和歸併排序;索引

  3. O(n1+§))排序,§是介於0和1之間的常數。
    希爾排序
  4. 線性階(O(n))排序
      基數排序,此外還有桶、箱排序。

說明:

  1. 當原表有序或基本有序時,直接插入排序和冒泡排序將大大減小比較次數和移動記錄的次數,時間複雜度可降至O(n);

  2. 而快速排序則相反,當原表基本有序時,將蛻化爲冒泡排序,時間複雜度提升爲O(n2);

  3. 原表是否有序,對簡單選擇排序、堆排序、歸併排序和基數排序的時間複雜度影響不大。

3.2 穩定性

[!NOTE]
排序算法的穩定性:若待排序的序列中,存在多個具備相同關鍵字的記錄,通過排序,這些記錄的相對次序保持不變,則稱該算法是穩定的;若經排序後,記錄的相對次序發生了改變,則稱該算法是不穩定的。

3.2.1 穩定的排序算法

冒泡排序、插入排序、歸併排序和基數排序

3.2.2 不是穩定的排序算法

選擇排序、快速排序、希爾排序、堆排序

3.3 選擇排序算法準則

通常而言,須要考慮的因素有如下四點:

設待排序元素的個數爲n.

  1. 當n較大,則應採用時間複雜度爲O(nlog2n)的排序方法:快速排序、堆排序或歸併排序序。

  2. 當n較大,內存空間容許,且要求穩定性:歸併排序

  3. 當n較小,可採用直接插入或直接選擇排序。

    直接插入排序:當元素分佈有序,直接插入排序將大大減小比較次數和移動記錄的次數。

    直接選擇排序 :元素分佈有序,若是不要求穩定性,選擇直接選擇排序

  4. 通常不使用或不直接使用傳統的冒泡排序。

  5. 基數排序
    它是一種穩定的排序算法,但有必定的侷限性:
  • 關鍵字可分解。
  • 記錄的關鍵字位數較少,若是密集更好
  • 若是是數字時,最好是無符號的

4. 解決哈希衝突的方法(面試重點)

[!NOTE]
須要對HashTable的底層實現有深刻的理解,知道哈希衝突的產生緣由和解決方法。

哈希表(Hash table,也叫散列表),是根據關鍵碼值(Key value)而直接進行訪問的數據結構。

1) 線性探測法

2) 平方探測法

3) 僞隨機序列法

4) 拉鍊法

5. B樹(瞭解)

[!NOTE]
若是對數據庫有了解的話,該知識點須要深刻理解。

根據B類樹的特色,構造一個多階的B類樹,而後在儘可能多的在結點上存儲相關的信息,保證層數儘可能的少,以便後面咱們能夠更快的找到信息,磁盤的I/O操做也少一些,並且B類樹是平衡樹,每一個結點到葉子結點的高度都是相同,這也保證了每一個查詢是穩定的。

B樹和B+樹的區別,以一個m階樹爲例。

  1. 關鍵字的數量不一樣;B+樹中分支結點有m個關鍵字,其葉子結點也有m個,其關鍵字只是起到了一個索引的做用,可是B樹雖然也有m個子結點,可是其只擁有m-1個關鍵字。

  2. 存儲的位置不一樣;B+樹中的數據都存儲在葉子結點上,也就是其全部葉子結點的數據組合起來就是完整的數據,可是B樹的數據存儲在每個結點中,並不只僅存儲在葉子結點上。

  3. 分支結點的構造不一樣;B+樹的分支結點僅僅存儲着關鍵字信息和兒子的指針(這裏的指針指的是磁盤塊的偏移量),也就是說內部結點僅僅包含着索引信息。

  4. 查詢不一樣;B樹在找到具體的數值之後,則結束,而B+樹則須要經過索引找到葉子結點中的數據才結束,也就是說B+樹的搜索過程當中走了一條從根結點到葉子結點的路徑。

相關文章
相關標籤/搜索