關于B-樹問題的演示圖解

大家好少梁,我是“Stephen·謝”矫付,之前有講到樹(Tree)的概念凯沪,還演示了二叉查找樹和紅黑樹這兩種經典樹的相關內容买优,其中引入了一個“自平衡”的概念妨马,這個自平衡特性對樹結構而言相當?shù)闹匾鞘刮覀兊臉浣Y構變得實用方便的重要手段烘跺。由此,開始下面B樹(B-Tree即Balance Tree)的講解脂崔。


首先補充一點,標題中的"B-樹"就是“B樹”砌左,它們都是B-Tree的翻譯脖咐,里面不是減號-铺敌,是連接符-屁擅。因為有人把B-Tree讀成"B-樹"偿凭,讓人誤以為“B樹”和"B-樹"是兩種樹派歌,實際上兩者都是同一種樹弯囊。還有,大家在讀的時候千萬不要讀成“B減樹”匾嘱,讀成“B樹”就行了,不然就外行了稽物。

下面開始今天正文,我們依然從數(shù)據(jù)庫的檢索開始贝或,我們知道數(shù)據(jù)庫的索引是使用樹結構來實現(xiàn)的吼过,是因為樹的查詢效率高咪奖,而且還可以保持有序的狀態(tài)盗忱。上篇中講到的二叉查找樹效率就很高,但是為什么沒有使用二叉查找樹來實現(xiàn)索引呢趟佃?其實從算法邏輯上講,二叉查找樹的查找次數(shù)和比較次數(shù)都是最小的昧捷,但是我們必須還要考慮一個現(xiàn)實問題:磁盤的IO(磁盤讀寫)。

數(shù)據(jù)庫的索引是存儲在磁盤上的靡挥,當數(shù)據(jù)量非常大的時候序矩,索引的大小可能有幾個G甚至更多跋破,當我們利用索引查詢的時候顯然不可能將整個索引全部加載到內存簸淀,正常的操作都是逐一加載每一個磁盤頁,這里的磁盤頁就對應著索引樹的節(jié)點租幕。


索引樹和磁盤頁

我們如果利用二叉查找樹做索引結構,查找情形是什么樣子的呢拧簸?假設樹的高度是4,要查找的值是10。

以此二叉查找樹為例查10
這是第1次和第2次磁盤IO的結果
這是第3次和第4次磁盤IO的結果

磁盤IO的次是4次珠叔,即樹的高度,最壞的情況就是磁盤IO的次數(shù)等于索引樹的高度祷安。既然如此姥芥,為了減少磁盤IO的次數(shù)汇鞭,我們就需要把原來的“瘦高”樹結構變得“矮胖”凉唐,這就是本文所要說的B-樹的特征之一霍骄。

B-樹(以下都稱作B樹)是一種多路平衡查找樹台囱,它的每個節(jié)點最多包含k個孩子,其中簿训,k被稱為B數(shù)的階,k的大小取決于磁盤頁的大小米间。

一個m階的B樹具備如下幾個特征:

1强品、根節(jié)點至少有兩個子女屈糊;

2的榛、每個中間節(jié)點都包含k-1個元素和k個孩子逻锐,其中m/2<=k<=m夫晌;

3、每個葉子節(jié)點都包含k-1個元素昧诱,其中m/2<=k<=m晓淀;

4盏档、所有的葉子節(jié)點都位于同一層要糊;

5妆丘、每個節(jié)點中的元素從小到大排列局劲,節(jié)點當中k-1個元素正好是k個孩子包含的元素的值域劃分勺拣。

我們以一個3階B樹為例來看一下B樹的結構鱼填,樹中的具體元素和上面的二叉查找樹是一樣的药有。

3階B樹

我們來看(2,6)節(jié)點愤惰,該節(jié)點有兩個元素2和6苇经,又有三個孩子1,(3扇单,5),8奠旺。其中1小于元素2,(3响疚,5)在元素2鄙信,6之間忿晕,8大于元素6装诡,符合上面的幾條規(guī)則。

