1. 程式人生 > >B樹 學習筆記3

B樹 學習筆記3

接上,演算法導論 - 18.3 從B樹中刪除關鍵字
這一節沒有給出虛擬碼,寫起來怕是會有坑,放點參考:
https://www.youtube.com/watch?v=svfnVhJOfMc
https://www.geeksforgeeks.org/b-tree-set-3delete/ (含程式碼)

在刪除關鍵字時,要重新安排這個結點的孩子,並且必須保證一個結點不會再刪除期間變得太小。

過程 B-TREE-DELETE 從以 x 為根的子樹中刪除關鍵字 k
我們設計的這個過程必須保證,無論何時,結點 x 遞迴呼叫自身時, x 中關鍵字個數至少為 t (即比最少要求多一個以上)。

這個加強的條件使得將一個關鍵字刪除時,可以不用向上回溯(有一個例外,稍後解釋)。

B-TREE-DELETE(

x,k ) 過程:

1. 如果關鍵字 k 有可能在結點 x 中,並且 x 是葉結點,若可能則從 x 中刪除 k

2. 如果關鍵字 k 在結點 x 中,並且 x 是內部結點,則做一下操作:
a. 關鍵字 k 前的結點 y ,若 y 的關鍵字多於 k 個,則找出關鍵字 k 的前驅 k ,遞迴地刪除 k ,並在 x 中用 k 替換 k
b. 關鍵字 k 後的結點 z ,若 z 的關鍵字多於 k 個,則找出關鍵字 k 的後繼 k ,遞迴地刪除 k ,並在 x 中用 k 替換 k
c. 無法刪除,(
y,z
結點關鍵字不能減少),則將 y,z,k 合併,然後釋放 z 並遞迴地從 y 中刪除 k

3. 如果關鍵字 k 當前不在內部結點 x 中,則確定可能包含 k 的子樹的根 x.ci 。如果 x.ci 只有 t1 個關鍵字,必須執行步驟 3a 或 3b 來保證降至一個至少包含 t 個關鍵字的結點。然後通過對 x 的某個合適的子結點進行遞迴而結束。
a. 如果 x.ci 只有 t1 個關鍵字,但是它的一個相鄰的兄弟至少包含 t 個關鍵字,則旋轉(若是右兄弟就左旋,左兄弟就右旋),這樣 x.ci 就多了一個關鍵字。
b. 如果
x.ci
以及 x.ci 的所有相鄰兄弟都只包含 t1 個關鍵字,則將 x.ci 與一個兄弟合併。(即將 x.ci 旁邊的一個關鍵字下推,合併到新結點,成為中間關鍵字)


這裡寫圖片描述
這裡寫圖片描述


由於一棵 B樹中的大部分結點都在葉結點中,於是預估刪除操作經常用於從葉結點中刪除關鍵字。這樣 B-TREE-DELETE 過程只要沿樹下降一遍即可不需要向上回溯。
然而,當要刪除某個內部結點的關鍵字時,該過程也要沿樹下降一趟,但可能還要返回刪除關鍵字的那個結點,以用其前驅或後繼來取代被刪除的關鍵字。


刪除操作需要 O(h) 次磁碟操作。所需CPU時間為