【轉】數據結構-B樹

介紹

B樹的目的爲了硬盤快速讀取數據(降低IO操作次樹)而設計的一種平衡的多路查找樹。目前大多數據庫及文件索引,都是使用B樹或變形來存儲實現。

目錄

  1. 爲什麼B樹效率高
  2. B樹存儲
  3. B樹缺點

爲什麼B樹效率高

在大規模數據存儲操作中,由於無法一次性加載到內存裏。所以避免不了發生內外存交換。所以次數越少,效率表現也越高。

來看下面這張圖:

這是個典型的b樹結構,初始因子爲1000,高度僅爲3的b樹,就可以存儲1002001000的數據了。

假設要查詢最後一個數據:

  • 從硬盤加載根節點搜索,IO一次。
  • 根據根節點的指針信息,去加載第二層的節點, IO一次。
  • 重複2,IO一次。

IO只用了3次,就查詢了需要的數據,所以說B樹效率是非常高的。

B樹的節點,在硬盤裏表現爲:柱面裏的頁(page)或盤塊(block) ,如果把索引持久化到內存,只需要一次就夠了。

B樹的高效的前提是數據已排序。

B樹結構

  

這是B樹存儲在硬盤的邏輯結構圖。

其中根節點中17,35在稱爲關鍵字(key) ,實際中往往附帶更多複雜類型數據。

可以看出一個節點包含 keys  ChildNotePointer  2部分信息。

 

根據這張圖介紹下b樹的基礎定義:

這是顆5階B樹的圖,階簡寫m。

    1:樹中每個結點最多含有m個子節點(m>=2)。 

    2:每個內節點至少 [ceil(m / 2)] 個子節點。  內節點即非根節點非頁子節點,也可以叫中間節點。

    3: 關鍵字key的數量   [ceil(m / 2)-1]<= n <= m-1,關鍵字按遞增排序。

    6: 每個葉節點具有相同的深度,即樹的高度h,而且不包含關鍵字信息。

上圖也可稱爲最小度數爲3的b樹,(degree) ,簡寫t。  

              t其實是上面第二條定義中 [ceil(m / 2)] 的值,即t=[ceil(m/2)], 3=ceil(5/2) 。 

    1:每個非根節點至少有t-1個關鍵字,非根內節點至少有t個子節點。 t稱爲度數(degree),t>=2  。

 .  2:每個節點至多有2t-1關鍵字,每個內節點最多有2t個子節點。

    3:每個葉節點具有相同的深度,即樹的高度h,而且不包含關鍵字信息。

度和階都是描述子節點的數量的。

算法導論譯版中是用度來描述的。

數據結構與算法分析是用階來描述,網上大多也是。

下面簡單的描述實現邏輯。

搜索:從根節點搜索,找到返回,找不到遞歸子節點。一直搜索到葉子節點,找到返回,找不到則說明key不存在。

1
2
3
4
5
6
7
8
9
10
11
12
13
//僞代碼
entry BTreeSearch(node, key) {
    if(node == null)
           return null;
    for(int i = 0; i < node.keys.length; i++)
    {
        if(node.keys[i] == key)
               return node.data[i];
    }
    return BTreeSearch(ChildrenNode[i].node,key);
}
 
var  entry = BTreeSearch(root, my_key);

插入:根節點插入,不滿直接插入。節點滿進行分裂,再滿遞歸分裂。

刪除:查詢到節點,然後進行刪除操作,不滿足B數節點的定義則進行節點合併。

更新:查詢到子節點,更新數據。

B樹缺點

從上面的得知,在查詢單條數據是非常快的。但如果範圍查的話,b樹每次都要從根節點查詢一遍。

所以在實際應用中,往往採用b樹的變形,b+樹來存儲,只有葉子節點存儲數據,每個葉子節點都指向下一個。

參考博客 http://blog.csdn.net/v_JULY_v/article/details/6530142/

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