B-樹(B樹)詳解

具體講解之前,有一點,再次強調下:B-樹,即為B樹。因為B樹的原英文名稱為B-tree,而國內很多人喜歡把B-tree譯作B-樹,其實,這是個非常不好的直譯,很容易讓人產生誤解。如人們可能會以為B-樹是一種樹,而B樹又是一種樹。而事實上是,B-tree就是指的B樹。特此說明。

1、B-樹(B樹)的基本概念

B-樹中所有結點中孩子結點個數的最大值成為B-樹的階,通常用m表示,從查找效率考慮,一般要求m>=3。一棵m階B-樹或者是一棵空樹,或者是滿足以下條件的m叉樹。
1)每個結點最多有m個分支(子樹);而最少分支數要看是否為根結點,如果是根結點且不是葉子結點,則至少要有兩個分支,非根非葉結點至少有ceil(m/2)個分支,這里ceil代表向上取整。
2)如果一個結點有n-1個關鍵字,那么該結點有n個分支。這n-1個關鍵字按照遞增順序排列。
3)每個結點的結構為:

n k1 k2 ... kn
p0 p1 p2 ... pn

其中,n為該結點中關鍵字的個數;ki為該結點的關鍵字且滿足ki<ki+1;pi為該結點的孩子結點指針且滿足pi所指結點上的關鍵字大于ki且小于ki+1,p0所指結點上的關鍵字小于k1,pn所指結點上的關鍵字大于kn。

4)結點內各關鍵字互不相等且按從小到大排列。
5)葉子結點處于同一層;可以用空指針表示,是查找失敗到達的位置。

:平衡m叉查找樹是指每個關鍵字的左側子樹與右側子樹的高度差的絕對值不超過1的查找樹,其結點結構與上面提到的B-樹結點結構相同,由此可見,B-樹是平衡m叉查找樹,但限制更強,要求所有葉結點都在同一層。

光看上面的解釋可能大家對B-樹理解的還不是那么透徹,下面我們用一個實例來進行講解。

上面的圖片顯示了一棵B-樹,最底層的葉子結點沒有顯示。我們對上面提到的5條特點進行逐條解釋:
1)結點的分支數等于關鍵字數+1,最大的分支數就是B-樹的階數,因此m階的B-樹中結點最多有m個分支,所以可以看到,上面的一棵樹是一個5-階B-樹。
2)因為上面是一棵5階B-樹,所以非根非葉結點至少要有ceil(5/2)=3個分支。根結點可以不滿足這個條件,圖中的根結點有兩個分支。
3)如果根結點中沒有關鍵字就沒有分支,此時B-樹是空樹,如果根結點有關鍵字,則其分支數比大于或等于2,因為分支數等于關鍵字數+1.
4)上圖中除根結點外,結點中的關鍵字個數至少為2,因為分支數至少為3,分支數比關鍵字數多1,還可以看出結點內關鍵字都是有序的,并且在同一層中,左邊結點內所有關鍵字均小于右邊結點內的關鍵字,例如,第二層上的兩個結點,左邊結點內的關鍵字為15,26,他們均小于右邊結點內的關鍵字39和45.
B-樹一個很重要的特征是,下層結點內的關鍵字取值總是落在由上層結點關鍵字所劃分的區間內,具體落在哪個區間內可以由指向它的指針看出。例如,第二層最左邊的結點內的關鍵字劃分了三個區間,小于15,15到26,大于26,可以看出其下層中最左邊結點內的關鍵字都小于15,中間結點的關鍵字在15和26之間,右邊結點的關鍵字大于26.
5)上圖中葉子結點都在第四層上,代表查找不成功的位置。

2、B-樹的查找操作

B-樹的查找很簡單,是二叉排序樹的擴展,二叉排序樹是二路查找,B-樹是多路查找,因為B-樹結點內的關鍵字是有序的,在結點內進行查找時除了順序查找外,還可以用折半查找來提升效率。B-樹的具體查找步驟如下(假設查找的關鍵字為key):
1)先讓key與根結點中的關鍵字比較,如果key等于k[i](k[]為結點內的關鍵字數組),則查找成功
2)若key<k[1],則到p[0]所指示的子樹中進行繼續查找(p[]為結點內的指針數組),這里要注意B-樹中每個結點的內部結構。
3)若key>k[n],則道p[n]所指示的子樹中繼續查找。
4)若k[i]<key<k[i+1],則沿著指針p[I]所指示的子樹繼續查找。
5)如果最后遇到空指針,則證明查找不成功。

