6. 數(shù)據(jù)結(jié)構(gòu) - B 樹

這篇文章收錄在我的 Github 上 algorithms-tutorial,另外記錄了些算法題解笆呆,感興趣的可以看看呵曹,轉(zhuǎn)載請注明出處脏款。

我們面臨一個實際的問題:就是在大規(guī)模的數(shù)據(jù)存儲中,實現(xiàn)數(shù)據(jù)索引查詢的背景下退盯,這樣會導致二叉查找樹結(jié)構(gòu)由于樹的深度過大而導致磁盤 I/O 讀寫過于頻繁彼乌,進而導致查詢效率低下。

那么我們需要一種機制減少樹的深度:這也就是 B 樹的思想渊迁,采用多叉樹結(jié)構(gòu)

(一) 基本概念:

m階(m 必須是奇數(shù)) B-樹是一個 m 路樹 (即每個節(jié)點最多可以含有 m 個子節(jié)點)

一棵 B-樹是一棵平衡的 m 路搜索樹慰照,它或者是空樹,或者它一般具有以下性質(zhì):

  1. 根結(jié)點的兒子數(shù)為[2, M]
  2. 除根結(jié)點以外的非葉子節(jié)點的兒子數(shù)為[M/2, M]
  3. 每個結(jié)點存放至少M/2-1(取上整)和至多M-1個關(guān)鍵字
  4. 每個節(jié)點的關(guān)鍵字比它的子節(jié)點個數(shù)少 1 (葉結(jié)點除外)
  5. 所有的葉子都在同一個層級

B-樹具有良好的平衡性(因為其所有的葉子都在同一個層級)

優(yōu)點:保證只有少數(shù)的磁盤訪問琉朽,解決數(shù)據(jù)結(jié)構(gòu)不在主存中的數(shù)據(jù)存儲問題毒租。
B 樹 可以為系統(tǒng)最優(yōu)化地對大塊數(shù)據(jù)進行讀和寫的操作,普遍運用在數(shù)據(jù)庫和文件系統(tǒng)箱叁。

(二) 基本操作:

1墅垮、查找元素:

B-樹的搜索,從根結(jié)點開始耕漱,對結(jié)點內(nèi)的關(guān)鍵字(有序)序列進行二分查找算色,如果命中則結(jié)束,否則進入查詢關(guān)鍵字所屬范圍的兒子結(jié)點螟够;重復灾梦,直到所對應的兒子指針為空,或已經(jīng)是葉子結(jié)點;

例如:1.在一棵 5 階B-樹中查找元素 29

4.gif

首先29比根節(jié)點值大斥废,所以找根節(jié)點的右子數(shù)椒楣,然后再根據(jù)值得判斷,發(fā)現(xiàn) 29 介于 28 和 48 之間牡肉,然后在從中間子樹繼續(xù)查找下去捧灰。

2.同樣在該樹查找一個不存在元素 54

5.gif

2、插入元素:

在插入一個元素到一棵 B-樹中的葉子節(jié)點時(可能該樹只有一個根結(jié)點)统锤,結(jié)果導致該葉子包含的元素個數(shù)加 1毛俏。

這時候就需要討論:

第一步:如果該節(jié)點的元素個數(shù)還沒達到 m,則插入完后無需處理

比如:在 B-樹中插入元素 3

14.gif

第二步:如果該節(jié)點元素個數(shù)達到 m 時饲窿,這時候?qū)⒃夭迦氲胶线m的位置煌寇,將最中間的元素取出,成為該節(jié)點的父節(jié)點元素逾雄,然后將其余左右元素拆成兩個新節(jié)點

比如:在 B-樹中插入元素 44

13.gif

第三步剛才的操作可能導致父節(jié)點的元素個數(shù)達到 m阀溶,這時候用情況 2 迭代處理,直到如果遇到根結(jié)點元素個數(shù)達到 m鸦泳,則最中間元素將成為新的根結(jié)點银锻。

比如:在 B-樹中插入元素 45

6.gif

3、刪除元素:

我們需要分兩種情況進行討論:

一做鹰、如果該元素存在于葉子結(jié)點击纬,直接刪除它,無需進行其它處理钾麸。

7.gif

二更振、如果該元素存在于非葉子節(jié)點,那么刪除它將會留下一個空位饭尝,這時候我們需要一些處理來填充該位置

因為節(jié)點的元素個數(shù)在 [M/2, M] 的范圍內(nèi)肯腕,所以比如這里我們以 5 階B-樹為例,判斷節(jié)點元素是否充足即滿足個數(shù)則至少擁有三(2 + 1)個元素的節(jié)點才算是有充足的元素芋肠。

1.如果被刪元素的左子樹擁有足夠的元素乎芳,這時候我們只需拿左子節(jié)點的最大值元素上來填充即可

例如:在 B-樹中刪除元素 23

8.gif

2.當左子樹不夠元素而右子樹元素充足時遵蚜,這時候我們拿右子樹的最小值元素上來進行填充

例如:在 B-樹中刪除元素 35

10.gif

3.當左右子樹所含元素均不足時帖池,但左子樹的左邊兄弟節(jié)點的元素個數(shù)充足,這時我們需要拿左邊的兄弟節(jié)點來進行調(diào)整吭净。

例如:在 B-樹中刪除元素 16

![Upload 12.gif failed. Please try again.]

