1. 程式人生 > >快速瞭解B+樹的插入、刪除操作

快速瞭解B+樹的插入、刪除操作

B+樹非常的複雜,這裡不進行詳細的講解,只對基本的插入刪除操作進行說明。

在B+樹中,所有記錄節點都是按鍵值的大小順序存放在同一層的葉節點中,各葉節點用指標連線。因此在進行插入刪除操作時,要進行調整,維持其平衡性。

我們先來看一個B+樹,其高度為2,每頁可存放4條記錄,扇出(fan out)為5,可以理解成5階多叉樹。
在這裡插入圖片描述

可以看出,所有記錄都在葉節點中,並且是順序存放的,如果我們從最左邊的葉節點開始順序遍歷,可以得到所有鍵值的順序排序:5、10、15、20、25、30、50、55、60、65、75、80、85、90。

1、插入

B+樹的插入必須保證插入後葉節點中的記錄依然排序,同時需要考慮插入B+樹的三種情況,每種情況都可能會導致不同的插入演算法,如表5-1所示。
在這裡插入圖片描述

我們用例項來分析B+樹的插入,我們插入28這個鍵值,發現當前Leaf Page和Index Page都沒有滿,我們直接插入就可以了。
在這裡插入圖片描述
這次我們再插入一條70這個鍵值,這時原先的Leaf Page已經滿了,但是Index Page還沒有滿,符合表5-1的第二種情況,這時插入Leaf Page後的情況為50、55、60、65、70。我們根據中間的值60拆分葉節點。
在這裡插入圖片描述
因為圖片顯示的關係,這次我沒有能在各葉節點加上雙向連結串列指標。最後我們來插入記錄95,這時符合表5-1討論的第三種情況,即Leaf Page和Index Page都滿了,這時需要做兩次拆分。
在這裡插入圖片描述
可以看到,不管怎麼變化,B+樹總是會保持平衡。但是為了保持平衡,對於新插入的鍵值可能需要做大量的拆分頁(split)操作,而B+樹主要用於磁碟,因此頁的拆分意味著磁碟的操作,應該在可能的情況下儘量減少頁的拆分。因此,B+樹提供了旋轉(rotation)的功能。

旋轉發生在Leaf Page已經滿了、但是其左右兄弟節點沒有滿的情況下

在這裡插入圖片描述
可以看到,採用旋轉操作使B+樹減少了一次頁的拆分操作,而這時B+樹的高度依然還是2。

2、刪除

在這裡插入圖片描述
a)初始狀態
在這裡插入圖片描述

b)刪除22
在這裡插入圖片描述
c)刪除15
在這裡插入圖片描述
刪除後當前結點只有一個key,不滿足條件,而兄弟結點有三個key,可以從兄弟結點借一個關鍵字為9的記錄,同時更新將父結點中的關鍵字由10也變為9,刪除結束。
在這裡插入圖片描述
d)刪除7
在這裡插入圖片描述
當前結點關鍵字個數小於2,(左)兄弟結點中的也沒有富餘的關鍵字(當前結點還有個右兄弟,不過選擇任意一個進行分析就可以了,這裡我們選擇了左邊的),所以當前結點和兄弟結點合併,並刪除父結點中的key,當前結點指向父結點。
在這裡插入圖片描述


此時當前結點的關鍵字個數小於2,兄弟結點的關鍵字也沒有富餘,所以父結點中的關鍵字下移,和兩個孩子結點合併,結果如下圖所示。
在這裡插入圖片描述
參考資料:
[1].B+樹介紹 https://www.cnblogs.com/wade-luffy/p/6292784.html#_label0_1
[2].B樹和B+樹的插入、刪除圖文詳解 https://www.cnblogs.com/nullzx/p/8729425.html