一蚌本、B樹性質
1、初識B樹
image
- B樹是一種平衡的
多路
搜索樹堂竟,多用于文件系統(tǒng)魂毁,數(shù)據(jù)庫的實現(xiàn)。 - B樹特點:
- 一個節(jié)點可以存儲超過
2
個元素出嘹,可以擁有超過2
個子節(jié)點席楚。 - 擁有二叉樹的一些性質。
- 平衡税稼,每個節(jié)點的所有子樹高度一致烦秩。
- 比較矮。
- 一個節(jié)點可以存儲超過
2郎仆、m階B樹的性質(m >= 2)
- 假設一個節(jié)點存儲的元素個數(shù)為
x
只祠。- 根節(jié)點個數(shù):
1 <= x <= m-1
,三階B樹根節(jié)點
數(shù)大于等于1
并且小于等于2
扰肌。 - 非根節(jié)點:
(m / 2)(向下取整) - 1 <= x <= m - 1
- 如果有子節(jié)點抛寝,子節(jié)點個數(shù)
y = x + 1
- 根節(jié)點:
2 <= y <= m
- 非根節(jié)點:
(m / 2)(向下取整) <= y <= m
- 根節(jié)點:
- 根節(jié)點個數(shù):
image
3、B樹 VS 二叉搜索樹
- 將
二叉搜索樹
的節(jié)點合并曙旭,可以成為B樹
盗舰。 -
多代(父和子)節(jié)點
合并,可以獲得一個超級節(jié)點
(類似3階B樹中的18
和33
節(jié)點桂躏,23
和30
節(jié)點)钻趋。-
2代
合并的超級節(jié)點
,最多擁有4
個子節(jié)點(至少是4階B樹
)剂习。 -
3代
合并的超級節(jié)點
蛮位,最多擁有8
個子節(jié)點(至少是8階B樹
)。 -
n代
合并的超級節(jié)點
鳞绕,最多擁有2^n
個子節(jié)點(至少是2^n階B樹
)失仁。
-
image
- 將
18
和33
合并,23
和30
合并们何,20
和21
合并萄焦,45
和47
合并,50
和52
合并垂蜗。即將一個B樹
變?yōu)?code>二叉搜索樹楷扬。
image
二、B樹的操作
1贴见、搜索
- 先在節(jié)點內(nèi)部
從小到大
搜索元素烘苹。 - 如果命中,搜索結束片部。
- 如果未命中镣衡,再去對應的
子節(jié)點
中搜索元素,重復步驟1
档悠。
image
- 假設搜索
72
廊鸥,首先在根節(jié)點
做比較,72
大于40
辖所,所以接著在根節(jié)點
的右子樹
搜索惰说,72
大于60
小于80
,繼續(xù)在60
和80
之間的子樹尋找缘回,因為72
大于70
吆视,所以需要繼續(xù)往70
的右子樹
尋找,但是右子樹
為空酥宴,所以得出結論72
不在該B樹
上啦吧。
2、添加
- 新添加的元素必定是添加到
葉子節(jié)點
拙寡。
image
- 假設插入
55
授滓,首先在根節(jié)點
做比較,55
大于40
肆糕,所以接著在根節(jié)點
的右子樹
搜索般堆,55
小于60
,繼續(xù)在60
的左子樹
尋找擎宝,55
大于50
郁妈,所以將55
插入在節(jié)點50
的右側。
image
- 假設插入
95
绍申,首先在根節(jié)點
做比較噩咪,95
大于40
,所以接著在根節(jié)點
的右子樹
搜索极阅,95
大于80
胃碾,繼續(xù)在80
的右子樹
尋找,95
大于90
小于100
筋搏,所以將95
插入在節(jié)點90
和100
的中間仆百。
3、上溢
image
- 假設再插入
98
呢奔脐?(假設這是一顆4階B樹
)- 最右下角的葉子節(jié)點的元素個數(shù)將超過限制俄周。
- 這種現(xiàn)象可以稱之為:
上溢(overflow)
吁讨。
4、上溢的解決
- 假設
5階B樹
峦朗。
image
- 上溢節(jié)點的元素個數(shù)必然等于
m(5)
建丧。 - 假設上溢節(jié)點最
中間元素
的位置為k(3)
。 - 將
k
位置的元素向上
與父節(jié)點合并
波势。 - 將
[0,k-1]
和[k+1,m-1]
位置的元素分裂成2
個子節(jié)點
翎朱,這2
個子節(jié)點的元素個數(shù),必然都不會低于最低限制(m / 2(向下取整) - 1)
尺铣。
image
- 一次分裂完畢后拴曲,有可能導致
父節(jié)點上溢
凛忿,依然按照上述方法解決澈灼。
image
- 最極端的情況,有可能一致分裂到
根節(jié)點
侄非。 - 添加元素導致的上溢蕉汪,是唯一一種可能導致B樹
長高
的操作。
5逞怨、添加導致上溢的例子
image
- 插入
98
image
-
98
大于根節(jié)點
者疤,繼續(xù)往根節(jié)點
右子樹比較,98
大于60
和80
叠赦,繼續(xù)往80
右子樹比較驹马,98
大于90
,95
除秀,小于100
糯累,所以將98
插入在95
和100
中間。 - 插入
98
之后册踩,90 95 98 100
節(jié)點溢出泳姐,需要上溢
,將中間元素95或98
向上與父節(jié)點合并
暂吉,將90胖秒,98,100
節(jié)點分裂成2
個子節(jié)點慕的。 - 插入
52
image
- 插入
54
image
6阎肝、刪除
- 假如需要
刪除
的元素在葉子節(jié)點
中,那么直接刪除
即可肮街。
image
- 刪除
30
image
- 假如需要
刪除
的元素在非葉子節(jié)點
中风题。- 先找到前驅或后繼元素,
覆蓋
所需刪除元素的值。 - 再把前驅或后繼元素刪除沛硅。
- 先找到前驅或后繼元素,
- 刪除
60
image
-
60
的前驅為55
眼刃,將55
從54和55
節(jié)點中刪除,并將55
覆蓋60
摇肌。
image
-
非葉子節(jié)點
的前驅或后繼元素鸟整,必定在葉子節(jié)點
中。- 所以這里的刪除前驅或后繼元素朦蕴,就是最開始提到的情況:刪除的元素在葉子節(jié)點中。
- 真正的刪除元素都發(fā)生在葉子節(jié)點中弟头。
7吩抓、下溢
image
- 假設一顆
5階B樹
,刪除22
赴恨。 - 葉子節(jié)點被刪除一個元素后疹娶,元素個數(shù)可能會低于最低限制
(>= m/2(向下取整) - 1)
。 - 這種現(xiàn)象稱為:
下溢(underflow)
伦连。
8雨饺、下溢的解決
- 下溢節(jié)點的元素數(shù)量必然等于
(m/2(向下取整) - 2)
。 - 如果下溢節(jié)點臨近的
兄弟節(jié)點
惑淳,有至少m/2(向下取整)
個元素额港,可以向其借一個元素。
image
- 綠色節(jié)點在刪除一個元素后歧焦,節(jié)點元素個數(shù)低于最低限制
(>= m/2(向下取整) - 1)
移斩。- 為了使樹繼續(xù)滿足B樹的要求,需要對綠色節(jié)點進行
下溢
操作绢馍。 - 將父節(jié)點的元素
b
插入到下溢節(jié)點的0
位置(最小位置)向瓷。 - 用兄弟節(jié)點的元素
a
(最大的元素)替代父節(jié)點的元素b
。 - 這種操作其實就是:
旋轉
舰涌。 - 注意子節(jié)點
d
也需要調(diào)整猖任。
- 為了使樹繼續(xù)滿足B樹的要求,需要對綠色節(jié)點進行
image
- 如果下溢節(jié)點臨近的兄弟節(jié)點,只有
(>= m/2(向下取整) - 1)
個元素瓷耙。- 將父節(jié)點的元素b挪下來跟左右子節(jié)點進行
合并
朱躺。 - 合并后的節(jié)點元素個數(shù)等于
m/2(向下取整) + m/2(向下取整) - 2
,不超過m-1
哺徊。 - 這個操作可能會導致父節(jié)點下溢室琢,依然按照上述方法解決,下溢現(xiàn)象可能會一直往上傳播落追。
- 將父節(jié)點的元素b挪下來跟左右子節(jié)點進行
- 添加元素導致的下溢盈滴,是唯一一種可能導致B樹
變矮
的操作。