數據結構與算法(十一) B樹

B樹

是一種平衡的多路搜索樹,多用於文件系統、數據庫的實現數據庫

  • 1個節點能夠存儲超過2個元素、能夠擁有超過2個子節點
  • 擁有二叉搜索樹的一些特質(小的子節點在左面 大的子節點在右面)
  • 平衡,每一個節點的全部子樹高度一致
  • 比較矮

m階B樹性質

一個節點最多擁有m個子節點3d

  • 假設一個節點存儲元素個數爲x
    • 根節點:1 \leq  x  \leq  m-1
    • 非根節點:(ceiling(m/2) - 1) \leq x \leq = m-1
    • 若是有子節點 子節點個數爲y = x + 1
  • 若是有子節點
    • 根節點上的子節點:2 \leq y \leq m
    • 非跟節點上的子節點:ceiling(m/2) \leq x \leq = m

celing爲向上取整cdn

  • 若是要是m = 3
    • 他的子節點個數爲2 \leq y \leq 3,所以可稱爲(2,3)樹、2-3樹。
  • 若是要是m = 4
    • 他的子節點個數爲2 \leq y \leq 4,所以可稱爲(2,4)樹、2-3-4樹。
  • 若是要是m = 5
    • 他的子節點個數爲3 \leq y \leq 5,所以可稱爲(3,5)樹、3-4-5樹。

B樹和二叉搜索樹的關係

  • B樹其實適合二叉搜索樹是等價的
    • 只要把二叉搜索樹和部分子節點與父節點結合就生成了b樹
  • 多代節點合併,能夠得到一個超級節點
    • 兩代合併最多有4個子節點
  • m階B樹最多須要log{2^m}代合併

搜索

  • 一、如今節點內部從小到大搜索元素
  • 二、若是命中,搜索結束
  • 三、若是未命中,再去對應的子節點去搜索元素,重複步驟1

添加

元素必然是添加到葉子節點中blog

上溢

  • 假設3階B樹,當節點添加第三個數據的時候(最多添加兩個) 叫上溢

假設B樹的階級爲m, 上溢節點最中間的節點爲kit

  • 上溢的節點元素必然等於m
解決上溢
  • 將k位置的元素向上與父節點合併
  • 將[0,k - 1]和[k + 1,m - 1]位置的元素分裂成兩個子節點
    • 這兩個子節點的元素個數,必然都不會低於最低限制(ceiling(m/2) - 1)
  • 一次分裂完畢後,可能致使父節點上溢,重複上述方法
    • 最極端的狀況是,一直上溢到根節點。
以4階B樹添加舉例

刪除

葉子節點

​ 直接刪除io

非葉子節點

  • 找到前驅或者後繼,覆蓋刪除所須要的元素的值。
  • 在把前驅或者後繼刪掉。
  • 非葉子節點的前驅或者後繼必然在葉子節點中

下溢

  • 假設5階B樹,葉子節點最低個數爲ceiling(m/2) - 1 = 2個 當刪除後只剩下一個的時候 稱爲下溢
解決下溢:
  • 下溢的元素必然是ceiling(m/2) - 1 個
  • 若是下溢的節點的臨近兄弟節點至少有(ceiling(m/2))個元素,能夠向其借一個元素(最後一個元素)
    • 將父節點最後一個元素插入到下節點的最小位置
    • 將借來的元素插入到父節點最小位置
  • 若是下溢的節點的臨近兄弟節點只有(ceiling(m/2)) - 1
    • 將父節點的中間元素挪下來與左右子節點進行合併
    • 合併後的節點元素等於ceil(m/2) + ceil(m/2) - 2; 不超過m - 1
      • 可能致使父節點下溢,下溢可能一直向上傳播。(若是根節點下溢 就和子節點合併)
以4階B樹刪除舉例

喜歡的能夠關注下個人公衆號,會在第一時間更新class

相關文章
相關標籤/搜索