B樹和B+樹詳細解析

維基百科對B樹的定義爲“在計算機科學中,B樹(B-tree)是一種樹狀數據結構,它能夠存儲數據、對其進行排序並允許以O(log n)的時間複雜度運行進行查找、順序讀取、插入和刪除的數據結構。B樹,概括來說是一個節點可以擁有多於2個子節點的二叉查找樹。與自平衡二叉查找樹不同,B-樹爲系統最優化大塊數據的讀和寫操作。B-tree算法減少定位記錄時所經歷的中間過程,從而加快存取速度。普遍運用在數據庫和文件系統。”

定義

B 樹可以看作是對2-3查找樹的一種擴展,即他允許每個節點有M-1個子節點。

  • 根節點至少有兩個子節點
  • 每個節點有M-1個key,並且以升序排列
  • 位於M-1和M key的子節點的值位於M-1 和M key對應的Value之間
  • 其它節點至少有M/2個子節點

下圖是一個M=4 階的B樹:
在這裏插入圖片描述
可以看到B樹是2-3樹的一種擴展,他允許一個節點有多於2個的元素。

B樹的插入及平衡化操作和2-3樹很相似,這裏就不介紹了。下面是往B樹中依次插入

6 10 4 14 5 11 15 3 2 12 1 7 8 8 6 3 6 21 5 15 15 6 32 23 45 65 7 8 6 5 4

的演示動畫:
在這裏插入圖片描述
B+樹是對B樹的一種變形樹,它與B樹的差異在於:

  • 有k個子結點的結點必然有k個關鍵碼;
  • 非葉結點僅具有索引作用,跟記錄有關的信息均存放在葉結點中。
  • 樹的所有葉結點構成一個有序鏈表,可以按照關鍵碼排序的次序遍歷全部記錄。

如下圖,是一個B+樹:
在這裏插入圖片描述
下圖是B+樹的插入動畫:
在這裏插入圖片描述
B和B+樹的區別在於,B+樹的非葉子結點只包含導航信息,不包含實際的值,所有的葉子結點和相連的節點使用鏈表相連,便於區間查找和遍歷。

B+ 樹的優點在於:

  • 由於B+樹在內部節點上不包含數據信息,因此在內存頁中能夠存放更多的key。 數據存放的更加緊密,具有更好的空間局部性。因此訪問葉子節點上關聯的數據也具有更好的緩存命中率。
  • B+樹的葉子結點都是相鏈的,因此對整棵樹的便利只需要一次線性遍歷葉子結點即可。而且由於數據順序排列並且相連,所以便於區間查找和搜索。而B樹則需要進行每一層的遞歸遍歷。相鄰的元素可能在內存中不相鄰,所以緩存命中性沒有B+樹好。

但是B樹也有優點,其優點在於,由於B樹的每一個節點都包含key和value,因此經常訪問的元素可能離根節點更近,因此訪問也更迅速。下面是B 樹和B+樹的區別圖:
在這裏插入圖片描述

分析

對B樹和B+樹的分析和對前面講解的2-3樹的分析類似,

對於一顆節點爲N度爲M的子樹,查找和插入需要logM-1N ~ logM/2N次比較。這個很好證明,對於度爲M的B樹,每一個節點的子節點個數爲M/2 到 M-1之間,所以樹的高度在logM-1N至logM/2N之間。

這種效率是很高的,對於N=62*1000000000個節點,如果度爲1024,則logM/2N <=4,即在620億個元素中,如果這棵樹的度爲1024,則只需要小於4次即可定位到該節點,然後再採用二分查找即可找到要找的值。

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