B樹基本概念

B樹基本概念

概念

  • 爲磁盤或其它存儲設備設計的一種平衡搜索樹

  • 類似紅黑樹,區別:在降低磁盤IO操作數上更好,結點可以有很多孩子

  • 紅黑樹每個結點1個關鍵字,且至多左右2個子節點。B樹一個結點有n個關鍵字,則有n+1的子節點,n個關鍵字是n+1子節點的分隔域。

  • B樹也叫B-樹

  • B樹其它變種,如B+樹

性質

具有惟一根結點的B樹性質如下:

  1. 結點x的屬性

    • x.n:存儲在結點x中的關鍵字個數

    • x.key:表示結點x中的關鍵字,如x.key1、x.key2、x.key3...x.keyn,有序存放(非降序),x.key1<=x.key2<=...x.keyn

    • x.leaf:bool變量,結點x是否爲葉結點,true:是,false:不是

    • 另外,每個節點都存儲有值,或者指向值的指針

  2. 非葉子結點包含x.n + 1個指向孩子的指針,葉子結點沒有孩子,這個指針屬性沒有意義

  3. 結點中的關鍵字x.key是其子結點中關鍵字範圍的分割線。如:結點x的關鍵字爲k1<=k2<=k3,x有4個子結點c1,c2,c3,c4,c1中的關鍵字 <= k1 <= c2中的關鍵字 <= k2 <= c3中的關鍵字 <= k3 <= c4中的關鍵字.

  4. 每個葉結點具有相同的深度(樹的高度)

  5. 每個結點包含的關鍵字個數有上/下界。使用一個最小度數(固定整數t,t>=2)來表示。

    • 樹非空,根結點至少一個關鍵字

    • 根結點以外的每個結點至少t-1的關鍵字(下限),即t個子結點

    • 每個結點至多2t-1個關鍵字(上限),即2t個子結點,達到上限稱爲滿葉結點

如下是一棵B樹,其中的數字是關鍵字,t 是3,高度只畫了2層,再往下也類似,以關鍵字分隔,n個關鍵字分隔n+1個子結點

基本操作

p.s. 下面的所有操作假定都在內存中,沒有發生磁盤IO操作

創建空樹

  1. 創建一個根結點

  2. 設置其關鍵字個數爲0

  3. 設置其爲葉結點

插入

從根結點開始

  1. 如果是葉子結點,根據大小開始檢索插入位置:從最後一個關鍵字向前遍歷,將比其大的後移一位,直到找到合適位置並插入,關鍵字個數加1

  2. 非葉子結點:從當前結點遞歸向下查找,直到找到合適的葉子結點,進行步驟一。

    在查找過程中,遇到滿結點(2t-1個關鍵字)進行分裂,分裂過程:

    • 滿結點是根結點:創建一個空結點作爲新的根結點,將原根結點從中間(第t個關鍵字處)一分爲2,作爲新根結點的左右2個子樹,第t個關鍵字上升爲新根結點的關鍵字。此時樹的高度加1。

    • 滿結點x爲非根結點:

      1. 從中間(第t個關鍵字,關鍵字x.keyt)一分爲2,分爲y,z兩個結點,y結點是原來的x結點,z是新建結點,把其中的另一半關鍵字copy到z上。

      2. 將關鍵字x.keyt上升到父結點上,作爲父結點的關鍵字

    以上步驟,忽略屬性賦值過程,如:新建z結點時,z結點的leaf屬性和原x結點一樣;分爲左右子結點時,其父結點需要一個增加一個指針指向新建的右子結點。

刪除

增加結點,保證結點關鍵字個數不能超過2t-1,遇滿結點分裂;刪除結點,要求除根結點外,結點關鍵字個數不能少於t個(最小度數),否則需要合併。

從結點x中刪除關鍵字k,從根結點t開始向下:

  1. x是葉子結點且k是結點x的關鍵字,刪除k

  2. x是非葉子結點且k是x的關鍵字:

    • 如果x的k關鍵字的左邊子結點有至少t個關鍵字,從左子結點樹中找到k的前驅kp,將kp的值覆蓋x結點k的值(k已刪除),遞歸刪除kp

    • x的k關鍵字的右邊子結點有至少t個關鍵字,從右子結點樹中找到k的後繼kn,將kn的值覆蓋x結點k的值(k已刪除),遞歸刪除kn

    • x的k關鍵字的左右子結點都只有t-1關鍵字,將x中的k和右子結點所有關鍵字都合併到左子結點,釋放x的key和指向右子結點的指針;從左子結點遞歸刪除k

  3. k不是x的關鍵字,且k在x的某個子樹x.ck中:

    • x.ck只有t-1個關鍵字且相鄰兄弟有至少t個關鍵字:將父結點x的某個關鍵字給x.ck,將x.ck的兄弟結點的某個關鍵字給父結點x,這樣x.ck就有t個關鍵字

    • x.ck和它所有兄弟結點都是t-1個關鍵字:將x.ck和它某個兄弟合併,並把x的這個分隔的關鍵字拿下來作爲合併後的中間關鍵字,此時如果x是根結點且這個時候空了,那就移除x,並且合併後的結點作爲新的根結點

注意,一旦根結點關鍵字爲空,則它的惟一子結點作爲新的根結點,此時樹高減1。

搜索

類似二叉搜索樹,但是此時是結點的個關鍵字個數爲n,作n+1路搜索

B+樹

B樹變種,個人經驗多用於數據庫索引

和B樹的不同是非葉子結點(叫內部結點),都不是值,或者指向值的屬性。B樹每個結點都攜帶有值。B+樹是隻有葉子節點包含的有值,或者指向存值位置的指針。

B+樹相比B樹更適合索引的原因:具體涉及到內存、磁盤、IO操作數等建議看專業資料理解。簡單理解:查詢效率由IO操作數決定(回盤多少次),數據最終都是持久化到磁盤中,查詢數據時候的,內存以頁爲單位從磁盤加載數據。如果內部結點只有關鍵字沒有值,一次可加載更多關鍵字,數據更緊密,可減少更多IO操作。個人理解,僅供參考。

參考資料

《算法導論 第三版》

 

 

 

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