【戀上數(shù)據(jù)結(jié)構(gòu)與算法一】(十)B樹(shù)

B樹(shù)(B-tree刨晴、B-樹(shù))

? B樹(shù)是一種平衡的多路搜索樹(shù),多用于文件系統(tǒng)垛玻、數(shù)據(jù)庫(kù)的實(shí)現(xiàn)

? 仔細(xì)觀察B樹(shù),有什么眼前一亮的特點(diǎn)?
1奶躯、1 個(gè)節(jié)點(diǎn)可以存儲(chǔ)超過(guò) 2 個(gè)元素帚桩、可以擁有超過(guò) 2 個(gè)子節(jié)點(diǎn)
2、擁有二叉搜索樹(shù)的一些性質(zhì)
3嘹黔、平衡账嚎,每個(gè)節(jié)點(diǎn)的所有子樹(shù)高度一致
3、比較矮

m階B樹(shù)的性質(zhì)(m≥2)

?假設(shè)一個(gè)節(jié)點(diǎn)存儲(chǔ)的元素個(gè)數(shù)為 x
根節(jié)點(diǎn):1 ≤ x ≤ m ? 1

非根節(jié)點(diǎn):┌ m/2 ┐ ? 1 ≤ x ≤ m ? 1

如果有子節(jié)點(diǎn)儡蔓,子節(jié)點(diǎn)個(gè)數(shù) y = x + 1
?根節(jié)點(diǎn):2 ≤ y ≤ m

?非根節(jié)點(diǎn):┌ m/2 ┐ ≤ y ≤ m
?比如 m = 3郭蕉,2 ≤ y ≤ 3,因此可以稱為(2, 3)樹(shù)喂江、2-3樹(shù)
?比如 m = 4召锈,2 ≤ y ≤ 4,因此可以稱為(2, 4)樹(shù)获询、2-3-4樹(shù)
?比如 m = 5涨岁,3 ≤ y ≤ 5,因此可以稱為(3, 5)樹(shù)
?比如 m = 6吉嚣,3 ≤ y ≤ 6梢薪,因此可以稱為(3, 6)樹(shù)
?比如 m = 7,4 ≤ y ≤ 7尝哆,因此可以稱為(4, 7)樹(shù)

注釋:┌ ┐表示向上取整

?思考:如果 m = 2秉撇,那B樹(shù)是什么樣子?
?你猜數(shù)據(jù)庫(kù)實(shí)現(xiàn)中一般用幾階B樹(shù)?
200 ~ 300

B樹(shù) VS 二叉搜索樹(shù)

?B樹(shù) 和 二叉搜索樹(shù),在邏輯上是等價(jià)的

?多代節(jié)點(diǎn)合并秋泄,可以獲得一個(gè)超級(jí)節(jié)點(diǎn)
2代合并的超級(jí)節(jié)點(diǎn)琐馆,最多擁有 4 個(gè)子節(jié)點(diǎn)(至少是 4階B樹(shù))
3代合并的超級(jí)節(jié)點(diǎn),最多擁有 8 個(gè)子節(jié)點(diǎn)(至少是 8階B樹(shù))
n代合并的超級(jí)節(jié)點(diǎn)恒序,最多擁有 2?個(gè)子節(jié)點(diǎn)( 至少是 2?階B樹(shù))

?m階B樹(shù)啡捶,最多需要 log2m 代合并

搜索

? 跟二叉搜索樹(shù)的搜索類似

  1. 先在節(jié)點(diǎn)內(nèi)部從小到大開(kāi)始搜索元素
  2. 如果命中,搜索結(jié)束
  3. 如果未命中奸焙,再去對(duì)應(yīng)的子節(jié)點(diǎn)中搜索元素瞎暑,重復(fù)步驟1

添加

? 新添加的元素必定是添加到葉子節(jié)點(diǎn)

?插入55

?插入95

?再插入 98 呢?(假設(shè)這是一棵 4階B樹(shù))
最右下角的葉子節(jié)點(diǎn)的元素個(gè)數(shù)將超過(guò)限制
這種現(xiàn)象可以稱之為:上溢(overflow)

添加 – 上溢的解決(假設(shè)5階)

?上溢節(jié)點(diǎn)的元素個(gè)數(shù)必然等于 m

?假設(shè)上溢節(jié)點(diǎn)最中間元素的位置為 k
將 k 位置的元素向上與父節(jié)點(diǎn)合并

將 [0, k-1] 和 [k + 1, m - 1] 位置的元素分裂成 2 個(gè)子節(jié)點(diǎn)
?這 2 個(gè)子節(jié)點(diǎn)的元素個(gè)數(shù)彤敛,必然都不會(huì)低于最低限制(┌ m/2 ┐ ? 1)

? 一次分裂完畢后,有可能導(dǎo)致父節(jié)點(diǎn)上溢了赌,依然按照上述方法解決
最極端的情況墨榄,有可能一直分裂到根節(jié)點(diǎn)

添加

?插入 98

?插入 52

?插入 54

刪除 – 葉子節(jié)點(diǎn)

?假如需要?jiǎng)h除的元素在葉子節(jié)點(diǎn)中,那么直接刪除即可

?刪除 30

刪除 – 非葉子節(jié)點(diǎn)

?假如需要?jiǎng)h除的元素在非葉子節(jié)點(diǎn)中

1.先找到前驅(qū)或后繼元素勿她,覆蓋所需刪除元素的值

2.再把前驅(qū)或后繼元素刪除

?刪除 60

?非葉子節(jié)點(diǎn)的前驅(qū)或后繼元素袄秩,必定在葉子節(jié)點(diǎn)中
所以這里的刪除前驅(qū)或后繼元素 ,就是最開(kāi)始提到的情況:刪除的元素在葉子節(jié)點(diǎn)中
真正的刪除元素都是發(fā)生在葉子節(jié)點(diǎn)中

