數據結構分類
數據結構是指相互之間存在着一種或多種關系的數據元素的集合和該集合中數據元素之間的關系組成
常用的數據結構有:數組,棧,鏈表,隊列,樹,圖,堆,散列表等,如果所示:
一、數組
數組是可以再內存中連續存儲多個元素的結構,在內存中的分配也是連續的,數組中的元素通過數組下標進行訪問,數組下標從0開始
注意:代碼部分我都選用了python或者go
例如下面這段代碼就是將數組的第一個元素賦值為1
data:=[1]int{1}
優點:
1.按照索引查詢元素速度快
2.按照索引遍歷數組方便
缺點:
1.數組的大小固定后就無法擴容了
2.數組只能存儲一種類型的數據
3.添加,刪除的操作慢,因為要移動其他的元素
適用場景:
頻繁查詢,對存儲空間要求不大,很少增加和刪除的情況
二、棧
棧是一種特殊的線性表,僅能在線性表的一端操作,棧頂允許操作,棧底不允許操作。棧的特點是:先進后出,或者說是后進先出,從棧頂放入元素的操作叫入棧,取出元素叫出棧
棧的結構就像一個集裝箱,越先放進去的東西越晚才能拿出來,所以棧常用於實現遞歸功能方面的場景,例如斐波那契數列
三、隊列
隊列與棧一樣,也是一種線性表,不同的是,隊列可以在一端添加元素,在另一端操取出元素,也就是:先進先出,從一端放入元素的操作叫入隊,另一端取出元素的操作叫出隊
使用場景:因為隊列先進先出的特點,在多線程阻塞隊列管理中非常適用
四、鏈表
鏈表是物理存儲單元上非連續的,非順序的儲存結構,數據元素的邏輯順序是通過鏈表的指針地址實現,每個元素包含兩個節點,一個是存儲元素的數據域(內存空間),另一個是指向下一個節點地址的指針域,根據指針的指向,鏈表能形成不同的結構,例如單鏈表,雙向鏈表,循環鏈表等
鏈表的優點:
鏈表是很常用的一種數據結構,不需要初始化容量,可以任意加減元素
添加或者刪除元素時只需要改變前后兩個元素節點的指針域指向地址即可,所以添加,刪除很快
缺點:
因為含有大量的指針域,占用空間較大
查找元素需要遍歷鏈表來查找,非常耗時
適用場景:數據量較小,需要頻繁添加刪除操作
五、樹
樹是一種數據結構,它是由n(n>=1)個有限節點組成一個具有層次關系的集合,把它叫做樹,是因為它看起來像一棵樹,也就說它是根朝上,而也朝下,它具有以下特點:
每個節點有零個或多個子節點
沒有父節點的是根節點
每一個非根節點有且只有一個父節點
除了根節點外,每個子節點可以有多個不相交的子樹
在日常的應用中,我們討論和用的更多的是樹中特殊的結構,稱為二叉樹
二叉樹是樹的特殊一種,具有如下特點:
1.每個節點最多有兩顆子樹,節點的度最大為2
2.左子樹和右子樹是有順序的,次序不能顛倒
3.即使某節點只有一個子樹,也要區分左右子樹
二叉樹是一種比較有用的折中方案,它添加,刪除元素都很快,並且在查找方面也有很多的算法優化,所以二叉樹即有鏈表的好處,也有數組的好處,是兩者的優化方案,在處理大批量的動態數據方面非常有用
擴展:
二叉樹有很多擴展的數據結構,包括平衡二叉樹,紅黑樹,B+樹等,這些數據結構二叉樹的基礎上延伸了很多的功能,在實際應用中廣泛用到,例如mysql的數據庫索引結構用的就是B+樹,還有HashMap的底層源碼中用到了紅黑樹。這些二叉樹的功能強大,但算法上比較復雜,想學習的話還是需要花時間去深入的
六、散列表
散列表,也叫哈希表,是根據關鍵碼和值,直接進行訪問的數據結構,通過key和value來映射到集合中的一個位置,這樣就可以很快找到集合中的對應元素
記錄的存儲位置=f(key)
這里的對應關系f成為散列函數,又稱為哈希(hash函數),而散列表就是把key通過一個固定的算法既所謂的哈希函數轉換成一個整型數字,然后就將該數字對數組長度進行取余,取余結果就當作數組的下標,將value存儲在以該數字為下標的數組空間里,這種存儲空間可以充分利用數組的查找優勢來查找元素,所以查找的速度很快。
python的哈希表:https://www.cnblogs.com/kumata/p/9157738.html
七、堆
堆是一種比較特殊的數據結構,可以被看做一棵樹的數組對象,具有以下的性質:
-
堆中某個節點的值總是不大於或不小於其父節點的值;
-
堆總是一棵完全二叉樹。
將根節點最大的堆叫做最大堆或大根堆,根節點最小的堆叫做最小堆或小根堆。常見的堆有二叉堆、斐波那契堆等。
堆的定義如下:n個元素的序列{k1,k2,ki,…,kn}當且僅當滿足下關系時,稱之為堆。
(ki <= k2i,ki <= k2i+1)或者(ki >= k2i,ki >= k2i+1), (i = 1,2,3,4...n/2),滿足前者的表達式的成為小頂堆,滿足后者表達式的為大頂堆,這兩者的結構圖可以用完全二叉樹排列出來,示例圖如下:
因為堆有序的特點,一般用來做數組中的排序,稱為堆排序
八、圖
圖是由結點的有窮集合V和邊的集合E組成。其中,為了與樹形結構加以區別,在圖結構中常常將結點稱為頂點,邊是頂點的有序偶對,若兩個頂點之間存在一條邊,就表示這兩個頂點具有相鄰關系。
按照頂點指向的方向可分為無向圖和有向圖:
圖是一種比較復雜的數據結構,在存儲數據上有着比較復雜和高效的算法,分別有鄰接矩陣 、鄰接表、十字鏈表、鄰接多重表、邊集數組等存儲結構,這里不做展開,讀者有興趣可以自己學習深入