1. 程式人生 > >B+樹插入過程改進

B+樹插入過程改進

B+樹的定義

一棵m階的B+樹需滿足下列條件:
(1)每個分支節點最多有m棵子樹;
(2)非葉根節點至少有兩棵子樹,其他每個分支節點至少有m/2棵子樹;
(3)節點的子樹個數與關鍵字個數相等;
(4)所有葉節點包含包含全部關鍵字及指向相應記錄的指標,而且葉節點中將關鍵字按大小順序排列,並且相鄰葉節點按大小順序相互連結起來;
(5)所有分支節點中僅包括它的各個子節點中關鍵字的最大值及指向其子節點的指標。

B+樹的插入

在B+樹的插入過程中,由於每個節點的關鍵字個數有限制,所以會導致插入節點的關鍵字個數在超過階數時,該節點會分裂成兩個節點,同時為了滿足B+樹的性質,並會將節點中間的關鍵字複製一份放到它的父節點中。處理分裂過程是B+樹插入過程的關鍵。
我在學習B+樹的過程中,發現了另外一種分裂方式可以大大減少操作,提高效能。

(1)通常B+樹的插入過程

我們通常意義上的B+樹的插入過程,就是首先通過節點路徑上的節點找到插入的目標葉子節點,如果使得葉子節點裡的關鍵字數大於階數,那麼變會分裂,同時上升的關鍵字可能會導致它的父節點分裂,然後一直往上迭代,直到不能分裂為止,完成插入過程。
往B+樹中插入8
插入後

(2)改進B+樹插入過程

其實在我們上述的插入過程中有個回溯過程,然而我們完全可以避免這個過程。我們在插入時,我們的策略是,遇到一個滿階的節點就將它分裂,而不考慮這個節點在這次插入過程是否會分裂,就相當於預先提前為它做了分裂。看個例子,以4階為例;
往B+樹中插入8
插入後

B+樹插入總結

我們可以從上面的圖感覺到,相比之前的插入方式,改進的B+樹插入策略,避免了節點回溯查詢的工作量,在一定程度上會提高B+樹的插入效能。同時,我們在深入思考下,就會發現,採用這種方式的插入, 相當於另外一種概念的B+樹,一個變種的B+樹,總結起來就是先分裂後插入,會給人帶來一個感覺,當前的B+樹實際的階數比定義的階數小1,如一個4階的B+樹相當於一個三階的B+樹。