-
B-Tree
讀作B樹(不是B減樹),是一種自平衡的樹,能夠保持數據有序,這種數據結構能保證查找數據、順序訪問、插入刪除元素,都能在對數時間內完成。-
定義(引用自算法導論)
一棵B樹T具有以下的性質:-
每個節點x,
- 有n個關鍵字
- 每個關鍵詞按照非降序排列,x.key1<=x.key2<=x.key3<=...<=x.keyn
每個內部節點(非葉節點),有n+1個指向孩子節點的指針
-
每個內部節點的關鍵字,對孩子節點的關鍵字范圍加以分割
k1 <= x.key1 <= k2 <= x.key2 <= ... <= x.keyn <= kn+1
其中ki為孩子節點的關鍵字,x.keyi為內部節點的關鍵字
節點(2,6)將孩子節點劃分范圍 1<2<(3,5)<6<8 每個葉子節點有相同的深度,即樹的高度
-
每個節點包含的關鍵字的個數:
- 除了根節點以外的每個內部節點,至少有t-1個關鍵字,有t個孩子
- 如果樹非空,根節點至少有一個關鍵字
- 每個節點至多有2t-1個關鍵字,因此至多有2t個孩子
- t為B-樹的最小度數,t>=2
(t=2的B樹是最簡單的B樹,每個內部節點可以有2個、3個、4個孩子,即2-3-4樹)
-
-
定義(引用自算法導論)
-
B+Tree
B+樹和B-樹有一些共同點,也有一些新的特征-
定義
- B+樹的中間節點不保存關鍵字,只用來索引,所有數據(關鍵字)都保存在葉子節點上。
- 葉子節點包含了所有的關鍵字,且葉子節點上的關鍵字按照非降序排列。
- 所有父節點的元素都同時存在于子節點,且在子節點中是最大(或最小)元素。
-
有n個元素(等同于關鍵字,但不是關鍵字)的內部節點,有n個孩子節點(B-Tree有n+1個孩子)
B+樹,葉子節點按非降序鏈接
-
特征
- 根節點的最大元素也是整棵B+樹的最大元素。
- 每個葉子節點都含有指向下一個葉子節點的指針,形成一個有序鏈表。
- B+樹只有葉子節點含有衛星數據,B-樹中每個節點都含有衛星數據。
因為內部節點沒有衛星數據,相同大小的磁盤頁可以容納更多的節點元素,因此B+樹比B-樹更加的“矮胖”,因此磁盤IO次數會更少 - 在聚簇索引(Clustered Index)中,葉子節點直接含有衛星數據,而非聚簇索引(NonClustered Index),葉子節點含有指向衛星數據的指針。
-
B+樹查找過程
查找3, 第一次磁盤IO
第二次磁盤IO
第三次磁盤IO-
總結
- 因為內部節點含有衛星數據,B-樹的查找效率不穩定,最好的情況直接查找更節點就找到了,最壞情況要找到葉子節點才可以。
B+樹每次查找都需要查到葉子節點,是穩定的。 - 范圍查詢,B+樹只要遍歷葉子節點就可以了,而B-樹需要復雜的中序遍歷
- 因為更“矮胖”,B+樹需要更少的磁盤IO次數。
- 因為內部節點含有衛星數據,B-樹的查找效率不穩定,最好的情況直接查找更節點就找到了,最壞情況要找到葉子節點才可以。
-
總結
-
-
為什么用B+樹存儲索引
問題引入:使用B+樹做索引,查找效率大概是log(n),而hash做索引,效率是o(1),為什么不用hash做索引呢?
答:文件系統或者數據庫的索引一般存在硬盤上,如果數據量特別大的話,不能夠一次性全部加載到內存中。
假設內存每次只能加載2個數,我們把數據組成一個3路B-樹,這樣每個節點最多含有2個元素,查找的時候,每次只加載1個節點就行了。
之所以用B+樹,就像上邊介紹B+樹的時候說的,在范圍查找時非常方便,而B-樹需要使用中序遍歷,進行跨層訪問。
3路B-樹,每個節點最多含有2個元素
MS-數據結構-B-Tree&B+Tree
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。