數(shù)據(jù)結構與算法(第一季):B樹

一蚌本、B樹性質

1、初識B樹

image
  • B樹是一種平衡的多路搜索樹堂竟,多用于文件系統(tǒng)魂毁,數(shù)據(jù)庫的實現(xiàn)。
  • B樹特點:
    • 一個節(jié)點可以存儲超過2個元素出嘹,可以擁有超過2個子節(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
image

3、B樹 VS 二叉搜索樹

  • 二叉搜索樹的節(jié)點合并曙旭,可以成為B樹盗舰。
  • 多代(父和子)節(jié)點合并,可以獲得一個超級節(jié)點(類似3階B樹中的1833節(jié)點桂躏,2330節(jié)點)钻趋。
    • 2代合并的超級節(jié)點,最多擁有4個子節(jié)點(至少是4階B樹)剂习。
    • 3代合并的超級節(jié)點蛮位,最多擁有8個子節(jié)點(至少是8階B樹)。
    • n代合并的超級節(jié)點鳞绕,最多擁有2^n個子節(jié)點(至少是2^n階B樹)失仁。
image
  • 1833合并,2330合并们何,2021合并萄焦,4547合并,5052合并垂蜗。即將一個B樹變?yōu)?code>二叉搜索樹楷扬。
image

二、B樹的操作

1贴见、搜索

  • 先在節(jié)點內(nèi)部從小到大搜索元素烘苹。
  • 如果命中,搜索結束片部。
  • 如果未命中镣衡,再去對應的子節(jié)點中搜索元素,重復步驟1档悠。
image
  • 假設搜索72廊鸥,首先在根節(jié)點做比較,72大于40辖所,所以接著在根節(jié)點右子樹搜索惰说,72大于60小于80,繼續(xù)在6080之間的子樹尋找缘回,因為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é)點90100的中間仆百。

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大于6080叠赦,繼續(xù)往80右子樹比較驹马,98大于9095除秀,小于100糯累,所以將98插入在95100中間。
  • 插入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眼刃,將5554和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)整猖任。
image
  • 如果下溢節(jié)點臨近的兄弟節(jié)點,只有(>= m/2(向下取整) - 1)個元素瓷耙。
    • 將父節(jié)點的元素b挪下來跟左右子節(jié)點進行合并朱躺。
    • 合并后的節(jié)點元素個數(shù)等于m/2(向下取整) + m/2(向下取整) - 2,不超過m-1哺徊。
    • 這個操作可能會導致父節(jié)點下溢室琢,依然按照上述方法解決,下溢現(xiàn)象可能會一直往上傳播落追。
  • 添加元素導致的下溢盈滴,是唯一一種可能導致B樹變矮的操作。
?著作權歸作者所有,轉載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市巢钓,隨后出現(xiàn)的幾起案子病苗,更是在濱河造成了極大的恐慌,老刑警劉巖症汹,帶你破解...
    沈念sama閱讀 219,427評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件硫朦,死亡現(xiàn)場離奇詭異,居然都是意外死亡背镇,警方通過查閱死者的電腦和手機咬展,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,551評論 3 395
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來瞒斩,“玉大人破婆,你說我怎么就攤上這事⌒卮眩” “怎么了祷舀?”我有些...
    開封第一講書人閱讀 165,747評論 0 356
  • 文/不壞的土叔 我叫張陵,是天一觀的道長烹笔。 經(jīng)常有香客問我,道長谤职,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,939評論 1 295
  • 正文 為了忘掉前任锅很,我火速辦了婚禮扔仓,結果婚禮上,老公的妹妹穿的比我還像新娘咖耘。我一直安慰自己翘簇,他們只是感情好,可當我...
    茶點故事閱讀 67,955評論 6 392
  • 文/花漫 我一把揭開白布儿倒。 她就那樣靜靜地躺著版保,像睡著了一般呜笑。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上彻犁,一...
    開封第一講書人閱讀 51,737評論 1 305
  • 那天叫胁,我揣著相機與錄音,去河邊找鬼汞幢。 笑死驼鹅,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的森篷。 我是一名探鬼主播输钩,決...
    沈念sama閱讀 40,448評論 3 420
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼仲智!你這毒婦竟也來了张足?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 39,352評論 0 276
  • 序言:老撾萬榮一對情侶失蹤坎藐,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后哼绑,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體岩馍,經(jīng)...
    沈念sama閱讀 45,834評論 1 317
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,992評論 3 338
  • 正文 我和宋清朗相戀三年抖韩,在試婚紗的時候發(fā)現(xiàn)自己被綠了蛀恩。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 40,133評論 1 351
  • 序言:一個原本活蹦亂跳的男人離奇死亡茂浮,死狀恐怖双谆,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情席揽,我是刑警寧澤顽馋,帶...
    沈念sama閱讀 35,815評論 5 346
  • 正文 年R本政府宣布,位于F島的核電站幌羞,受9級特大地震影響寸谜,放射性物質發(fā)生泄漏。R本人自食惡果不足惜属桦,卻給世界環(huán)境...
    茶點故事閱讀 41,477評論 3 331
  • 文/蒙蒙 一熊痴、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧聂宾,春花似錦果善、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,022評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春惜论,著一層夾襖步出監(jiān)牢的瞬間许赃,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,147評論 1 272
  • 我被黑心中介騙來泰國打工馆类, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留混聊,地道東北人。 一個月前我還...
    沈念sama閱讀 48,398評論 3 373
  • 正文 我出身青樓乾巧,卻偏偏與公主長得像句喜,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子沟于,可洞房花燭夜當晚...
    茶點故事閱讀 45,077評論 2 355

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