常見的幾種數據結構


前言

  自從大學畢業后,數據結構相關知識已忘的差不多,現在准備復習下數據結構相關知識,並記錄下來。

正文

常見的數據結構如下:

  數組

  鏈表

  棧

  隊列

  樹

  圖

  哈希表

以下會逐一細說。

1、數組:

  數組是一種連續存儲線性結構,通過使用整型索引值來訪問它們的元素。

 

數組的優缺點:

(1)優點:

  數組查詢效率高

(2)缺點:

  數組插入和刪除效率低

  需要大塊連續的內存塊

  創建時需要指定數組的長度

 

2、鏈表:

  n個節點離散分布,彼此之間用指針相連。每個節點(除了首節點、尾節點)有一個前驅節點和一個后續節點,首節點只有一個后續節點,尾節點只有一個前驅節點。

 鏈表的優缺點:

(1)優點:

  鏈表的插入或刪除效率高

(2)缺點:

  鏈表的查詢效率低

 

鏈表分類:

①單向鏈表:只有一個指針域,指向該節點的后續節點。

②雙向鏈表:有兩個指針域,指向該節點的前驅節點和后續節點。

③循環鏈表:(單向或者雙向)鏈表的尾指針指向頭節點,實現循環鏈表。通過任意一個節點都可以推出整個鏈表。

 

3、棧:

   先進后出,后進先出。

 

4、隊列:

  先進先出,后進后出。

 

5、樹:

  一種非線性的數據結構。

 

 

樹的分類:

①二叉樹:每個節點最多只有兩個分支。(注:后面會有一篇文章專門寫二叉樹的遍歷)

  完全二叉樹:若設二叉樹的深度為h,除第 h 層外,其它各層 (1~(h-1)層) 的結點數都達到最大個數,第h層所有的結點都連續集中在最左邊,這就是完全二叉樹;

  滿二叉樹:是一種特殊的完全二叉樹。除了最后一層節點無任何子節點外,其他節點都有兩個子節點。

②二叉搜索樹(二叉查找樹、二叉排序樹):若左子樹不空,則左子樹上所有結點的值均小於它的根結點的值;若右子樹不空,則右子樹上所有結點的值均大於或等於它的根結點的值,並且左、右子樹也分別為二叉搜索樹。

③平衡二叉樹:它是一棵空樹或它的左右兩個子樹的高度差的絕對值不超過1,並且左右兩個子樹都是一棵平衡二叉樹。

  AVL樹:是一種最先發明的自平衡的二叉查找樹。

  紅黑樹:是一種自平衡(不是絕對的平衡)的二叉查找樹,樹上的每個節點都遵循下面的規則:

      每個節點都有紅色或黑色;

      根節點是黑色;

      每個紅色節點必須有兩個黑色的子節點。(從每個葉子到根的所有路徑上不能有兩個連續的紅色節點;

      從任一節點到其任何后代NULL節點(葉子結點下方掛的兩個空節點,並且認為他們是黑色的)的每條路徑都具有相同數量的黑色節點。

④B樹:是一種自平衡的查找樹,但不是二叉樹。

⑤B+樹:類似於B樹,區別是B+樹只有達到葉子結點才命中(B樹可以在非葉子結點命中),其性能也等價於在關鍵字全集做一次二分查找;

 

6、圖:

  一種非線性的數據結構。所有的頂點構成一個頂點集合,所有的邊構成邊的集合,一個完整的圖結構就是由頂點集合和邊集合組成。   圖結構中頂點集合不能為空,必須包含一個頂點,而圖結構邊集合可以為空,表示沒有邊。

 圖的分類:

①無向圖:如果一個圖結構中,所有的邊都沒有方向性,那么這種圖便稱為無向圖。

 

 ②有向圖:一個圖結構中,邊是有方向性的。

 

 ③無向完全圖:在一個無向圖中, 每兩個頂點之間都存在條邊,那么這種圖結構稱為無向完全圖。

 

 ④有向完全圖:在一個有向圖中,每兩個頂點之間都存在方向相反的兩條邊,那么這種圖結構稱為有向完全圖。

 

 ⑤有向無環圖(DAG圖):在一個有向圖無法從某個頂點出發經過若干條邊回到該點,則這個圖是一個有向無環圖。  

 

7、哈希表:

  是一種根據關鍵碼去尋找值的數據映射結構。

 

(1)哈希函數:根據數據的關鍵詞 key ,通過一定的函數關系,計算出該元素存儲位置的函數。

  ①直接定址法:取關鍵字或關鍵字的某個線性函數值為散列地址。即 H(key) = key 或 H(key) = a*key + b,其中a和b為常數。

  ②除留余數法:取關鍵字被某個不大於散列表長度 m 的數 p 求余,得到的作為散列地址。即 H(key) = key % p, p < m。

  ③數字分析法:當關鍵字的位數大於地址的位數,對關鍵字的各位分布進行分析,選出分布均勻的任意幾位作為散列地址。僅適用於所有關鍵字都已知的情況下,根據實際應用確定要選取的部分,盡量避免發生沖突。

  ④平方取中法:先計算出關鍵字值的平方,然后取平方值中間幾位作為散列地址。隨機分布的關鍵字,得到的散列地址也是隨機分布的。

(2)哈希沖突:對於不同的key,通過哈希函數獲取到相同的結果時,產生哈希沖突。

  解決哈希沖突的方法如下:

  ①拉鏈法(鏈接法):將所有關鍵字為同義字的記錄存儲在一個單鏈表中,我們稱這種單鏈表為同義詞子表,散列表中存儲同義詞子表的頭指針。

        

  ②開放定址法:當沖突發生時,使用某種探查(亦稱探測)技術在散列表中尋找下一個空的散列地址,只要散列表足夠大,空的散列地址總能找到。

  按照形成探查序列的方法不同,可將開放定址法區分為線性探查法、二次探查法、雙重散列法等。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM