學習筆記 | 紅黑樹、B-樹、B+樹

二叉查找樹BST、紅黑樹、B-樹、B+樹

01 二叉查找樹BST(又稱二叉排序樹)的特性

  1. 左子樹上所有結點的值均小於或等於它的根結點的值。
  2. 右子樹上所有結點的值均大於或等於它的根結點的值。
  3. 左、右子樹也分別爲二叉排序樹。

二叉查找樹多次插入新結點會導致不平衡現象。

02 紅黑樹的特性和優勢,在什麼情況下需要變色、什麼情況下需要旋轉?

紅黑樹Red Black Tree是一種自平衡的二叉查找樹。

  1. 結點是紅色或黑色。
  2. 根結點是黑色。
  3. 每個葉子節點都是黑色的空結點(NIL結點)。
  4. 每個紅色結點的兩個子結點都是黑色。
    (從每個葉子到根的所有路徑上不能有兩個連續的紅色結點)。
  5. 從任一結點到其每個葉子的所有路徑都包含相同數目的黑色結點。
  • 正是因爲這些規則限制,才保證了紅黑樹的自平衡。
  • 紅黑樹從根到葉子的最長路徑不會超過最短路徑的2倍。
  • 當插入或刪除結點的時候,紅黑樹的規則有可能被打破。這時候就需要做出一些調整,來接續維持我們的規則。
變色
  • 爲了重新符合紅黑樹的規則,嘗試把紅色結點變爲黑色,或者把黑色結點變爲紅色。
左旋轉
右旋轉

03 B-樹 Balance Tree

Mysql裏的索引是基於什麼數據結構?
  • 索引主要是基於Hash表或者B+樹。
B+樹的實現細節是什麼樣的?B-樹和B+樹有什麼區別?聯合索引在B+樹中如何存儲?
  • B-樹就是B樹,中間的橫線並不是減號。
  • B樹的一大優勢:自平衡
數據庫索引爲什麼要使用樹結構存儲呢?
  • 數據庫的索引是存儲在磁盤上的,當數據量比較大的時候,索引的大小可能有幾個G甚至更多。能做的只有逐一加載每個磁盤頁對應着索引樹的節點。
  • 磁盤的IO次數等於索引樹的高度。
  • 爲了減少磁盤IO次數,我們需要把原本“瘦高”的樹結構變得“矮胖”。這就是B-樹的特徵之一。
  • B-樹是一種多路平衡查找樹,它的每一個結點最多包含k個孩子,k被稱爲B樹的階。k的大小取決於磁盤頁的大小。
    在這裏插入圖片描述

一個m階的B樹具有如下幾個特徵:

1. 根結點至少有兩個子女。
2. 每個中間結點都包含k-1個元素和k個孩子,其中m/2 <= k <= m
3. 每一個葉子結點都包含k-1個元素,其中m/2 <= k <= m
4. 所有的葉子結點都位於同一層。
5. 每個結點中的元素從小到大排列,結點當中k-1個元素正好是k個孩子包含的元素的值域分劃。

  • B-樹主要應用於文件系統以及部分數據庫索引,比如著名的非關係型數據庫MongoDB。
  • 而大部分關係型數據庫,比如Mysql則使用B+樹作爲索引。

04 B+樹 Balance Tree

  • B+樹是基於B-樹的一種變體,有這比B-樹更高的查詢性能。

一個m階的B+樹具有如下幾個特徵:

1. 有k個子樹的中間結點包含有k個元素。(B-樹中是k-1個元素),每個元素不保存數據,只用來索引,所有數據都保存在葉子節點。
2. 所有的葉子結點中包含了全部元素的信息,及指向含這些元素記錄的指針,且葉子結點本身依關鍵字的大小自小而大順序鏈接。
3. 所有的中間結點元素都同時存在於子結點,在子結點元素中是最大(或最小)元素。
在這裏插入圖片描述
B+樹的優勢:

  1. 單一節點存儲更多的元素,使得查詢的IO次數更少。
  2. 所有查詢都要查找到葉子節點,查詢性能穩定。
  3. 所有葉子節點形成有序鏈表,便於範圍查詢。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章