4.當左右子樹所含元素均不足時睡汹,但左子樹的左邊兄弟節(jié)點的元素個數(shù)也不足時,這時候我們還是拿左子樹的最大值元素進行填充寂殉,之后再將該節(jié)點與其他節(jié)點合并形成新的節(jié)點囚巴。

例如:在 B-樹中刪除元素 40

11.gif

最大容納量計算:

假設(shè)這是有棵 m 階 B-樹,則每層所能容納最多元素個數(shù)為:

根節(jié)點: m - 1
level1: m(m - 1)
level2: m^2(m - 1)
...
leveln: m^n(m - 1)

因此一棵樹高為 h 的 B-樹最多能容納的元素為 m^(h + 1) - 1 即(將上面式子相加)

例如:一課 5 階 B-樹的高度為 2,則該樹所能容納最多元素個數(shù)為 5^3 - 1 = 124

(三) 2-3 樹:

當 m = 3 時彤叉,此時的 B-樹又稱為 2-3 樹庶柿,因為之前實驗課要求 Java 實現(xiàn) 2-3 樹,實現(xiàn)細節(jié)就不細說秽浇,我放在 Github 上面浮庐,感興趣的可以去看一看。

參考資料:

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末柬焕,一起剝皮案震驚了整個濱河市审残,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌斑举,老刑警劉巖搅轿,帶你破解...
    沈念sama閱讀 206,378評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異富玷,居然都是意外死亡璧坟,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,356評論 2 382
  • 文/潘曉璐 我一進店門赎懦,熙熙樓的掌柜王于貴愁眉苦臉地迎上來沸柔,“玉大人,你說我怎么就攤上這事铲敛『峙欤” “怎么了?”我有些...
    開封第一講書人閱讀 152,702評論 0 342
  • 文/不壞的土叔 我叫張陵伐蒋,是天一觀的道長工三。 經(jīng)常有香客問我,道長先鱼,這世上最難降的妖魔是什么俭正? 我笑而不...
    開封第一講書人閱讀 55,259評論 1 279
  • 正文 為了忘掉前任,我火速辦了婚禮焙畔,結(jié)果婚禮上掸读,老公的妹妹穿的比我還像新娘。我一直安慰自己宏多,他們只是感情好儿惫,可當我...
    茶點故事閱讀 64,263評論 5 371
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著伸但,像睡著了一般肾请。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上更胖,一...
    開封第一講書人閱讀 49,036評論 1 285
  • 那天铛铁,我揣著相機與錄音隔显,去河邊找鬼。 笑死饵逐,一個胖子當著我的面吹牛括眠,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播倍权,決...
    沈念sama閱讀 38,349評論 3 400
  • 文/蒼蘭香墨 我猛地睜開眼哺窄,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了账锹?” 一聲冷哼從身側(cè)響起萌业,我...
    開封第一講書人閱讀 36,979評論 0 259
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎奸柬,沒想到半個月后生年,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 43,469評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡廓奕,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 35,938評論 2 323
  • 正文 我和宋清朗相戀三年抱婉,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片桌粉。...
    茶點故事閱讀 38,059評論 1 333
  • 序言:一個原本活蹦亂跳的男人離奇死亡蒸绩,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出铃肯,到底是詐尸還是另有隱情患亿,我是刑警寧澤,帶...
    沈念sama閱讀 33,703評論 4 323
  • 正文 年R本政府宣布押逼,位于F島的核電站步藕,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏挑格。R本人自食惡果不足惜咙冗,卻給世界環(huán)境...
    茶點故事閱讀 39,257評論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望漂彤。 院中可真熱鬧雾消,春花似錦、人聲如沸挫望。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,262評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽士骤。三九已至范删,卻和暖如春蕾域,著一層夾襖步出監(jiān)牢的瞬間拷肌,已是汗流浹背到旦。 一陣腳步聲響...
    開封第一講書人閱讀 31,485評論 1 262
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留巨缘,地道東北人添忘。 一個月前我還...
    沈念sama閱讀 45,501評論 2 354
  • 正文 我出身青樓,卻偏偏與公主長得像若锁,于是被迫代替她去往敵國和親搁骑。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 42,792評論 2 345

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

  • B樹的定義 一棵m階的B樹滿足下列條件: 樹中每個結(jié)點至多有m個孩子又固。 除根結(jié)點和葉子結(jié)點外仲器,其它每個結(jié)點至少有m...
    文檔隨手記閱讀 13,183評論 0 25
  • 原文鏈接 B樹 1.前言: 動態(tài)查找樹主要有:二叉查找樹(Binary Search Tree),平衡二叉查找樹(...
    非典型程序員閱讀 1,148評論 0 3
  • B樹 1.前言: 動態(tài)查找樹主要有:二叉查找樹(Binary Search Tree)仰冠,平衡二叉查找樹(Balan...
    鐵甲依然在_978f閱讀 1,443評論 0 4
  • B-樹,就是B樹识虚,B樹的原英文名是B-tree,所以很多翻譯為B-樹,就會很多人誤以為B-樹是一種樹肢扯、B樹是另外一...
    xx1994閱讀 23,599評論 1 17
  • A趴在桌子上睡著了。 門“砰”地一下被帶上担锤,迎面走過來三個彪形大漢蔚晨。其中一個,金鏈子肛循;另一個蛛株,穿著施虐一般的衣服,...
    我認識簡書的CEO閱讀 393評論 0 0