1. 程式人生 > >多叉樹——B樹和B+樹

多叉樹——B樹和B+樹

目錄

 

1 介紹

2 B樹

2.1 B樹的定義

2.2 B樹的查詢

2.3 B樹的插入

2.4 B樹的刪除

2.5 B樹的應用

3 B+樹

3.1 定義

3.2 B+樹的插入

3.3 B+樹的刪除


1 介紹

樹家族是為了實現方便快捷的查詢而存在的。樹的高度是命中查詢的一個不可抗拒的時間下限。在一定的資料條件下,樹的高度和寬度是相互制約的。對於二叉樹來說,雖然易於實現,卻沒有實際的價值。因為二叉樹的寬度固定,使樹的高度無法減小,因此出現了多叉樹。B樹、B+樹都屬於多叉樹。MySQL和Berkeley DB都是基於B樹原理而建立資料庫的。B樹是一種可實現的平衡多路查詢樹。

平衡m叉查詢樹是指每個關鍵字的左側子樹與右側子樹的高度差的絕對值不超過1的查詢樹。

2 B樹

2.1 B樹的定義

B樹在維基百科是這麼定義的:“在電腦科學中,B樹(B-Tree)是一種樹狀資料結構,它能夠儲存資料,對其進行排序並允許以O(log n)的時間複雜度執行進行查詢、順序讀取、插入和刪除的資料結構。B樹,概括來說是一個節點可以擁有多於2個子節點的二叉排序樹。與自平衡二叉查詢樹不同,B-樹為系統最優化大塊資料的讀和寫操作。普遍運用在資料庫檔案系統。”

B樹中所有節點的最大孩子節點數被稱為B樹的階,通常用m來表示。一棵m階B樹可以是一棵空樹,也可以是滿足一下條件的m叉樹。

1)每個節點最多有m個子結點,即每個節點最多有m-1個關鍵字最少子節點要看是否為根節點,如果是非葉子節點的根節點,則至少要有2個節點,其他非根節點非葉節點至少要有[m/2]個節點,[m/2]表示m/2向上取整。

2)如果一個節點有n-1個關鍵字,則子節點有n個。這n-1個關鍵字按照遞增的順序排列。

3)每個節點的結構為:

n k1

k2

.... kn
p0 p1 p2 ... pn

其中,n為節點中關鍵字的個數;ki為該節點的關鍵字且ki<k(i+1);pi為該節點的孩子節點指標

且滿足pi所指向的子節點的關鍵字都大於ki且小於k(i+1),p0所指向的子節點的關鍵字小於k1,pn所指向的子節點的關鍵字大於kn。

4)節點內關鍵字互不相等且按照從小到大順序排列。

5)葉子節點處於同一層;可以用空指標表示,是查詢失敗到達的位置。

5階B-樹例項:

2.2 B樹的查詢

B樹節點內的關鍵字是有序的,因此在節點內查詢時除了順序查詢還可以使用折半查詢。假設要查詢的關鍵字為key。步驟如下:

1)先讓key與根節點的關鍵字進行比較,如果key=k[i],則查詢成功;

2)若key<k[1],則到p[0]所指向的子節點進行查詢;

3)若key>k[n],則到p[1]所指向的子節點進行查詢;

4)若k[i]<key<k[i+1],則到p[i]所指向的子節點進行查詢;

5)若遇到空指標,則查詢失敗。

2.3 B樹的插入

在B樹插入key時,需要判斷key所在的節點的關鍵字的個數是否滿足多叉樹的條件。

2.4 B樹的刪除

2.5 B樹的應用

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

3 B+樹

3.1 定義

由於B樹的一個結點代表輔助的一個頁或者塊。一個節點到另一個節點的傳送要求一次耗時的頁交換,因此應該儘可能的減少節點訪問。(如果要求B樹中所有節點按升序列印,可以採用中序樹遍歷演算法,這是很容易實現。)但對非葉子節點,每次只能顯示一個鍵值,然後就得訪問另一頁。因此,應該改進B樹,以更快的方式順序訪問資料,而不是使用中序遍歷。B+樹解決了這個問題。B+樹的資料都儲存在葉子節點中,分支節點均為索引,因此B+樹用於資料庫索引,B樹適用於檔案索引。
B+樹和B樹的差異在於:

1)有m個子結點的的節點的關鍵字有m個;

2)非葉節點僅具有索引的作用,跟記錄有關的資訊均記錄在葉子結點中;

3)樹的所有葉子結點構成一個有序連結串列,可以按照關鍵碼排序的次序遍歷全部記錄。

相同點在於:

1)所有節點的子節點的個數最多為m;非葉根節點的子節點個數最少是2,非葉非根節點的子節點個數最少是[m/2];

2)所有葉子節點都在同一層。

4階B+樹例項:

雙向連結串列,每頁可存放4條記錄。

3.2 B+樹的插入

Leaf Page Full Index Page Full 操作
no no 直接將記錄插入到葉節點
yes no

1、拆分葉節點(Leaf Page)

2、將中間節點放入索引節點(Index Page)

3、小於中間節點的記錄放入左節點

4、大於等於中間節點的記錄放入右邊

yes yes

1、拆分Leaf Page

2、小於中間節點的記錄放入左邊

3、大於等於中間節點的記錄放入右邊

4、拆分Index Page

5、小於中間節點的記錄放入左邊

6、大於等於中間節點的記錄放入右邊

6、將中間節點放入上一層Index Page

為了保持平衡,對於新插入的鍵值可能會做多次拆頁操作(split),B+樹主要用於磁碟,多次拆頁意味著對磁碟多次操作,應該儘可能的減少對磁碟操作。因此B+樹提供了旋轉(rotation)操作

旋轉發生在Leaf Page滿了但是左右兄弟節點還沒滿的情況下。通常情況下,左兄弟被首先檢查用來做旋轉操作。比如要插入70。

若按照拆頁操作則是:

 

因此旋轉使得少了一次拆頁操作。

3.3 B+樹的刪除

B+樹使用填充因子(fill factor)來控制樹的刪除,50%是刪除因子可設的最小值,因為B+樹屬於多叉樹,要滿足多叉樹最小分支數的條件。

Leaf Page Below Fill Factor Index Page Below Fill Factor 操作
no no 直接刪除記錄,若該記錄還存在Index Page中,則更新Index Page
yes no 合併葉節點及兄弟節點,並更新Index Page
yes yes

1、合併葉節點及其兄弟節點

2、更新Index Page

3、合併Index Page及其兄弟節點

4、更新上一層Index Page