B數與B+數
阿新 • • 發佈:2018-12-25
B樹
為什麼要B樹
簡介
- 每個結點至多擁有m棵子樹;
- 除了根結點以外,其餘每個分支結點至少擁有 m/2 棵子樹;
- 根結點至少擁有兩顆子樹(存在子樹的情況下);
- 所有的葉結點都在同一層上,其可以看作是外部結點,不包含任何資訊;
- 有 k 棵子樹的非葉子結點則其存在 k-1 個關鍵碼,關鍵碼按照遞增次序進行排列;
- 關鍵字數量需要滿足ceil(m/2)-1 <= n <= m-1;
操作
插入
- 如果該結點的關鍵字個數沒有到達m-1個,那麼直接插入即可;
- 如果該結點的關鍵字個數已經到達了m-1個,那麼根據B樹的性質顯然無法滿足,需要將其進行分裂。分裂的規則是該結點分成兩半,將中間的關鍵字進行提升,加入到父親結點中,但是這又可能存在父親結點也滿員的情況,則不得不向上進行回溯,甚至是要對根結點進行分裂,那麼整棵樹都加了一層。
刪除
- 如果該結點擁有關鍵字數量仍然滿足B樹性質,則不做任何處理;
- 如果該結點在刪除關鍵字以後不滿足B樹的性質(關鍵字沒有到達ceil(m/2)-1的數量),則需要向兄弟結點借關鍵字,這有分為兄弟結點的關鍵字數量是否足夠的情況。
- 如果兄弟結點的關鍵字足夠借給該結點,則過程為將父親結點的關鍵字下移,兄弟結點的關鍵字上移;
- 如果兄弟結點的關鍵字在借出去以後也無法滿足情況,即之前兄弟結點的關鍵字的數量為ceil(m/2)-1,借的一方的關鍵字數量為ceil(m/2)-2的情況,那麼我們可以將該結點合併到兄弟結點中,合併之後的子結點數量少了一個,則需要將父親結點的關鍵字下放,如果父親結點不滿足性質,則向上回溯;
- 其餘情況參照BST中的刪除。
B+樹
為什麼要B+樹
簡介
- 根結點只有一個,分支數量範圍為[2,m];
- 分支結點,每個結點包含分支數範圍為[ceil(m/2), m];
- 分支結點的關鍵字數量等於其子分支的數量;
- 所有葉子結點都在同一層,其關鍵字的數量範圍為[ceil(m/2), m],從小到達進行排序;
操作
B樹和B+樹的區別
- 關鍵字的數量不同;B+樹中分支結點有m個關鍵字,其葉子結點也有m個,其關鍵字只是起到了一個索引的作用,但是B樹雖然也有m個子結點,但是其只擁有m-1個關鍵字。
- 儲存的位置不同;B+樹中的資料都儲存在葉子結點上,也就是其所有葉子結點的資料組合起來就是完整的資料,但是B樹的資料儲存在每一個結點中,並不僅僅儲存在葉子結點上。
- 分支結點的構造不同;B+樹的分支結點僅僅儲存著關鍵字資訊和兒子的指標(這裡的指標指的是磁碟塊的偏移量),也就是說內部結點僅僅包含著索引資訊。
- 查詢不同;B樹在找到具體的數值以後,則結束,而B+樹則需要通過索引找到葉子結點中的資料才結束,也就是說B+樹的搜尋過程中走了一條從根結點到葉子結點的路徑。