二叉查找樹BST、紅黑樹、B-樹、B+樹
01 二叉查找樹BST(又稱二叉排序樹)的特性
- 左子樹上所有結點的值均小於或等於它的根結點的值。
- 右子樹上所有結點的值均大於或等於它的根結點的值。
- 左、右子樹也分別爲二叉排序樹。
二叉查找樹多次插入新結點會導致不平衡現象。
02 紅黑樹的特性和優勢,在什麼情況下需要變色、什麼情況下需要旋轉?
紅黑樹Red Black Tree是一種自平衡的二叉查找樹。
- 結點是紅色或黑色。
- 根結點是黑色。
- 每個葉子節點都是黑色的空結點(NIL結點)。
- 每個紅色結點的兩個子結點都是黑色。
(從每個葉子到根的所有路徑上不能有兩個連續的紅色結點)。 - 從任一結點到其每個葉子的所有路徑都包含相同數目的黑色結點。
- 正是因爲這些規則限制,才保證了紅黑樹的自平衡。
- 紅黑樹從根到葉子的最長路徑不會超過最短路徑的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+樹的優勢:
- 單一節點存儲更多的元素,使得查詢的IO次數更少。
- 所有查詢都要查找到葉子節點,查詢性能穩定。
- 所有葉子節點形成有序鏈表,便於範圍查詢。