用圖!27張圖帶你徹底弄明白九大數據結構!

目錄

1-數組 

 2-鏈表

 鏈表和數組對比

3-跳錶

4-棧

 5-隊列

6-樹


數據結構大家應該都接觸過,對於一個成熟的程序員而言,熟悉和掌握數據結構和算法也是基本功之一。數據結構本身其實不過是數據按照一定的關係進行存儲的集合,特殊的結構在不同的應用場景會帶來不一樣的處理效率。

常用的數據結構可根據數據訪問的特點分爲線性結構和非線性結構。線性結構包括常見的鏈表、棧、隊列等,非線性結構包括樹、圖等。數據結構種類繁多,本文將通過圖解的方式對常用的數據結構進行理論上的介紹和講解,以便大家掌握常用的數據結構的基本知識。

1-數組 

數組可以說是最基本最常見的數據結構。數組一般用來存儲相同類型的數據,使用數組名和下角標經i選哪個數組的訪問和更新。數組中的元素是按照先後順序進行排列的,當然了,在內存中也是如此。數組中兩個相鄰的元素的內存地址之差就是數組數據類型的大小。

 2-鏈表

鏈表和數組相比,除了數據域,還多增加了指針域,作用是構建鏈式結構來存儲數據。鏈表中每一個節點都包括這個節點的數據文件和指向下一個節點地址的指針。由於是通過指針查找和訪問數據,這就讓鏈表的自由度很高。

在對節點進行增加和刪除時,只需要對上一個節點的指針地址進行修改,不需要修改其他節點。但是,這也是把雙刃劍,指針帶來高自由度,也會犧牲數據查詢的效率和多餘空間的使用。

最常見的是有頭有尾的單鏈表,還有雙向鏈表或者循環鏈表。

 鏈表和數組對比

鏈表和數組在實際使用的過程中需要根據自身的優劣勢進行選擇。鏈表和數組的異同點也是面試中高頻的考察點之一。

這裏對單鏈表和數組的區別進行了對比和總結。

  數組 鏈表
內存長度 連續的內存空間 非連續的內存空間
數據長度 長度固定,一般不可動態擴展 長度可動態變化
增刪效率 低,需要移動被修改元素之後的所有元素 高,只需要修改指針指向
查詢效率 高,可通過數組名和下標直接訪問,時間複雜度爲O(1) 低,只能通過遍歷節點依次查詢,時間複雜度O(n)
數據訪問方式 隨機訪問 順序訪問

3-跳錶

從上面的對比中可以看出,鏈表雖然通過增加指針域提升了自由度,但是卻導致數據的查詢效率惡化。特別是當鏈表長度很長的時候,對數據的查詢還得是從頭依次查詢,這樣的效率會很低。跳錶產生就是爲了解決鏈表過長的問題,通過增加鏈表的多級索引來加快原始鏈表的查詢效率。這樣的方式可以讓查詢的時間複雜度從O(n)提升到O(logn)。

跳錶通過增加多級索引的方式能夠實現高效的動態插入和刪除,其效率和紅黑樹、平衡二叉樹不相上下。目前redis和levelDB都有用到跳錶。

從上圖中可以看出,索引級的指針域除了指向下一個索引位置的指針,還有一個down指針指向低一級的鏈表位置,這樣才能實現條約查詢的目的。 

4-棧

棧是一種比較簡單的數據結構,常用一句話描述其特性,後進先出。棧本身是一個線性表,但是在這個表只有一個口子允許數據的進出。這種模式可以參考腔腸動物...即進食和排泄都用一個口...

跑題了...

 棧的常用操作包括入棧push和出棧pop,對應數據的壓入和壓出。還有訪問棧頂數據、判斷棧是否爲空和判斷棧的大小等。由於棧先進後出的特性,常可以作爲數據操作的臨時容器,對數據的順序進行調控,與其他數據結構相結合可獲得許多靈活的處理。

 5-隊列

隊列是棧的兄弟結構,與棧的後進先出相對應,隊列是一種先進先出的數據結構。顧名思義,隊列的數據存儲是如同排隊一般,先存入的數據先被壓出。常與棧一同配合,可發揮最大的實力。

6-樹

 

樹作爲一種樹狀的數據結構,其數據節點之間的關係也如大樹一樣,將有限個節點根據不同層次關係進行排列,從而形成數據與數據之間的父子關係。常見的數的表示形式更接近“倒掛的樹”,因爲它將根朝上,葉朝下。

樹的數據存儲在結點中,每個結點有零個或者多個子結點。沒有父結點的結點在最頂端,成爲根節點;沒有非根結點有且只有一個父節點;每個非根節點又可以分爲多個不相交的子樹。

這意味着樹是具備層次關係的,父子關係清晰,家庭血緣關係明朗;這也是樹與圖之間最主要的區別。

別看樹好像很高級,其實可看作是鏈表的高配版。樹的實現就是對鏈表的指針域進行了擴充,增加了多個地址指向子結點。同時將“鏈表”豎起來,從而凸顯了結點之間的層次關係,更便於分析和理解。

樹可以衍生出許多的結構,若將指針域設置爲雙指針,那麼即可形成最常見的二叉樹,即每個結點最多有兩個子樹的樹結構。二叉樹根據結點的排列和數量還可進一度劃分爲完全二叉樹、滿二叉樹、平衡二叉樹、紅黑樹等。

完全二叉樹:除了最後一層結點,其它層的結點數都達到了最大值;同時最後一層的結點都是按照從左到右依次排布。

滿二叉樹:除了最後一層,其它層的結點都有兩個子結點。 

平衡二叉樹:

平衡二叉樹又被稱爲AVL樹,它是一棵二叉排序樹,且具有以下性質:它是一棵空樹或它的左右兩個子樹的高度差的絕對值不超過1,並且左右兩個子樹都是一棵平衡二叉樹。

更新中.......

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