拿上面的二叉樹進行舉例,比如我們想要查找關鍵字42,下圖加粗的部分顯示了查找的路徑:


3、B-樹的插入

與二叉排序樹一樣,B-樹的創建過程也是將關鍵字逐個插入到樹中的過程。
在進行插入之前,要確定一下每個結點中關鍵字個數的范圍,如果B-樹的階數為m,則結點中關鍵字個數的范圍為ceil(m/2)-1 ~ m-1個。
對于關鍵字的插入,需要找到插入位置。在B-樹的查找過程中,當遇到空指針時,則證明查找不成功,同時也找到了插入位置,即根據空指針可以確定在最底層非葉結點中的插入位置,為了方便,我們稱最底層的非葉結點為終端結點,由此可見,B-樹結點的插入總是落在終端結點上。在插入過程中有可能破壞B-樹的特征,如新關鍵字的插入使得結點中關鍵字的個數超過規定個數,這是要進行結點的拆分
接下來,我們以關鍵字序列{1,2,6,7,11,4,8,13,10,5,17,9,16,20,3,12,14,18,19,15}創建一棵5階B-樹,我們將詳細體會B-樹的插入過程。
(1)確定結點中關鍵字個數范圍
由于題目要求建立5階B-樹,因此關鍵字的個數范圍為2~4
(2)根結點最多可以容納4個關鍵字,依次插入關鍵字1、2、6、7后的B-樹如下圖所示:

(3)當插入關鍵字11的時候,發現此時結點中關鍵字的個數變為5,超出范圍,需要拆分,去關鍵字數組中的中間位置,也就是k[3]=6,作為一個獨立的結點,即新的根結點,將關鍵字6左、右關鍵字分別做成兩個結點,作為新根結點的兩個分支,此時樹如下圖所示:

(4)新關鍵字總是插在葉子結點上,插入關鍵字4、8、13之后樹為:

(5)關鍵字10需要插入在關鍵字8和11之間,此時又會出現關鍵字個數超出范圍的情況,因此需要拆分。拆分時需要將關鍵字10納入根結點中,并將10左右的關鍵字做成兩個新的結點連在根結點上。插入關鍵字10并經過拆分操作后的B-樹如下圖:

(6)插入關鍵字5、17、9、16之后的B-樹如圖所示:

(7)關鍵字20插入在關鍵字17以后,此時會造成結點關鍵字個數超出范圍,需要拆分,方法同上,樹為:

(8)按照上述步驟依次插入關鍵字3、12、14、18、19之后B-樹如下圖所示:

(9)插入最后一個關鍵字15,15應該插入在14之后,此時會出現關鍵字個數超出范圍的情況,則需要進行拆分,將13并入根結點,13并入根結點之后,又使得根結點的關鍵字個數超出范圍,需要再次進行拆分,將10作為新的根結點,并將10左、右關鍵字做成兩個新結點連接到新根結點的指針上,這種插入一個關鍵字之后出現多次拆分的情況稱為連鎖反應,最終形成的B-樹如下圖所示:

4、B-樹的刪除

對于B-樹關鍵字的刪除,需要找到待刪除的關鍵字,在結點中刪除關鍵字的過程也有可能破壞B-樹的特性,如舊關鍵字的刪除可能使得結點中關鍵字的個數少于規定個數,這是可能需要向其兄弟結點借關鍵字或者和其孩子結點進行關鍵字的交換,也可能需要進行結點的合并,其中,和當前結點的孩子進行關鍵字交換的操作可以保證刪除操作總是發生在終端結點上。

我們用剛剛生成的B-樹作為例子,一次刪除8、16、15、4這4個關鍵字。
(1)刪除關鍵字8、16。關鍵字8在終端結點上,并且刪除后其所在結點中關鍵字的個數不會少于2,因此可以直接刪除。關鍵字16不在終端結點上,但是可以用17來覆蓋16,然后將原來的17刪除掉,這就是上面提到的和孩子結點進行關鍵字交換的操作。這里不能用15和16進行關鍵字交換,因為這樣會導致15所在結點中關鍵字的個數小于2。因此,刪除8和16之后B-樹如下圖所示:

