動態索引-【B樹】

談到索引原理,無疑就談到了B樹,B+樹,那麼我們從他們的定義,由來再到細節一一進行了解。

B樹:

B樹由來:

BST大家都瞭解是二叉搜索樹的意思,但是二叉樹他並非都是平衡的,嚴重失衡的情況下還有可能演化成線性表,從而降低了檢索效率。要知道添加索引的主要原因是爲了查詢速度快,所以其平衡性是非常重要的。
如何保證多分樹告訴上的平衡性,不讓他退換成線性呢?這就是其B樹的誕生緣由。在1970年的時候,R.Bayer和E.Mccreight提出了一種B樹。

定義一個m階的B樹滿足的條件:

  • 每個結點必須有m個子結點;
  • 除根結點和葉結點之外,其他每個結點必須有m/2(向上取整)個子結點;
  • 根結點至少有兩個子結點(特殊情況:根可以爲空,或者獨根);
  • 所有的葉結點在同一層,關鍵碼範圍m/2-1~m-1個 (m/2向上取整);
  • 有k個子結點的結點(分支結點)恰好包含k-1個關鍵碼;

    **對m階的解釋:**m階標識m路查找,m=2也就是二叉B樹。

B樹查找:

設B樹的高度爲3,也就是一個3階B樹,那麼在自頂向下檢索到葉結點的過程中可能需要進行3次讀索引盤(最多3次),再加上根據關鍵碼中隱含指針找到該記錄主文件的位置讀數據盤1次,所以最多需要N+1次訪問外存。
舉例:
3階B樹
比如檢索關鍵碼31,訪問外存的次數爲:3次訪問索引樹節點(a,c,i),1次讀取31所在的數據盤位置a12,相加爲4次;
又比如檢索48,訪問外存的次數爲:2次訪問索引樹節點(a,d),1次讀取48所在的數據盤位置a6,相加爲3次;
這就是B樹的查找。

B樹的插入:

簡單插入,無分裂過程:
插入1
在如上圖中,分別加入了14和55,因爲是三階B樹,所以每個結點最多包含m-1個關鍵碼,也就是每個結點最多包含2個關鍵碼。
當插入14的時候,需要3次讀盤操作(a,b,f),1次寫操作,因爲f目前只有一個關鍵碼,所以14直接插入到f裏即可。
當插入55的時候,需要3次讀盤操作(a,d,k),因爲將55插入k,導致了k溢出,所以把中間值上移到d位置,分類結點k爲k,k’,如上圖,因爲d結點只有一個關鍵碼48,所以52上移直接插入即可。
複雜插入,因插入元素導致分裂,有可能導致父結點向上溢出:
若插入關鍵碼19的話,我們就上圖分析一下:首先經過3次讀盤(a,c,g),當在結點g中插入關鍵碼19,導致結點g溢出,分裂出g’,關鍵碼20上移到結點c,導致結點c溢出,分裂出結點c’,中間值關鍵碼23上移到結點a,導致結點a溢出,分裂出結點a’,關鍵碼23上移,生出一個新結點,比如叫t.最後的B樹如下圖:
插入2
總共寫盤次數計算:g,g’,c,c’,a,c’,t一共7次寫盤。

B樹的刪除:

刪除需要注意的幾個關鍵:
1. 刪除關鍵碼,若該關鍵碼未在葉子結點上,必須交換位置,使其挪動到葉子結點上才能進行刪除操作;
2. 根據m階,要注意每個結點含有的關鍵碼範圍爲m/2向上取整-1 ~ m-1; 比如5階,關鍵碼範圍爲:2~4;
3. 若刪除之後,關鍵碼小於最小關鍵碼範圍,則考慮向左兄弟借關鍵碼,若左兄弟也很可憐,沒有可借給你的,則此時可以考慮和左兄弟結點以及父結點合併;
4. 若m值小,意味着關鍵碼個數少,若刪除則出現空結點的範圍比較大,所以這種情況,可以先考慮合併,再考慮借關鍵碼;
5. 實際應用中,B樹的階都很大,所以還是考慮借再考慮合併的情況比較多;
以5階B樹爲例講述刪除操作(m=5):
5階B數
因爲定義的是5階B數,所以每個結點含的關鍵碼範圍爲:2~4;最小爲2,最大爲4;
刪除關鍵碼120,與後繼結點交換,也就是120和134交換位置;120刪除,結點h含有關鍵碼剩餘146一個,不在關鍵碼範圍內,所以向左鄰居借值,兄弟和父結點一起排序(108,110,115,118,134,146)取中位數(第二位,使得左結點比右結點多一個,不能太貪)作爲新分界,也就是118成了新分界,結點h中此刻包含關鍵碼134,146;結點c中包含的關鍵碼未118,150;結點g包含關鍵碼108,110,115;如下圖:

刪除120之後的B樹
此刻再刪除120的基礎上,我們再刪除關鍵碼150,150要和後繼156交換位置,i此時只有關鍵碼177,向左鄰居借,無可借,進行合併操作,h和156和i合併成i,釋放空間結點h;此時父節點c只有118一個關鍵碼,所以也出現了下溢出操作,由於左鄰居b無關鍵碼可借,所以合併b,父節點103和c,最後的B樹爲:
刪除150之後的B樹

以上就是我們對B樹的增,刪,查的相關操作和整理。對於B樹有如下性質:

性質:

  • B樹總是樹高平衡的,所有的葉結點都在同一層;
  • 更新和檢索操作隻影響一些磁盤快,因此性能很好;
  • B樹把關鍵碼相近的記錄放到同一個磁盤塊裏,利用了訪問局部性原理;
  • B樹保證樹中至少有一定比例的結點是滿的,這樣既能夠保證一定的空間利用率,又使得插入和刪除不必頻繁的修改結點,從而整體上減少了磁盤讀取數。

下篇整理B+樹。

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