本文目錄:mysql
數據結構分類
一、數組
二、棧
三、隊列
四、鏈表
五、樹
六、散列表
七、堆
八、圖
數據結構分類
數據結構是指相互之間存在着一種或多種關係的數據元素的集合和該集合中數據元素之間的關係組成 。
經常使用的數據結構有:數組,棧,鏈表,隊列,樹,圖,堆,散列表等,如圖所示:
每一種數據結構都有着獨特的數據存儲方式,下面爲你們介紹它們的結構和優缺點。算法
一、數組
數組是能夠再內存中連續存儲多個元素的結構,在內存中的分配也是連續的,數組中的元素經過數組下標進行訪問,數組下標從0開始。例以下面這段代碼就是將數組的第一個元素賦值爲 1。sql
int[] data = new int[100];data[0] = 1;
1
2
優勢:
一、按照索引查詢元素速度快
二、按照索引遍歷數組方便數據庫
缺點:
一、數組的大小固定後就沒法擴容了
二、數組只能存儲一種類型的數據
三、添加,刪除的操做慢,由於要移動其餘的元素。數組
適用場景:
頻繁查詢,對存儲空間要求不大,不多增長和刪除的狀況。數據結構
二、棧
棧是一種特殊的線性表,僅能在線性表的一端操做,棧頂容許操做,棧底不容許操做。 棧的特色是:先進後出,或者說是後進先出,從棧頂放入元素的操做叫入棧,取出元素叫出棧。
棧的結構就像一個集裝箱,越先放進去的東西越晚才能拿出來,因此,棧常應用於實現遞歸功能方面的場景,例如斐波那契數列。多線程
三、隊列
隊列與棧同樣,也是一種線性表,不一樣的是,隊列能夠在一端添加元素,在另外一端取出元素,也就是:先進先出。從一端放入元素的操做稱爲入隊,取出元素爲出隊,示例圖以下:
使用場景:由於隊列先進先出的特色,在多線程阻塞隊列管理中很是適用。函數
四、鏈表
鏈表是物理存儲單元上非連續的、非順序的存儲結構,數據元素的邏輯順序是經過鏈表的指針地址實現,每一個元素包含兩個結點,一個是存儲元素的數據域 (內存空間),另外一個是指向下一個結點地址的指針域。根據指針的指向,鏈表能造成不一樣的結構,例如單鏈表,雙向鏈表,循環鏈表等。
鏈表的優勢:
鏈表是很經常使用的一種數據結構,不須要初始化容量,能夠任意加減元素;
添加或者刪除元素時只須要改變先後兩個元素結點的指針域指向地址便可,因此添加,刪除很快;學習
缺點:
由於含有大量的指針域,佔用空間較大;
查找元素須要遍歷鏈表來查找,很是耗時。優化
適用場景:
數據量較小,須要頻繁增長,刪除操做的場景
五、樹
樹是一種數據結構,它是由n(n>=1)個有限節點組成一個具備層次關係的集合。把它叫作 「樹」 是由於它看起來像一棵倒掛的樹,也就是說它是根朝上,而葉朝下的。它具備如下的特色:
每一個節點有零個或多個子節點;
沒有父節點的節點稱爲根節點;
每個非根節點有且只有一個父節點;
除了根節點外,每一個子節點能夠分爲多個不相交的子樹;
在平常的應用中,咱們討論和用的更多的是樹的其中一種結構,就是二叉樹。
二叉樹是樹的特殊一種,具備以下特色:
一、每一個結點最多有兩顆子樹,結點的度最大爲2。
二、左子樹和右子樹是有順序的,次序不能顛倒。
三、即便某結點只有一個子樹,也要區分左右子樹。
二叉樹是一種比較有用的折中方案,它添加,刪除元素都很快,而且在查找方面也有不少的算法優化,因此,二叉樹既有鏈表的好處,也有數組的好處,是二者的優化方案,在處理大批量的動態數據方面很是有用。
擴展:
二叉樹有不少擴展的數據結構,包括平衡二叉樹、紅黑樹、B+樹等,這些數據結構二叉樹的基礎上衍生了不少的功能,在實際應用中普遍用到,例如mysql的數據庫索引結構用的就是B+樹,還有HashMap的底層源碼中用到了紅黑樹。這些二叉樹的功能強大,但算法上比較複雜,想學習的話仍是須要花時間去深刻的。
六、散列表
散列表,也叫哈希表,是根據關鍵碼和值 (key和value) 直接進行訪問的數據結構,經過key和value來映射到集合中的一個位置,這樣就能夠很快找到集合中的對應元素。
記錄的存儲位置=f(key)
這裏的對應關係 f 成爲散列函數,又稱爲哈希 (hash函數),而散列表就是把Key經過一個固定的算法函數既所謂的哈希函數轉換成一個整型數字,而後就將該數字對數組長度進行取餘,取餘結果就看成數組的下標,將value存儲在以該數字爲下標的數組空間裏,這種存儲空間能夠充分利用數組的查找優點來查找元素,因此查找的速度很快。
哈希表在應用中也是比較常見的,就如Java中有些集合類就是借鑑了哈希原理構造的,例如HashMap,HashTable等,利用hash表的優點,對於集合的查找元素時很是方便的,然而,由於哈希表是基於數組衍生的數據結構,在添加刪除元素方面是比較慢的,因此不少時候須要用到一種數組鏈表來作,也就是拉鍊法。拉鍊法是數組結合鏈表的一種結構,較早前的hashMap底層的存儲就是採用這種結構,直到jdk1.8以後才換成了數組加紅黑樹的結構,其示例圖以下:
從圖中能夠看出,左邊很明顯是個數組,數組的每一個成員包括一個指針,指向一個鏈表的頭,固然這個鏈表可能爲空,也可能元素不少。咱們根據元素的一些特徵把元素分配到不一樣的鏈表中去,也是根據這些特徵,找到正確的鏈表,再從鏈表中找出這個元素。
哈希表的應用場景不少,固然也有不少問題要考慮,好比哈希衝突的問題,若是處理的很差會浪費大量的時間,致使應用崩潰。
七、堆
堆是一種比較特殊的數據結構,能夠被看作一棵樹的數組對象,具備如下的性質:
堆中某個節點的值老是不大於或不小於其父節點的值;
堆老是一棵徹底二叉樹。
將根節點最大的堆叫作最大堆或大根堆,根節點最小的堆叫作最小堆或小根堆。常見的堆有二叉堆、斐波那契堆等。
堆的定義以下:n個元素的序列{k1,k2,ki,…,kn}當且僅當知足下關係時,稱之爲堆。
(ki <= k2i,ki <= k2i+1)或者(ki >= k2i,ki >= k2i+1), (i = 1,2,3,4…n/2),知足前者的表達式的成爲小頂堆,知足後者表達式的爲大頂堆,這二者的結構圖能夠用徹底二叉樹排列出來,示例圖以下:
由於堆有序的特色,通常用來作數組中的排序,稱爲堆排序。
八、圖
圖是由結點的有窮集合V和邊的集合E組成。其中,爲了與樹形結構加以區別,在圖結構中經常將結點稱爲頂點,邊是頂點的有序偶對,若兩個頂點之間存在一條邊,就表示這兩個頂點具備相鄰關係。
按照頂點指向的方向可分爲無向圖和有向圖: 圖是一種比較複雜的數據結構,在存儲數據上有着比較複雜和高效的算法,分別有鄰接矩陣 、鄰接表、十字鏈表、鄰接多重表、邊集數組等存儲結構,這裏不作展開,讀者有興趣能夠本身學習深刻。