B-樹、B+樹、B*樹淺談

B-樹

B-樹就是B樹(可能有部分人會習慣上把B-樹讀爲B減樹,其實並不存在B減樹,只是讀法上的不同而已),B就是balanced,平衡的意思。B-樹就是指的B樹,特此說明一下。
先介紹一下二叉搜索樹。

顧名思義,二叉搜索樹,即指最多擁有兩個叉,這裏的叉即爲所有非葉子結點的兒子(Lift和Right);
所有的結點存儲一個關鍵字;
非葉子結點的左指針指向小於其關鍵字的結點,右指針指向對於其關鍵字的結點,結構如下圖:
在這裏插入圖片描述
二叉搜索樹的搜索,從根結點開始,如果查詢的關鍵字與結點關鍵字相等,則該結點爲查詢的結點,如果查詢關鍵字比結點關鍵字小,則進入左子樹,反之則進入右子樹;如果左子樹爲空或者右子樹爲空,則返回查找不到響應的關鍵字。

B樹(B-樹),是一種多路搜索樹(並非二叉的):

  • 定義任意非葉子節點最多可以有M個兒子節點;且M>2;
  • 則根節點的兒子數爲:[2,M];
  • 除根節點爲的非葉子節點的兒子書爲[M/2,M];
  • 每個結點存放至少M/2 - 1 (去上整)且至多M -1 個關鍵字;(至少爲2);
  • 非葉子結點的關鍵字個數 = 指向子節點的指針書 -1;
  • 非葉子節點的關鍵字:K[1],K[2],K[3],…,K[M-1;且K[i] < K[i +1];
  • 非葉子結點的指針:P[1], P[2], …, P[M];其中P[1]指向關鍵字小於K[1]的子樹,P[M]指向關鍵字大於K[M-1]的子樹,其它P[i]指向關鍵字屬於(K[i-1], K[i])的子樹;
  • 所有葉子結點位於同一層;

如(M = 3)
在這裏插入圖片描述
B-樹的搜索,從根結點開始,對結點內的關鍵字(有序)序列進行二分查找,如果命中則結束,否則進入查詢關鍵字所屬範圍的兒子結點;重複,直到所對應的兒子指針爲空,或已經是葉子結點;

B-樹的特性:

  1. 關鍵字集合分佈在整顆樹中;
  2. 任何一個關鍵字出現且只出現在一個結點中;
  3. 搜索有可能在非葉子結點結束;
  4. 其搜索性能等價於在關鍵字全集內做一次二分查找;
  5. 自動層次控制;

B+樹
B+樹是B-樹的變體,也是一種多路搜索樹:

  • 其定義基本與B-樹相同;
  • 非葉子結點的子樹指針與關鍵字個數相同;
  • 非葉子結點的子樹指針P[i],指向關鍵字值屬於[K[i], K[i+1])的子樹(B-樹是開區間);
  • 爲所有葉子結點增加一個鏈指針;
  • 所有關鍵字都在葉子結點出現;

如:(M=3)
在這裏插入圖片描述
B+的搜索與B-樹也基本相同,區別是B+樹只有達到葉子結點才命中(B-樹可以在

非葉子結點命中),其性能也等價於在關鍵字全集做一次二分查找;

B+樹的特性:

1.所有關鍵字都出現在葉子結點的鏈表中(稠密索引),且鏈表中的關鍵字恰好是有序的;

2.不可能在非葉子結點命中;

3.非葉子結點相當於是葉子結點的索引(稀疏索引),葉子結點相當於是存儲(關鍵字)數據的數據層;

B*樹

B*樹是B+樹一種變形,它是在B+樹的基礎上,將索引層以指針連接起來,使搜索取值更加快捷。
如下圖(M = 3):
在這裏插入圖片描述
但是B乘樹又在B+樹的基礎上產生了一系列的變化,如下:

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

總結:

  • 二叉搜索樹:二叉樹,每個結點只存儲一個關鍵字且值大於左子樹,小於右子樹。
  • B(B-)樹:多路搜索樹,每個結點存儲M/2到M個關鍵字,非葉子結點存儲指向關鍵字範圍的子結點; 所有關鍵字在整顆樹
  • B+樹:在B-樹基礎上,爲葉子結點增加鏈表指針,所有關鍵字都在葉子結點中出現,非葉子結點作爲葉子結點的索引;B+樹總是到葉子結點才命中;
  • B*樹:在B+樹基礎上,爲非葉子結點也增加鏈表指針,將結點的最低利用率從1/2提高到2/3;
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章