(2鸦采,6)分支

接下來我們來看一下B樹的查詢過程,看看會帶來什么效果宏侍,假如我們要查詢的數(shù)值是5

第1次磁盤IO
在內存中定位(和9比較)
第2次磁盤IO
在內存中定位(和2,6比較)
第三次磁盤IO
在內存中定位(和3谅河,5比較)

從上面我們看出,其實B樹在查詢中的比較次數(shù)并不比二叉查找樹少绷耍,尤其當單一節(jié)點中的元素數(shù)量很多時吐限」邮迹可是相對磁盤IO的速度诸典,在內存中比較耗時幾乎可以忽略,所以只要樹的高度足夠低狐粱,磁盤IO次數(shù)足夠少,就可以提高查詢性能胆数。就算單個節(jié)點內元素多一點也沒關系肌蜻,僅僅是多了幾次內存中的交互必尼,可以忽略用時蒋搜。其實說白了B樹的優(yōu)勢和高效就是因為B樹將一部分的IO負擔到內存中來了,用內存的高效和強大提升了查詢性能豆挽。


下面我們來看一下B樹的插入和刪除

B樹插入新節(jié)點的過程比較復雜育谬,分好多種情況,此處舉一個最典型的例子帮哈,還使用上面的B樹膛檀,假如我們要插入的值是4,自頂向下查找4的位置宿刮,發(fā)下4應當插入到節(jié)點元素3,5之間私蕾,

插入4

可是節(jié)點3,5已經是兩節(jié)點元素踩叭,無法再增加磕潮,父節(jié)點2,6也是兩節(jié)點元素自脯,無法再增加。倒是根節(jié)點9是單元素節(jié)點斤富,可以升級為兩元素節(jié)點膏潮,于是拆分節(jié)點2满力,6和節(jié)點3焕参,5油额,讓根節(jié)點9升級為兩元素節(jié)點4叠纷,9潦嘶,節(jié)點6獨立為根節(jié)點的第二個孩子涩嚣。

插入4后的B樹

由此看出掂僵,插入一個節(jié)點航厚,會讓B樹的那么多節(jié)點發(fā)生連鎖改變锰蓬。也正是如此阶淘,保證了B樹始終維持多路平衡,這就是B樹的一大優(yōu)勢互妓,也是B樹英語Balance-Tree中Balance的體現(xiàn)。

下面再看看B樹的刪除機制冯勉,以上面插入4后的B樹為例澈蚌,刪除元素11灼狰,首先自頂向下找出11的位置

自頂向下找出11的位置

刪除11后宛瞄,節(jié)點12只有一個孩子交胚,不符合B樹規(guī)范份汗,因此找出12,13蝴簇,15三個節(jié)點的中位數(shù)13杯活,取代節(jié)點12熬词,而節(jié)點12自身下移成為第一個孩子旁钧。(此過程稱為“左旋”)

刪除11
左旋完成



以上便是B樹的查詢,新增和刪除的機制歪今,B樹主要應用于文件系統(tǒng)(FS)以及部分數(shù)據(jù)庫索引,比如著名的非關系型數(shù)據(jù)庫MongoDB寄猩。但是絕大多數(shù)關系型數(shù)據(jù)庫,比如MySQL骑疆,都使用B+樹作索引,所以下篇將會介紹B+樹的相關內容封断。

