2-3樹 B樹 b+樹

STL裏面的map和set底層結構都是紅黑樹,這種樹雖然達到了近乎完美的平衡性,但是在維護這顆樹上可是花了很大的時間在上面,在數據庫海量數據的情況下,一個在一個紅黑樹插入一個節點可能要耗費比較長的時間,我們發現極致的平衡,在海量數據面前好像並不怎麼適用,所以聰明的科學家就提出2-3樹,這種數據結構。它是B樹,B+樹的祖先,讓我們一窺它的奧祕。

2-3查找樹

爲了保證查找樹的平衡性,我們需要一些靈活性,因此在這裏我們允許樹中的一個結點保存多個鍵。確切地說,我們將一棵標準的二叉查找樹中的結點稱爲2-結點(含有一個鍵和兩條鏈接),而現在我們引入3-結點,它含有兩個鍵和三條鏈接。2- 結點和3-結點中的每條鏈接都對應着其中保存的鍵所分割產生的一個區間。
定義:

  • 2結點,含有一個鍵和兩條鏈接,左連接指向的2-3樹中的鍵都小於該節點,右鏈接指向的2-3樹中的鍵都大於該結點
  • 3結點,含有兩個鍵和三條鏈接,左鏈接指向的2-3樹中的鍵都小於該結點,中鏈接指向的2-3樹中的鍵都位於該結點的兩            個鍵之間,右鏈接都指向的2-3樹中的鍵都大於該結點。

查找:

首先將它和根節點中的鍵比較,如果它和其中任意一個相等,查找命中,否則我們就根據比較的結果找到指向相應區間的鏈接,並在其指向的子樹中遞歸地繼續查找,,如果是一個空鏈接則查找未命中。

插入:

1、向2-結點中插入新鍵

如果未命中的查找結束於一個2-結點,將這個2-結點替換成一個3-結點。

 

2、向一顆只含有三結點的數中插入新鍵

    爲了新鍵的插入,我們先臨時將新鍵存入該節點中,使之成爲一個4-結點,很容易將它轉換爲一顆由3個2-結點組成的2-3樹,其中根節點含有中鍵,小的在左連接,大的在右鏈接,2-3數的高度增長1。

 

3、向一個父節點爲2-結點的3-結點中插入新鍵

將3-結點變成一個4-結點,將中鍵插入到父節點中,父節點變成3-結點,高度不變

 

4、向一個父節點爲3-結點的3-結點插入新鍵

    將它變成臨時的4-結點,將他的中鍵插入到父結點中,父結點再向上構造,如果碰到2-結點,則將其變成3-結點,如果最終根也是3結點,最終分解根節點,樹的高度+1,

 以上看到的就是2-3樹的概念和插入操作,接下來我們來看B樹。

B樹

B樹是一種多路平衡查找樹,它的每一個節點最多包含K個孩子,K被稱爲B樹的階,K的大小取決於磁盤頁的大小。

一個M階的B樹具有以下幾個特徵:

1、根節點至少有兩個子女

2、每個中間節點都包含K-1個元素和K個孩子,其中 m/2<=k<=m

3、每個葉子節點都包含K-1個元素,其中m/2<=k<=m

4、所有的葉子節點都位於同一層。

5、每個節點中的元素從小到大排列,節點當中k-1個元素正好是K個孩子包含的元素的值域分劃。

3階b樹

 b樹在查詢過程中比較次數不比二叉樹少,但是它的磁盤IO次數比較少,內存中的比較耗時幾乎可以忽略,

b樹的插入,和2-3-樹的插入非常相似,

 

B樹的優勢有:始終維持多路平衡,

B樹主要用於文件系統以及部分數據庫索引,非關係型數據庫MongoDB

B+樹

B+樹是基於B樹的一種變體,有着比B樹更高的查詢性能

一個m階的B+樹具有如下幾個特徵:

1、有K個子樹的中間節點包含K個元素(B樹中是K-1個元素K個鏈接),每個元素不保存數據,只用來索引,所有的數據都保存在葉子節點。

2、所有的葉子結點中包含了全部元素的信息,以及指向含這些元素記錄的指針,且葉子結點本身依關鍵字的大小自小而大順序鏈接。

3、所有的中間結點元素都同時存在於子節點,在子節點元素中是最大(或最小)元素。

 

特點:每一個父節點的元素都出現在子節點中,是子節點的最大(或最小)元素。

根節點的最大元素,也就等同於整個B+樹的最大元素,以後無論插入刪除多少元素,始終要保持最大元素在根節點中。至於葉子節點,由於父節點的元素都出現在子節點,因此所有的葉子節點包含了全部的元素信息。並且每一個葉子節點都帶有指向下一個葉節點的指針,形成了一個有序鏈表。

B+樹還具有一個特點,就是[衛星數據]的位置:所謂衛星數據,指的是索引元素所指向的數據記錄,比如在數據庫中的某一行。在B樹中,無論中間節點還是葉子節點都帶有衛星數據。

B+樹中的衛星數據

需要補充的是,在數據庫的聚集索引中,葉子節點直接包含衛星數據,在非聚集索引中,葉子節點帶有指向衛星數據的指針。 

 B+樹的優點:

B+樹的好處主要體現在查詢性能上,通過單行查詢和範圍查詢來分析。

單行查詢:B+樹的中間節點沒有衛星數據,同樣大小的磁盤頁可以容納更多的節點元素。意味着,數據量相同的情況下,B+樹的結構比B樹更加矮胖,因此查詢時IO次數更少。其次,B+樹的查詢必須最終查找到葉子節點,而B樹只要找到匹配元素即可,無論匹配的元素處於中間節點還是葉子節點。因此B-樹的查找性能並不穩定,但是B+樹每次查找都是穩定的。

範圍查找:B樹只能進行頻繁的中序遍歷,而B+樹的遍歷只需要在鏈表上做遍歷即可。

B+樹比B樹的優勢有三個

1、IO次數更少

2、查詢性能更加穩定

3、查詢範圍簡便

 以上知識參考:

  • 算法 第四版
  • 程序員小灰微信公衆號,如果有講的不清楚的地方大家可以去以上兩個地方汲取

說明B-樹和B樹是一個東西,他們都叫B樹,沒有B減樹的叫法。

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