1. 程式人生 > >【面經筆記】B樹、B+樹

【面經筆記】B樹、B+樹

原文:

B樹、B+樹、儲存模型

參考:

B樹/多叉平衡查詢樹:

背景:

B樹是為磁碟設計的多路平衡搜尋樹。一個B樹節點通常和一個完整的磁碟頁一樣大,每次查詢的結點深度(根節點其實永久儲存在主存中)即為I/O操作的次數。由於其分支因子大,故其優勢是降低磁碟I/O操作次數

二叉樹的儲存能力有限,當元素過多時,樹的深度過大,退化為節點內部線性查詢,查詢效率低下。
為了降低樹的深度,採用多叉樹,多叉平衡查詢樹應運而生,即B樹(B-tree樹即B樹,B即Balanced,平衡的意思)。
B樹的各種操作能使B樹保持較低的高度,從而達到有效避免磁碟過於頻繁的查詢存取操作,從而有效提高查詢效率)。
減少IO操作是效率提升的關鍵。

M階B樹:
  • 根結點至少有兩個孩子
  • 每個結點至多有M個孩子
  • 除了根結點和葉結點,每個結點至少有[M/2]個孩子:孩子個數:[M/2]~M
  • 除了根結點,每個結點的關鍵字個數n必須滿足:[M/2]-1<= n<=M-1
  • 所有葉子結點出現在同一層
  • 位於m-1和m key的子節點的值位於m-1 和m key對應的Value之間

[*]為向上取整

B樹插入操作:

B樹的插入在葉結點,當結點空間滿了,則分裂為兩個相鄰結點,中間關鍵字上移到父節點中。
若父節點也滿了,同樣分裂並上移,
直至根節點,若根節點也滿了,則中間元素上移到新的根結點中,樹的深度增加一層

B樹刪除操作:

先刪除:

  • 若沒有左右孩子結點,則直接刪除,否則將孩子結點中相近的結點上移到當前節點中。

然後調整平衡性:
若某節點元素小於[M/2]-1,則:
- 若相鄰兄弟元素大於[M/2]-1,從相鄰兄弟借一個元素
- 若相鄰兄弟元素小於等於[M/2]-1,則合併兩結點

B+樹:

B+樹將所有衛星資料都存放在葉結點中,內部結點只存放關鍵字和孩子指標,因此最大化了內部結點的分支因子。且所有的葉子結點和相連的節點使用連結串列相連,便於範圍查詢和遍歷。

  1. 有n棵子樹的結點中含有n個關鍵字; (而B樹是n棵子樹有n-1個關鍵字)

  2. 所有的葉子結點中包含了全部關鍵字的資訊,及指向含有這些關鍵字記錄的指標,且葉子結點本身依關鍵字的大小自小而大的順序連結。(而B樹的葉子節點並沒有包括全部需要查詢的資訊)

  3. 所有的非終端結點可以看成是索引部分,結點中僅含有其子樹根結點中最大(或最小)關鍵字。 (而B 樹的非終節點也包含需要查詢的有效資訊)

B+ 樹的優點在於

由於B+樹在內部節點上不好含資料資訊,因此在記憶體頁中能夠存放更多的索引資訊,查詢所需的IO次數減少
資料存放的更加緊密,具有更好的空間區域性性。因此訪問葉子幾點上關聯的資料也具有更好的快取命中率。

B+樹的葉子結點都是相鏈的,因此對整棵樹的遍歷只需要一次線性遍歷葉子結點即可。而且由於資料順序排列並且相連,所以支援範圍查詢和搜尋。而B樹則需要進行每一層的遞迴遍歷。相鄰的元素可能在記憶體中不相鄰,所以快取命中性沒有B+樹好。

手畫B樹、B+樹