B樹、B+樹、B*樹

詳細內容,參見July博文:從B 樹、B+ 樹、B* 樹談到R 樹

基本概念

提出背景

在大規模數據存儲中,爲實現索引查詢,二叉查找樹結構由於樹的深度過大(二路結構導致存儲節點有限!)而造成磁盤I/O讀寫過於頻繁,進而導致查詢效率低下。

在不減少查詢數據量的情況下,爲減少樹的深度,採用多叉樹結構。(磁盤查找存取的次數往往由樹的高度所決定)

B 樹(平衡多路查找樹)是爲了磁盤或其它存儲設備而設計的一種多叉平衡查找樹,與紅黑樹很相似,但在降低磁盤I/0操作方面要更好一些。許多數據庫系統都一般使用B樹或者B樹的各種變形結構(B+、B*)來存儲信息。

總結

B樹:有序數組+平衡多叉樹

B+樹:有序數組鏈表+平衡多叉樹

B*樹:一棵豐滿的B+樹

B樹

遞歸定義
一棵M階的B樹滿足以下定義:
1. 樹中每個結點最多含有m個孩子(m>=2)
2. 除根結點和葉子結點外,其它每個結點至少有[ceil(m / 2)]個孩子
3. 若根結點不是葉子結點,則至少有2個孩子(特殊情況:沒有孩子的根結點,即根結點爲葉子結點,整棵樹只有一個根節點)
4. 所有葉子結點都出現在同一層,葉子結點不包含任何關鍵字信息(可以看做是外部接點或查詢失敗的接點,實際上這些結點不存在,指向這些結點的指針都爲null)
5. 每個非終端結點中包含有n個關鍵字信息: (n,P0,K1,P1,K2,P2,……,Kn,Pn)。其中: Ki (i=1…n)爲關鍵字,且關鍵字按順序升序排序K(i-1)< Ki。 Pi爲指向子樹根的接點,且指針P(i-1)指向子樹種所有結點的關鍵字均小於Ki,但都大於K(i-1)。關鍵字的個數n必須滿足: [ceil(m / 2)-1]<= n <= m-1

B+樹

應文件系統所需而產生的一種B-tree的變形樹。

與B樹的區別:

  1. .有n棵子樹的結點中含有n-1 個關鍵字
  2. 所有的葉子結點中包含了全部關鍵字的信息,及指向含有這些關鍵字記錄的指針,且葉子結點本身依關鍵字的大小自小而大的順序鏈接。 (而B 樹的葉子節點並沒有包括全部需要查找的信息)
  3. 所有的非終端結點可以看成是索引部分,結點中僅含有其子樹根結點中最大(或最小)關鍵字。 (而B 樹的非終節點也包含需要查找的有效信息)

特點:

  1. 磁盤讀寫代價更低。內部結點並沒有指向關鍵字具體信息的指針。因此其內部結點相對B 樹更小。如果把所有同一內部結點的關鍵字存放在同一盤塊中,那麼盤塊所能容納的關鍵字數量也越多。一次性讀入內存中的需要查找的關鍵字也就越多。相對來說IO讀寫次數也就降低了。
  2. 查詢效率更加穩定。由於非終結點並不是最終指向文件內容的結點,而只是葉子結點中關鍵字的索引。所以任何關鍵字的查找必須走一條從根結點到葉子結點的路。所有關鍵字查詢的路徑長度相同,導致每一個數據的查詢效率相當。
    這裏寫圖片描述

B*樹

B*tree是B+樹的變體,在B+樹的基礎上(所有的葉子結點中包含了全部關鍵字的信息,及指向含有這些關鍵字記錄的指針),B*樹中非根和非葉子結點再增加指向兄弟的指針;B*樹定義了非葉子結點關鍵字個數至少爲(2/3)*M,即塊的最低使用率爲2/3(代替B+樹的1/2)。

B+樹的分裂:當一個結點滿時,分配一個新的結點,並將原結點中1/2的數據複製到新結點,最後在父結點中增加新結點的指針;B+樹的分裂隻影響原結點和父結點,而不會影響兄弟結點,所以它不需要指向兄弟的指針。

B*樹的分裂:當一個結點滿時,如果它的下一個兄弟結點未滿,那麼將一部分數據移到兄弟結點中,再在原結點插入關鍵字,最後修改父結點中兄弟結點的關鍵字(因爲兄弟結點的關鍵字範圍改變了);如果兄弟也滿了,則在原結點與兄弟結點之間增加新結點,並各複製1/3的數據到新結點,最後在父結點增加新結點的指針。

所以,B*樹分配新結點的概率比B+樹要低,空間使用率更高

這裏寫圖片描述

發佈了94 篇原創文章 · 獲贊 23 · 訪問量 14萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章