?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末斯辰,一起剝皮案震驚了整個濱河市坡疼,隨后出現(xiàn)的幾起案子彬呻,更是在濱河造成了極大的恐慌,老刑警劉巖柄瑰,帶你破解...
    沈念sama閱讀 216,372評論 6 498
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異教沾,居然都是意外死亡蒲跨,警方通過查閱死者的電腦和手機授翻,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,368評論 3 392
  • 文/潘曉璐 我一進店門或悲,熙熙樓的掌柜王于貴愁眉苦臉地迎上來孙咪,“玉大人巡语,你說我怎么就攤上這事翎蹈。” “怎么了荤堪?”我有些...
    開封第一講書人閱讀 162,415評論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀的道長枢赔。 經常有香客問我,道長踏拜,這世上最難降的妖魔是什么碎赢? 我笑而不...
    開封第一講書人閱讀 58,157評論 1 292
  • 正文 為了忘掉前任执隧,我火速辦了婚禮揩抡,結果婚禮上,老公的妹妹穿的比我還像新娘峦嗤。我一直安慰自己,他們只是感情好屋摔,可當我...
    茶點故事閱讀 67,171評論 6 388
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著钓试,像睡著了一般装黑。 火紅的嫁衣襯著肌膚如雪弓熏。 梳的紋絲不亂的頭發(fā)上恋谭,一...
    開封第一講書人閱讀 51,125評論 1 297
  • 那天,我揣著相機與錄音疚颊,去河邊找鬼。 笑死信认,一個胖子當著我的面吹牛,可吹牛的內容都是我干的嫁赏。 我是一名探鬼主播,決...
    沈念sama閱讀 40,028評論 3 417
  • 文/蒼蘭香墨 我猛地睜開眼潦蝇,長吁一口氣:“原來是場噩夢啊……” “哼深寥!你這毒婦竟也來了?” 一聲冷哼從身側響起贤牛,我...
    開封第一講書人閱讀 38,887評論 0 274
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎盔夜,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體堤魁,經...
    沈念sama閱讀 45,310評論 1 310
  • 正文 獨居荒郊野嶺守林人離奇死亡喂链,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 37,533評論 2 332
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了妥泉。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片椭微。...
    茶點故事閱讀 39,690評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖盲链,靈堂內的尸體忽然破棺而出蝇率,到底是詐尸還是另有隱情,我是刑警寧澤刽沾,帶...
    沈念sama閱讀 35,411評論 5 343
  • 正文 年R本政府宣布本慕,位于F島的核電站,受9級特大地震影響侧漓,放射性物質發(fā)生泄漏锅尘。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,004評論 3 325
  • 文/蒙蒙 一布蔗、第九天 我趴在偏房一處隱蔽的房頂上張望藤违。 院中可真熱鬧,春花似錦顿乒、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,659評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至隔盛,卻和暖如春犹菱,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背吮炕。 一陣腳步聲響...
    開封第一講書人閱讀 32,812評論 1 268
  • 我被黑心中介騙來泰國打工腊脱, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人龙亲。 一個月前我還...
    沈念sama閱讀 47,693評論 2 368
  • 正文 我出身青樓陕凹,卻偏偏與公主長得像悍抑,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子杜耙,可洞房花燭夜當晚...
    茶點故事閱讀 44,577評論 2 353

推薦閱讀更多精彩內容

  • B樹的定義 一棵m階的B樹滿足下列條件: 樹中每個結點至多有m個孩子搜骡。 除根結點和葉子結點外,其它每個結點至少有m...
    文檔隨手記閱讀 13,218評論 0 25
  • 原文鏈接 B樹 1.前言: 動態(tài)查找樹主要有:二叉查找樹(Binary Search Tree)佑女,平衡二叉查找樹(...
    非典型程序員閱讀 1,158評論 0 3
  • B樹 1.前言: 動態(tài)查找樹主要有:二叉查找樹(Binary Search Tree)记靡,平衡二叉查找樹(Balan...
    鐵甲依然在_978f閱讀 1,447評論 0 4
  • 深秋摸吠,北京又籠罩在霧霾之下,身體帶有著些許不適嚎花,可抱怨已經減少了很多寸痢,甚至可以把霧霾的天氣當作笑話來談。 我有點咳...
    FreeManFree閱讀 240評論 0 0
  • 無論春夏秋冬紊选,這里窗外總能聽見鳥兒鳴叫啼止,尤其是上午時分,只要你想聽兵罢。當然我不知道那是什么鳥献烦,以我的常識,只認...
    lenmon928閱讀 234評論 0 0