要搞清這個幾個資料結構的問題,需要搞清楚他們的原理,並且有什麼問題,然後每乙個新的結構能解決什麼問題。為什麼會出現?為什麼就用他了。
hash表:
首先hash表查序你很快,通過hash函式可以在o(1)的時間就能找到key值,且都是在記憶體中操作。hash表的內部實現可以已有兩種方式解決hash衝突問題。乙個是順序找新地方放,乙個是通過鍊錶的方式記錄衝突的key值。順序防止有占用bucket空間的問題和bucket key清楚後的特殊標記問題。同時還帶有空間擴容問題。所以一般採用鍊錶的方式解決衝突,但是鍊錶的方式也存在問題,雖然插入刪除很快,但是查詢時候需要遍歷鍊錶,效能上是問題。
二叉搜尋樹:
所以再次基礎上通過二叉搜尋樹(中序遍歷有序)的方式替換鍊錶。相當於查詢的話是二分查詢(時間複雜度o(logn))。但是二叉搜尋樹有乙個問題,就是這棵樹在某些極端場景下會是一顆鍊錶,這樣的話就和鍊錶的方式一樣時間複雜度就成了o(n).顯然這對hash的效率影響很大,為此為了解決這個問題就需要一顆二叉搜尋平衡樹,也就是不會變成乙個鍊錶,二叉樹的高度相差不超過1.此時就出現了紅黑樹。
紅黑樹:
紅黑樹是一顆二叉樹,且是平衡的,搜尋樹。因此滿足快速查詢,插入,刪除的特點。先不要去關紅黑樹怎麼實現的,為什麼一會是紅一會是黑,這個是演算法就這樣規定了。記住就行,或者有時間可以在細研究原理。紅黑樹在刪除和插入時候需要調整樹的平衡狀態,因此會存在紅黑樹的旋轉,這樣的目的是調整樹為平衡狀態。這樣紅黑樹作為hash解決hash衝突的鍊錶後,都能大大提公升hash表的效能。但是總體來講hash表,因為bucket需要提前預分配,資料都在記憶體中,即便使用紅黑樹,紅黑樹的節點都在記憶體中。這樣就閒置了hash後者紅黑樹不可能處理大量的資料,因此記憶體畢竟有限。那麼在處理大量資料比如mysql, 儲存引擎處理的資料量(tb/pb)級別時候使用hash 紅黑樹就出現了很大的問題。那怎麼解決呢?還有乙個問題就是紅黑樹,hash表只能查詢單個key比較搞笑,但是如果要查詢乙個範圍的資料在只能乙個乙個的遍歷,效能也不高。在乙個是紅黑樹因為是二叉樹,大資料量層次會很高,如果不是全部放記憶體的話,則需要去盤上讀,這樣讀盤額次數就會變多。所以。。就出現了下面的資料結構。
b樹:b樹是乙個多叉樹,意思就是乙個節點可以有多個子節點(b樹中叫多少介多少介)。這樣有個好處就是這個樹不會太高,因此放盤的io就會變少。整棵樹按照索引(就是表的key來組織,比如表示userid<->name,則按照userid作為這個樹的索引構建這棵樹),此時當有索引插入b樹時候,b樹會根據當前節點儲存的關鍵字的個數(就是能儲存多少個userid<->name對)來新增進乙個樹的節點頁面中。如果關鍵字的個數已經達到設定的最大值比如 4個,則新增加進來的的userid會導致這個節點**。**的意思就是按照(4+1)/2=2的方式,將前面2個分離成3號位的前面(左)子樹,後面兩個**成3號位userid的右子樹(後面子樹)。然後3好上公升新增到父節點裡面去。這也就是說當往b樹中插入刪除時候會導致樹**合併等操作。這樣當去遍歷某個key的時候,則從root開始就知道往那邊走,區間在**。然後一層一層的往下找,最終找到對應的節點,讀取裡面儲存的userid的name值。但是b資料也存在乙個問題就是範圍查詢的問題,也需要不停的遍歷某個範圍的所有的節點才能找到,而是都需要從root開始。所以在範圍查詢上效能也不好,為此提出了b+樹。
b+樹和b樹一樣,b+樹也存在樹的**和合併的操作,原理和b樹大概差不多。但是b+樹和b樹有亮點很不錯一樣的就是:b+樹非葉子節點不儲存資料,儲存的是索引也就是一堆userid,所以乙個非葉子節點可以儲存很多usrid.這樣這棵樹可以做到很矮,很胖,這樣對磁碟的訪問次數再次降低。第二點是b+樹的葉子積極點之間都是通過雙向鍊錶鏈結的。為什麼要這樣,因為這樣就是就便於範圍查詢,比如需要查序userid<100的同學的名字,則只需要從root開始遍歷找到100 userid的葉子節點,然後從葉子節點讀取到資料,小於100的資料都在從這個節點開始向左直接就可以讀取到,不用在從root遍歷來,這樣就提高了效能。所以b+樹就誕生了。
從二叉排序樹到平衡二叉樹再到紅黑樹系列3
這篇部落格主要講解b樹及其插入刪除操作,並給出操作的流程圖以達到清晰易懂的目的,儘管標題是從二叉排序樹到平衡二叉樹再到紅黑樹系列3,沒有b樹二字,但他們都是動態查詢樹,所以我將他們歸為乙個系列。b樹的定義有如下兩種,但殊途同歸。定義形式一 以度 t 定義 一棵b樹t 具有以下性質 1.每個結點x有下...
從B樹到B 樹
最近在看作業系統和資料庫系統,當涉及到查詢檔案和建立資料庫索引時書中反覆提到使用b 樹可以實現高效的查詢,於是我迫不及待地想研究一下b 樹的內部結構。首先從二叉查詢樹開始講起。二叉搜尋樹 binarysearch tree 別名又叫二叉查詢樹,二叉排序樹。它是一棵空樹或者是滿足以下條件的二叉樹 它的...
平衡二叉樹 紅黑樹 B樹 B 樹總結
平衡二叉樹具有以下性質 它是一棵空樹或它的左右兩個子樹的高度差的絕對值不超過1,並且左右兩個子樹都是一棵平衡二叉樹。作用 當原序列有序時,提高搜尋效率。平衡因子 平衡二叉樹中不存在平衡因子大於 1 的節點。在一棵平衡二叉樹中,節點的平衡因子只能取 0 1 或者 1。最小失衡子樹 在新插入的結點向上查...