(2)刪除關鍵字15,15雖然也在終端結點上,但是不能直接刪除,因為刪除后當前結點中關鍵字的個數小于2。這是需要向其兄弟結點借關鍵字,顯然應該向其右兄弟來借關鍵字,因為左兄弟的關鍵字個數已經是下限2.借關鍵字不能直接將18移到15所在的結點上,因為這樣會使得15所在的結點上出現比17大的關鍵字,所以正確的借法應該是先用17覆蓋15,在用18覆蓋原來的17,最后刪除原來的18,刪除關鍵字15后的B-樹如下圖所示:

(3)刪除關鍵字4,4在終端結點上,但是此時4所在的結點的關鍵字個數已經到下限,需要借關鍵字,不過可以看到其左右兄弟結點已經沒有多余的關鍵字可借。所以就需要進行關鍵字的合并。可以先將關鍵字4刪除,然后將關鍵字5、6、7、9進行合并作為一個結點鏈接在關鍵字3右邊的指針上,也可以將關鍵字1、2、3、5合并作為一個結點鏈接在關鍵字6左邊的指針上,如下圖所示:

顯然上述兩種情況下都不滿足B-樹的規定,即出現了非根的雙分支結點,需要繼續進行合并,合并后的B-樹如下圖所示:

有時候刪除的結點不在終端結點上,我們首先需要將其轉化到終端結點上,然后再按上面的各種情況進行刪除。在講述這種情況下的刪除方法之前,要引入一個相鄰關鍵字的概念,對于不在終端結點的關鍵字a,它的相鄰關鍵字為其左子樹中值最大的關鍵字或者其右子樹中值最小的關鍵字。找a的相鄰關鍵字的方法為:沿著a的左指針來到其子樹根結點,然后沿著根結點中最右端的關鍵字的右指針往下走,用同樣的方法一直走到葉結點上,葉結點上的最右端的關鍵字即為a的相鄰關鍵字(這里找的是a左邊的相鄰關鍵字,我們可以用同樣的思路找到a右邊的相鄰關鍵字)。可以看到下圖中a的相鄰關鍵字是d和e,要刪除關鍵字a,可以用d來取代a,然后按照上面的情況刪除葉子結點上的d即可。

6、B-樹的應用

為了將大型數據庫文件存儲在硬盤上,以減少訪問硬盤次數為目的,在此提出了一種平衡多路查找樹——B-樹結構。由其性能分析可知它的檢索效率是相當高的 為了提高 B-樹性能’還有很多種B-樹的變型,力圖對B-樹進行改進,比如B+樹。

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 230,431評論 6 544
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 99,637評論 3 429
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 178,555評論 0 383
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 63,900評論 1 318
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 72,629評論 6 412
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 55,976評論 1 328
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,976評論 3 448
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 43,139評論 0 290
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 49,686評論 1 336
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 41,411評論 3 358
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 43,641評論 1 374
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 39,129評論 5 364
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,820評論 3 350
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 35,233評論 0 28
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 36,567評論 1 295
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 52,362評論 3 400
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 48,604評論 2 380

推薦閱讀更多精彩內容

  • B樹的定義 一棵m階的B樹滿足下列條件: 樹中每個結點至多有m個孩子。 除根結點和葉子結點外,其它每個結點至少有m...
    文檔隨手記閱讀 13,289評論 0 25
  • 原文鏈接 B樹 1.前言: 動態查找樹主要有:二叉查找樹(Binary Search Tree),平衡二叉查找樹(...
    非典型程序員閱讀 1,178評論 0 3
  • B樹 1.前言: 動態查找樹主要有:二叉查找樹(Binary Search Tree),平衡二叉查找樹(Balan...
    鐵甲依然在_978f閱讀 1,459評論 0 4
  • 一. 算法之變,結構為宗 計算機在很多情況下被應用于檢索數據,比如航空和鐵路運輸業的航班信息和列車時刻表的查詢,都...
    Leesper閱讀 6,983評論 13 42
  • 人們的思維基本分為三個層次:"what"、“how"、"why",每個人都懂得"what",部分人懂得"how,只...
    時代小強閱讀 1,447評論 0 0