【B+樹操作實例】實例講解插入、刪除元素的過程

基本概念

B+樹是B樹的變種,常用於數據庫和操作系統的文件系統中。由於B+樹的非葉節點只存有其子樹的的索引,而真正的數據元素都在同一層,即都在葉節點上,所以其插入與刪除元素具有穩定的對數時間複雜度。對於一棵m階的B+樹(m代表子樹的最大數量),有如下特性:

  1. 每個節點至多有m個子樹
  2. 除根結點外,每個結點至少有[m/2]個子女,根結點至少有兩個子女
  3. 有k個子女的結點必有k個關鍵字

實例講解

對B+樹的插入和刪除操作可以遵循以下口訣:

以4階B+樹爲例,假設非葉節點保存的關鍵字是子節點的最大值。

在插入新元素的過程中,如果插入的元素小於該節點的最大值且未過飽和,插入結束(實例1);若插入的元素爲該節點的最大值,這種情況只會發生在處於兄弟子樹最右側的節點,需要替換父類中相應的關鍵字(實例2);如插入元素後該節點過飽和,則該節點分裂成兩個,並更新父節點的關鍵字(實例3)。

刪除元素可以分成3種情況:如果刪除的元素小於所處節點的最大值,刪除操作結束(實例4);如果刪除的元素時所處節點的最大值,則需要更新父節點的關鍵字(實例5);如果所處節點刪除該元素後元素數量小於2,則需要與兄弟節點合併,並更新父節點的關鍵字(實例6)。

如果看過我的【B樹操作】實例講解插入、刪除元素 作可以遵循以下口訣,可以發現與之相比,B+樹的口訣少了“上溢”和“下移”兩個概念,因爲在B+樹中全部元素都是保存在同一層(葉節點)的,如果過飽和或元素數量不足都是橫向拓展或收縮,只有在非葉節點記錄的關鍵字數量過飽和時纔會向上溢出。

實例1

 在插入7的過程中,7小於8,進入(3,6,8)得到(3,6,7,8),不需要更新父節點的關鍵字,插入操作結束。

實例2

在插入70到(57,60,63)的過程中,因爲70 比63大,所以插入70後節點變成(57,60,63,70),且更新父節點相對應的關鍵字63爲70。

實例3

向節點(46,47,52,55)插入元素54後得到過飽和的(46,47,52,54,55),需要分裂成(46,47,52)和(54,55)兩個節點,並將兩個新節點的關鍵字替換掉父節點原本的55,使父節變成(28,43,52,55,70),此時父節點又達到過飽和,所以繼續相似的操作,父節點也分裂得到(28,43,52)和(55,70),並更新根節點爲(13,52,70)。

實例4

6不是所處節點的最大值,刪除後不需要更新父節點關鍵字,刪除操作結束。

實例5

在刪除元素8時,節點(3,6)的最大值換成6,需要更新父節點的關鍵字。思考一下:在B樹的刪除操作中,我們總想向上接元素,但是在B+樹裏,每個關鍵字對應一個子樹,所以只要子樹數量不變,對父節點的影響就只是更新關鍵字。

實例6

刪除元素30後,節點(43) 元素數量少於2所以需要和左邊的兄弟節點合併並更新父節點中的關鍵字。

總結

相較於B樹而言,插入或刪除元素的操作都更加簡單和直觀,歸結起來的口訣:

如果你遇到的情況不在上面六種實例中,歡迎私信或留言讓我補充~

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章