一,B-樹的定義及介紹
為什么會有B-樹?
熟悉的樹的結構有二叉樹查找樹或者平衡二叉樹……平衡二叉樹保證最壞情況下各個操作的時間復雜度為O(logN),但是為了保持平衡,在插入或刪除元素時,需要進行旋轉啊...一系列操作,因此實現起來比較復雜。而對於二叉查找樹,基本操作在最壞情況下會出現O(N)的時間復雜度。總之,這些樹都是針對於內存中的數據操作,它們每個結點最多只有兩個孩子,當數據量大時(結點數目很多),就會導致樹很高。但由於基本操作(查找元素、插入元素)都是在內存中實現,因此,樹高點也就沒有太大的關系。
試想,如果樹中的結點數據 是存儲在磁盤上的,每訪問一個結點需要進行一次磁盤的讀取操作,那么樹的高度就很重要了。因為,磁盤訪問的代價(速度)遠遠大於內存訪問的代價。對於7200轉的硬盤而言,訪問一次磁盤大約需要8.3ms,而對於4GHz的CPU而言,8.3ms不知可以執行多少次指令了。
因此,B樹一個很重要的特征就是:高度小。
那如何讓高度變小呢?讓每個結點可以擁有多個(遠遠大於2)孩子就可以了。但是,為了在插入、刪除中仍然保持B樹的性質(比如高度要低),還需要對B樹做一些其他方面的規定:(實際實現過程中可能不同)。
其中最重要的規定是:每個結點最多包含多少個關鍵字(項),最少需要包含多少個關鍵字。
這里,給出一個具體的M階 B樹定義(《數據結構與算法分析》MAW著)
①數據項 只存儲在樹葉上。(數據項就是實實在在的數據,而不是索引)
②非葉子結點最多可以 存儲 M-1個關鍵字以指示搜索的方向(這里的關鍵字是指索引)。
這里的M-1個關鍵字是按從小到大的順序排序的。M-1個關鍵字,就有M個指針,指向進一步查找的路徑。
③樹的根或者是一片樹葉,或者其兒子數在 2 到 M之間
④除根外,所有非樹葉節點的兒子數在 【M/2】 和 M 之間 【M/2】表示,M/2並向上取整
非葉子結點的兒子數最少為【M/2】,這就是為了保證每個結點足夠多的孩子,從而使樹的高度不至於太大。
⑤所有的樹葉都在相同的深度上並有【L/2】 和 L 個數據項
這里表明,真正的數據只存儲在葉子結點上。非葉子結點只存儲索引。
在上面的具體規定中,M 和 L 是如何確定的呢?
M 和 L的確定與磁盤塊的大小相關。對於B樹而言,每個結點都盡量占據一個磁盤塊。
比如,假設有 1千萬數據項,每個關鍵字(索引)是32B,而每個數據項是256B,磁盤塊的大小是8192B,如何確定M 和 L 呢?
由於M階B樹中,每個結點最多有 M-1 個關鍵字,故關鍵字總大小為 32M-32,M-1個關鍵字最多有M個分支指針,假設每個分支指針是4B(字節),故分支指針的大小是4*M個字節。那么對於一個非葉子結點,它的大小是36*M-32 字節,由於磁盤塊大小是8192,故M = 8192/(36*M-32) = 228
(注意:這里的“關鍵字”其實類似於數據項,待插入的數據項 就是 通過比較關鍵字 來確定走哪條分支指針)
由上面的第5點可知,葉子結點只存儲數據項,每個數據項大小為256B,故 L=8192/256=32,這說明每個葉子結點可以存儲32個數據項。
M 與關鍵字以及指針的大小有關,而L與數據項的大小有關。總之,目標是:不管是葉結點還是非葉結點,都盡量保證一個結點占據一個磁盤塊。
二,B樹的基本操作
1)查找操作
查找操作的偽代碼如下:《算法導論》這里的B樹中數據項可存儲在非葉子結點上。
1 B-TREE-SEARCH(x,k) 2 i = 1 3 while i<= M' and k > key(i) 4 i++ 5 if i<=M' and k=key(i) 6 return (x,i) 7 if leaf(x) 8 return NIL 9 else 10 DISK-READ(child(x(i))) 11 return B-TREE-SEARCH(child(x(i)),k)
x實際上代表根結點。第3行,掃描結點上所有的數據項看是否與k匹配,若不匹配且結點不是葉子結點,則需要在第10行進行一次磁盤讀取操作,將該結點中某數據項指向的孩子結點讀入內存,再進行比較。
2)插入操作
插入操作可能會導致結點分裂。插入操作的具體實現細節可能與這里描述的不一樣。
比如,向一個已經滿了的葉結點插入一個數據項時,該葉結點分裂成兩個結點,並將中間數據項上移到該結點的雙親結點。
3)刪除操作
刪除操作可能會導致結點合並。具體描述參考算法導論。
比如,還可以這樣來處理:當某個節點不包含的數據項已經達到最小時,可以從鄰節點 “領養” 一個數據項。當鄰節點也不足時,則將這兩個節點合並成一個節點。
三,B樹與B+樹的主要區別
最主要的區別就是:B樹中非葉子結點可以存儲數據,而B+樹非葉子結點只存儲索引,所有的數據都放在葉子結點上存儲,且所有的葉子結點到根的距離是一樣的(葉子結點都在同一層)。
參考:B樹學習總結
https://www.tutorialcup.com/dbms/b-tree.htm