B樹和B+樹畫圖詳解

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索引,這種索引只用於等值查詢;

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