前言
自從大學畢業后,數據結構相關知識已忘的差不多,現在准備復習下數據結構相關知識,並記錄下來。
正文
常見的數據結構如下:
數組
鏈表
棧
隊列
樹
圖
哈希表
以下會逐一細說。
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,通過哈希函數獲取到相同的結果時,產生哈希沖突。
解決哈希沖突的方法如下:
①拉鏈法(鏈接法):將所有關鍵字為同義字的記錄存儲在一個單鏈表中,我們稱這種單鏈表為同義詞子表,散列表中存儲同義詞子表的頭指針。
②開放定址法:當沖突發生時,使用某種探查(亦稱探測)技術在散列表中尋找下一個空的散列地址,只要散列表足夠大,空的散列地址總能找到。
按照形成探查序列的方法不同,可將開放定址法區分為線性探查法、二次探查法、雙重散列法等。