B樹系列
文章目錄
B樹和B+樹的出現是爲了查詢數據時減少磁盤的IO次數,我們知道平衡二叉查找樹是一種查詢速度很快的數據結構。它的時間複雜度爲(logN),但是它由於是一個二叉樹,所以樹的高度相對於多叉樹來講是比較高的,所以爲了平衡磁盤IO與時間複雜度直接的關係,我們引入了B樹和B+樹;
1. B樹
上圖爲一個3-4樹,或者叫4階樹,即一個節點最多存儲3個key,一個節點最多有4個孩子(3+1);
在B樹裏,一個節點裏面有多個key;
1. B樹特點
- 每個節點最多有m-1個關鍵字(可以存有的鍵值對);
- 根節點最少可以只有一個關鍵字;
- 非根節點至少有m / 2 個關鍵字;
- 每個節點中的關鍵字都按照從小到大的順序排列,每個關鍵字的左子樹中的所有關鍵字都小於它,而右子樹中的所有關鍵字都大於它;
- 所有葉子節點都位於同一層,或者說根節點到每個葉子節點的長度都相同;
- 每個節點都存有索引和數據,也就是對應的key和value;
所以得到結論:
- 根節點的關鍵字數量範圍:1 <= k <= m-1;
- 非根節點的關鍵字數量範圍:m/2 <= k <= m-1;
所以我們在描述一個B樹的時候需要指定它的階數,階數表示了一個節點最多有多少個孩子節點,一般用 m 表示階數;
2. B樹的分裂過程:(插入)
分裂:高度是分裂出來的
- 插入的時候永遠在最下面的節點中進行插入(該在哪一塊,從上往下找唄,因爲這也是搜索樹啊);
- 中間的那個數往上走成爲一個新的節點,將分爲左和右;
3. B樹的刪除操作
-
如果刪除的是葉子節點中的元素,且刪除之後,那個葉子節點數還是大於m/2,這種情況直接刪除即可;
-
刪除非葉子節點中的元素,如下圖:
[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳
要刪除22這個節點,對於非葉子節點的刪除,我們要將後繼key覆蓋要刪除的key,然後在後繼key所在的子支中刪除這個key,結果如下:
此時發現26所在節點只有一個元素了,小於m/2,不符合B樹特點,如果它的兄弟節點的元素大於m/2,此時就要向它的兄弟節點借取,具體方法就是先向父節點借取,然後兄弟節點再給父節點補充,如下圖:
2. B+樹
1. B樹和B+樹的相同點:
- 根節點至少一個元素;
- 非根節點的元素範圍:m/2 <= k <=m-1
2. B樹和B+樹的不同點
- B+樹有兩種類型的節點:內部節點(也稱索引節點)和葉子節點 ;
- 內部節點就是非葉子節點,內部節點不存儲數據,只存儲索引,數據都存儲在葉子節點;
- 內部節點中的key都按照從小到大的順序排列,對於內部節點中的一個key,左樹種所有key都小於它,右樹中所有key都大於等於它,葉子節點中的記錄也按照key的大小排列;
- 每個葉子節點都存有相鄰葉子節點的指針,葉子節點本身依關鍵字的大小自小而大順序鏈接;
- 父節點存有右孩子的第一個元素的索引;
下面看一個B+樹的圖片來感受感受:
3. B+樹的插入操作
以下面的這顆5階的B+樹(m爲5)爲例,5階B+樹的節點最多4個元素,最少2個元素;
- 插入5,10,15,20
- 然後插入25,此時元素個數大於m-1,需要分裂:
- 接着插入26,30,繼續分裂:
3. B樹和B+樹總結⭐
B+樹相對於B樹有一些自己的優勢,可以歸結爲下面幾點:
- 單一節點存儲的元素更多,使得查詢的IO次數更少,所以也就使得它更適合作爲數據庫MySQL的底層數據結構;
- 所有的查詢都要查找到葉子節點,查詢性能是穩定的,而B樹,每個節點都可以查找到數據,所以不穩定;
- 所有的葉子節點形成了一個有序鏈表,更加便於查找;
4. 搜索樹總結
模型:
- key模型(Set)
- Map模型
哈希表和搜索樹的比較:
- 哈希表的時間複雜度爲O(1)
- 搜索樹不會遭到惡意衝突
- 搜索樹的中序是有序的
- 這個優點比如在數據庫的ORDER BY語句中,假如使用了索引,則直接返回其中序遍歷索引即可;
- hash表只支持等值查詢,不易於範圍查詢,而搜索樹實現範圍查詢就很容易;
B-樹、B+樹、B樹的區別(B只做瞭解即可)
數據庫中的索引就是在原有的數據之外又建立了一個B系列樹(MySQL中InnoDB爲B+樹);
數據庫也支持hash索引,這種索引只用於等值查詢;