B+樹和B*樹的底層實現原理以及與b-樹的區別

B+樹和B*樹的底層實現原理以及與b-樹的區別

B+樹

B+樹是B-樹的變形,也是一種多路平衡樹

  1. 其定義基本與B-樹相同,除了:
  2. 非葉子節點的子樹指針與關鍵字個數相同
  3. 非葉子節點的子樹指針p[i],指向關鍵字值屬於(k[i],k[i+1])的子樹
  4. 爲所有葉子節點增加一個鏈指針
  5. 所有關鍵字都在葉子節點出現

在這裏插入圖片描述

B+樹的特性:

  1. 所有關鍵字都出現在葉子節點的鏈表中,且鏈表中的節點都是有序的。
  2. 不可能在非葉子節點中命中。
  3. 非葉子節點相當於是葉子節點的索引(稀疏索引),葉子節點相當於是存儲數據的數據層。
  4. 更適合文件索引系統

B+樹在節點訪問時間遠遠超過節點內部訪問時間的時候,可作爲替代的實現有着實在的優勢。這通常在多數節點在次級存儲比如硬盤中的時候出現。通過最大化在每個內部節點內的子節點的數目減少樹的高度,平衡操作不經常發生,而且效率增加了。這種價值得以確立通常需要每個節點在次級存儲中佔據完整的磁盤塊或近似的大小

B+背後的想法是內部節點可以有在預定範圍內的可變數目的子節點。因此,B+樹不需要象其他自平衡二叉查找樹那樣經常的重新平衡。對於特定的實現在子節點數目上的低和高邊界是固定的。

查找
查找以典型的方式進行,類似於二叉查找樹。起始於根節點,自頂向下遍歷樹,選擇其分離值在要查找值的任意一邊的子指針。在節點內部典型的使用是二分查找來確定這個位置。
插入
節點要處於違規狀態,它必須包含在可接受範圍之外數目的元素。
首先,查找要插入其中的節點的位置。接着把值插入這個節點中。
如果沒有節點處於違規狀態則處理結束。
如果某個節點有過多元素,則把它分裂爲兩個節點,每個都有最小數目的元素。在樹上遞歸向上繼續這個處理直到到達根節點,如果根節點被分裂,則創建一個新根節點。爲了使它工作,元素的最小和最大數目典型的必須選擇爲使最小數不小於最大數的一半。
刪除
首先,查找要刪除的值。接着從包含它的節點中刪除這個值。
如果沒有節點處於違規狀態則處理結束。
如果節點處於違規狀態則有兩種可能情況:
它的兄弟節點,就是同一個父節點的子節點,可以把一個或多個它的子節點轉移到當前節點,而把它返回爲合法狀態。如果是這樣,在更改父節點和兩個兄弟節點的分離值之後處理結束。
它的兄弟節點由於處在低邊界上而沒有額外的子節點。在這種情況下把兩個兄弟節點合併到一個單一的節點中,而且我們遞歸到父節點上,因爲它被刪除了一個子節點。持續這個處理直到當前節點是合法狀態或者到達根節點,在其上根節點的子節點被合併而且合併後的節點成爲新的根節點。

B*樹

B*樹是B+樹的變形,在B+樹的非根和非葉子節點再增加指向兄弟節點的指針。

在這裏插入圖片描述

B樹定義了非葉子結點關鍵字個數至少爲(2/3)M,即塊的最低使用率爲2/3(代替B+樹的1/2) ;
B+樹的分裂:當一個結點滿時,分配一個新的結點,並將原結點中1/2的數據複製到新結點,最後在父結點中增加新結點的指針; B+樹的分裂隻影響原結點和父結點,而不會影響兄弟結點,所以它不需要指向兄弟的指針;
B
樹的分裂:當一個結點滿時,如果它的下一個兄弟結點未滿,那麼將一部分數據移到兄弟結點中,再在原結點插入關鍵字,最後修改父結點中兄弟結點的關鍵字(因爲兄弟結點的關鍵字範圍改變了) ;如果兄弟也滿了,則在原結點與兄弟結點之間增加新結點,並各複製1/3的數據到新結點,最後在父結點增加新結點的指針;所以,B
樹分配新結點的概率比B+樹要低,空間使用率更高;

B-樹和B+樹和B*樹的區別

**B-樹:**多路搜索平衡樹,每個結點存儲M/2到M個關鍵字,非葉子結點存儲指向關鍵字範圍的子結點;所有關鍵字在整顆樹中出現,且只出現一次,非葉子結點可以命中;
**B+樹:**在B-樹基礎上,爲葉子結點增加鏈表指針,所有關鍵字都在葉子結點中出現,非葉子結點作爲葉子結點的索引; B+樹總是到葉子結點才命中;
**B*樹:**在B+樹基礎上,爲非葉子結點也增加鏈表指針,將結點的最低利用率從1/2提高到2/3;

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