算法导轮之B树的学习
生活随笔
收集整理的這篇文章主要介紹了
算法导轮之B树的学习
小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
最近學習了算法導輪里B樹相關的知識,在此寫一篇博客作為總結。
?
1.引言
B樹是為磁盤或其他直接存取的輔助存儲設備而設計的一種平衡搜索樹。B樹類似于紅黑樹,但它與紅黑樹最大不同之處在于B樹的節(jié)點可以擁有很多孩子,因此B樹的高度會比紅黑樹小很多,也因此B樹在磁盤I/O方面表現(xiàn)要比紅黑樹好。(對于磁盤操作最耗時的部分在于磁盤讀寫,而每次讀取一個新的樹的節(jié)點就必須進行一次磁盤讀取,因此節(jié)點較大、樹高度較小的B樹會進行較少的磁盤I/O操作)2.B樹的定義
一顆B樹的定義如下:- n表示存儲在該節(jié)點的關鍵字個數(shù)
- n個關鍵字本身key1、key2……keyn以非降序存放,即key1 <= key2 <= …… <= keyn
- 一個leaf布爾值表示該節(jié)點是否為葉節(jié)點
3.B樹的插入
要講到樹,就不得不提樹中關鍵的插入與刪除操作,這里我們先總結B樹的插入操作。 當我們往B樹中插入一個新的關鍵字時,由于B樹節(jié)點的關鍵字是受到限制的,因此當一個節(jié)點關鍵字數(shù)目為2t-1時(該節(jié)點是滿的),我們就必須進行分裂操作。分裂節(jié)點
分裂節(jié)點的主要操作為把滿節(jié)點的中間關鍵字提升至父節(jié)點,把原滿節(jié)點分裂為中間關鍵字的兩個左右節(jié)點 其示意圖如下: 對于某個非滿的節(jié)點x,若其孩子節(jié)點x.ci為滿的(即孩子節(jié)點的關鍵字數(shù)目為2t-1)。則把其孩子節(jié)點的中間關鍵字(S)提升為父節(jié)點(x節(jié)點)的關鍵字,并把原孩子節(jié)點(x.c節(jié)點)分成兩個t-1個關鍵字的節(jié)點,分別位于中間關鍵字(S)的左、右。 還有一種比較特殊的情況就是B樹根的分裂: 分裂是B樹長高的唯一途徑,因此分裂是非常重要的。插入
講完分裂操作在講插入操作就非常簡單了。插入的時候我們通過比較不斷地根據關鍵字的值尋找孩子節(jié)點,當發(fā)現(xiàn)一個滿的節(jié)點時便分裂,最后找到對應的葉節(jié)點時根據關鍵字的值插入相應位置即可。 下面是一個插入關鍵字的例子: B樹的初始狀態(tài)如圖所示,這是一顆最小度數(shù)為3的B樹,即他的關鍵字個數(shù)為2~5個。 插入關鍵字B,在根節(jié)點由于(B < G)往進入G的左節(jié)點,到達葉節(jié)點后添加至A與C關鍵字之間。 插入關鍵字Q:4.B樹的刪除
講完了B樹的插入操作,我們再來講講B樹的刪除操作。 對于刪除操作,我們必須保證每個節(jié)點在刪除前必須至少有t(最小度數(shù))個關鍵字。 首先我們把要刪除的關鍵字(假設為k)分兩種情況:- 關鍵字k在葉節(jié)點中:直接刪除
- 關鍵字k在內部節(jié)點中,分三種情況:
- k的左子節(jié)點擁有t個關鍵字,則把k的左子節(jié)點的最后一個關鍵字(假設為j)上移到父節(jié)點,然后遞歸的刪除j
- k的右子節(jié)點擁有t個關鍵字,則把k的右子節(jié)點的第一個關鍵字(假設為l)上移到父節(jié)點,然后遞歸的刪除l
- k的左右子節(jié)點都只有t-1個關鍵字,則把k下降與左右子節(jié)點合并成一個擁有2t-1個關鍵字的節(jié)點,然后遞歸的刪除k
轉載于:https://www.cnblogs.com/KingIceMou/p/6984141.html
總結
以上是生活随笔為你收集整理的算法导轮之B树的学习的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 关于面试,我也有说的
- 下一篇: JAVA多线程--Thinking in