刪除 – 下溢

?刪除 22 ?(假設(shè)這是一棵 5階B樹(shù))
葉子節(jié)點(diǎn)被刪掉一個(gè)元素后逢并,元素個(gè)數(shù)可能會(huì)低于最低限制( ≥ ┌ m/2 ┐ ? 1 )
這種現(xiàn)象稱為:下溢(underflow)

刪除 – 下溢的解決

?下溢節(jié)點(diǎn)的元素?cái)?shù)量必然等于 ┌ m/2 ┐ ? 2
?如果下溢節(jié)點(diǎn)臨近的兄弟節(jié)點(diǎn)之剧,有至少 ┌ m/2 ┐ 個(gè)元素,可以向其借一個(gè)元素
將父節(jié)點(diǎn)的元素 b 插入到下溢節(jié)點(diǎn)的 0 位置(最小位置)
用兄弟節(jié)點(diǎn)的元素 a(最大的元素)替代父節(jié)點(diǎn)的元素 b
這種操作其實(shí)就是:旋轉(zhuǎn)

?如果下溢節(jié)點(diǎn)臨近的兄弟節(jié)點(diǎn)砍聊,只有 ┌ m/2 ┐ ? 1 個(gè)元素
將父節(jié)點(diǎn)的元素 b 挪下來(lái)跟左右子節(jié)點(diǎn)進(jìn)行合并
合并后的節(jié)點(diǎn)元素個(gè)數(shù)等于┌ m/2 ┐ + ┌ m/2 ┐ ? 2背稼,不超過(guò) m ? 1
這個(gè)操作可能會(huì)導(dǎo)致父節(jié)點(diǎn)下溢,依然按照上述方法解決玻蝌,下溢現(xiàn)象可能會(huì)一直往上傳播

刪除

?刪除 22 ?(假設(shè)這是一棵 5階B樹(shù))

4階B樹(shù)

? 如果先學(xué)習(xí)4階B樹(shù)(2-3-4樹(shù))蟹肘,將能更好地學(xué)習(xí)理解紅黑樹(shù)

? 4階B樹(shù)的性質(zhì)
所有節(jié)點(diǎn)能存儲(chǔ)的元素個(gè)數(shù) x :1 ≤ x ≤ 3
所有非葉子節(jié)點(diǎn)的子節(jié)點(diǎn)個(gè)數(shù) y :2 ≤ y ≤ 4

?添加
從 1 添加到 22

?刪除
從1刪除到22

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市俯树,隨后出現(xiàn)的幾起案子帘腹,更是在濱河造成了極大的恐慌,老刑警劉巖许饿,帶你破解...
    沈念sama閱讀 219,539評(píng)論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件阳欲,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡陋率,警方通過(guò)查閱死者的電腦和手機(jī)胸完,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,594評(píng)論 3 396
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)翘贮,“玉大人赊窥,你說(shuō)我怎么就攤上這事±暌常” “怎么了锨能?”我有些...
    開(kāi)封第一講書(shū)人閱讀 165,871評(píng)論 0 356
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)芍耘。 經(jīng)常有香客問(wèn)我址遇,道長(zhǎng),這世上最難降的妖魔是什么斋竞? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,963評(píng)論 1 295
  • 正文 為了忘掉前任倔约,我火速辦了婚禮,結(jié)果婚禮上坝初,老公的妹妹穿的比我還像新娘浸剩。我一直安慰自己钾军,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,984評(píng)論 6 393
  • 文/花漫 我一把揭開(kāi)白布绢要。 她就那樣靜靜地躺著吏恭,像睡著了一般。 火紅的嫁衣襯著肌膚如雪重罪。 梳的紋絲不亂的頭發(fā)上樱哼,一...
    開(kāi)封第一講書(shū)人閱讀 51,763評(píng)論 1 307
  • 那天,我揣著相機(jī)與錄音剿配,去河邊找鬼搅幅。 笑死,一個(gè)胖子當(dāng)著我的面吹牛呼胚,可吹牛的內(nèi)容都是我干的茄唐。 我是一名探鬼主播,決...
    沈念sama閱讀 40,468評(píng)論 3 420
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼砸讳,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼琢融!你這毒婦竟也來(lái)了界牡?” 一聲冷哼從身側(cè)響起簿寂,我...
    開(kāi)封第一講書(shū)人閱讀 39,357評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎宿亡,沒(méi)想到半個(gè)月后常遂,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,850評(píng)論 1 317
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡挽荠,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,002評(píng)論 3 338
  • 正文 我和宋清朗相戀三年克胳,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片圈匆。...
    茶點(diǎn)故事閱讀 40,144評(píng)論 1 351
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡漠另,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出跃赚,到底是詐尸還是另有隱情笆搓,我是刑警寧澤,帶...
    沈念sama閱讀 35,823評(píng)論 5 346
  • 正文 年R本政府宣布纬傲,位于F島的核電站满败,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏叹括。R本人自食惡果不足惜算墨,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,483評(píng)論 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望汁雷。 院中可真熱鬧净嘀,春花似錦报咳、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 32,026評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至熬苍,卻和暖如春稍走,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背柴底。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,150評(píng)論 1 272
  • 我被黑心中介騙來(lái)泰國(guó)打工婿脸, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人柄驻。 一個(gè)月前我還...
    沈念sama閱讀 48,415評(píng)論 3 373
  • 正文 我出身青樓狐树,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親鸿脓。 傳聞我的和親對(duì)象是個(gè)殘疾皇子抑钟,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,092評(píng)論 2 355

推薦閱讀更多精彩內(nèi)容