1. 程式人生 > >圖解B+樹並和B-樹特點對比總結

圖解B+樹並和B-樹特點對比總結

B+樹和B-樹總結:

B+ 樹是B-樹的變體,也是一種多路搜尋樹

B+樹與B-樹相同點在於:

1. 對於一顆M階B+和B-樹來說,根節點的分支數範圍為[2,m],非根結點的分支數範圍為[m/2(向上取整),m]

2. 所有葉子結點都在同一層

3. 插入操作都是在葉子結點完成(破壞結構後再向上調整)

B+ 樹與B-樹不同點在於:

1. B+樹非葉子結點的字數指標與關鍵字個數相同;B-樹所有結點的分支(指標)個數比關鍵字個數大1。(分支數都相同,關鍵字數B+ 樹與分指數相同,B-樹比分支數少1)

2. B+樹非葉子結點的字數指標P[i],指向關鍵字值屬於[k[i] , K[i+1]

(k[i] , K[i+1]] 的子樹(注意:B+樹關鍵字區間是“一開一閉”);

    B-樹都是開區間,因為結點內的關鍵字都不重複,所以不會出現一個區間閉合處的關鍵字,所以都是開區間,例:

    P[0]指向小於k[0]關鍵字的結點,p[1]指向大於k[0]小於k[1]關鍵字的結點,p[2]指向大於k[1]關鍵字的結點。(指標指向的結點不會包含上層關鍵 字)

3. B+樹的所有關鍵字都在葉子結點出現;B-樹的關鍵字可以在非葉子結點被找到。

4. B+樹為所有葉子結點增加了一個鏈指標,將所有葉子結點用指標鏈穿起來。(稠密索引)

總結B+ 樹和B- 樹插入刪除:

1. 都是在葉子結點進行插入,如果不破壞結構的話,直接插入;如果破壞結構,關鍵字多於規定時,進行結點拆分,在[m/2](向上取整)處拆分,拆分後再調整父節點到符合規定的狀態

2. B+樹刪除都是在葉子結點進行,如果不破壞結構的話,直接刪除;如果破壞結構,關鍵字少於規定時,先觀察左右兄弟結點,若結點關鍵字數大於[m/2](即大於最小值),則可以借結點過來,並調整父節點到規定結構;若左右兄弟結點不可借,則進行結點合併,再修改父節點到規定結構。

  B-樹殺出可能在葉子結點,可以在非葉子結點,在葉子結點和B+樹類似,不滿足結構時需要借關鍵字或合併結點;在非葉子結點時,需要找到他的相鄰關鍵字進行替換,在刪除葉子節點上的相鄰關鍵字(上一篇B-樹刪除操作裡說過)


B+樹定義及插入刪除操作圖解:(轉)

一,    M階B+樹的定義(M階是指一個節點最多能擁有的孩子數,M>2):

圖1.1 3階B+樹

        (1)根結點只有1個,分支數量範圍[2,m]。

        (2)除根以外的非葉子結點,每個結點包含分支數範圍[[m/2],m],其中[m/2]表示取大於m/2的最小整數。

        (3)所有非葉子節點的關鍵字數目等於它的分支數量。

        (4) 所有葉子節點都在同一層,且關鍵字數目範圍是[[m/2],m],其中[m/2]表示取大於m/2的最小整數。

        (5)所有非葉子節點的關鍵字可以看成是索引部分,這些索引等於其子樹(根結點)中的最大(或最小)關鍵字。例如一個非葉子節點包含資訊: (n,A0,K0, A1,K1,……,Kn,An),其中Ki為關鍵字,Ai為指向子樹根結點的指標,n表示關鍵字個數。即Ai所指子樹中的關鍵字均小於或等於Ki,而Ai+1所指的關鍵字均大於Ki(i=1,2,……,n)。

        (6)葉子節點包含全部關鍵字的資訊(非葉子節點只包含索引),且葉子結點中的所有關鍵字依照大小順序連結(所以一個B+樹通常有兩個頭指標,一個是指向根節點的root,另一個是指向最小關鍵字的sqt)。

二,    3階B+樹的插入舉例:

l  例1:

往下圖的3階B+樹中插入關鍵字9

首先查詢9應插入的葉節點(最左下角的那一個),插入發現沒有破壞B+樹的性質,完畢。插完如下圖所示:

l  例2:

往下圖的3階B+樹插入20

首先查詢20應插入的葉節點(第二個葉子節點),插入,如下圖

發現第二個葉子節點已經破壞了B+樹的性質,則把之分解成[20 21], [37 44]兩個,並把21往父節點移,如下圖

發現父節點也破壞了B+樹的性質,則把之再分解成[15 21], [44 59]兩個,並把21往其父節點移,如下圖

這次沒有破壞B+樹的性質(如果還是不滿足B+樹的性質,可以遞迴上去,直到滿足為至),插入完畢。

l  例3:

往下圖的3階B+樹插入100

首先查詢100應插入的葉節點(最後一個節點), 插入,如下圖

修改其所有父輩節點的鍵值為100(只有插入比當前樹的最大數大的數時要做此步),如下圖

然後重複Eg.2的方法拆分節點,最後得

三,    3階B+樹的刪除舉例:

l  例1:

刪除下圖3階B+樹的關鍵字91

首先找到91所在葉節點(最後一個節點),刪除之,如下圖

沒有破壞B+樹的性質,刪除完畢

l  例2:

刪除下圖3階B+樹的關鍵字97

首先找到97所在葉節點(最後一個節點),刪除之,然後修改該節點的父輩的鍵字為91(只有刪除樹中最大數時要做此步),如下圖

l  例3:

刪除下圖3階B+樹的關鍵字51

首先找到51所在節點(第三個節點),刪除之,如下圖

破壞了B+樹的性質,從該節點的兄弟節點(左邊或右邊)借節點44,並修改相應鍵值,判斷沒有破壞B+樹,完畢,如下圖

l  例4:

刪除下圖3階B+樹的關鍵字59

首先找到59所在葉節點(第三個節點),刪除之,如下圖

破壞B+樹性質,嘗試借節點,無效(因為左兄弟節點被借也會破壞B+樹性質),合併第二第三葉節點並調整鍵值,如下圖

完畢。

l  例5:

刪除下圖3階B+樹的關鍵字63

首先找到63所在葉節點(第四個節點),刪除之,如下圖

合併第四五葉節點並調整鍵值,如下圖

發現第二層的第二個節點不滿足B+樹性質,從第二層的第一個節點借59,並調整鍵值,如下圖

完畢

總結B+ 樹和B- 樹插入刪除:

1. 都是在葉子結點進行插入,如果不破壞結構的話,直接插入;如果破壞結構,關鍵字多於規定時,進行結點拆分,在[m/2](向上取整)處拆分,拆分後再調整父節點到符合規定的狀態

2. B+樹刪除都是在葉子結點進行,如果不破壞結構的話,直接刪除;如果破壞結構,關鍵字少於規定時,先觀察左右兄弟結點,若結點關鍵字數大於[m/2](即大於最小值),則可以借結點過來,並調整父節點到規定結構;若左右兄弟結點不可借,則進行結點合併,再修改父節點到規定結構。

  B-樹殺出可能在葉子結點,可以在非葉子結點,在葉子結點和B+樹類似,不滿足結構時需要借關鍵字或合併結點;在非葉子結點時,需要找到他的相鄰關鍵字進行替換,在刪除葉子節點上的相鄰關鍵字(上一篇B-樹刪除操作裡說過)