平衡二叉樹
- 是在二叉排序樹上發展而來,
基於二分法
的策略,減少無關數據的檢索,大大的提升了數據檢索的速度。比二叉排序樹效率高
- 特點:
- 非葉子節點最多擁有兩個子節點
- 非葉子節值大於左邊子節點、小於右邊子節點
- 樹的左右兩邊的層級數相差不會大於1
- 沒有值相等重複的節點
B樹(B-tree)
-
B樹和平衡二叉樹稍有不同的是B樹屬於
多叉樹
又名平衡多路查找樹
(查找路徑不只兩個),數據庫索引技術裏大量使用者B樹和B+樹的數據結構。
-
規則:
- 排序方式: 所有節點關鍵字是按遞增次序排列,並遵循左小右大原則
- 子節點數: 非葉節點的子節點數>1,且<=M ,且M>=2,空樹除外(注:M階代表一個樹節點最多有多少個查找路徑,M=M路,當M=2則是2叉樹,M=3則是3叉)
- 關鍵字數: 枝節點的關鍵字數量大於等於
ceil(m/2)-1
個且小於等於M-1
個(注:ceil()是個朝正無窮方向取整的函數 如ceil(1.1)結果爲2) - 所有葉子節點均在同一層、葉子節點除了包含了關鍵字和關鍵字記錄的指針外也有指向其子節點的指針只不過其指針地址都爲null對應下圖最後一層節點的空格子
B+樹
- B+樹是B樹的一個升級版, B+ 樹元素自底向上插入。相對於B樹來說B+樹更充分的利用了節點的空間,讓查詢速度更加穩定,其速度完全接近於二分法查找。通常用於數據庫和操作系統的文件系統中。
- 規則
- B+跟B樹不同B+樹的非葉子節點不保存關鍵字記錄的指針,只進行數據索引,這樣使得B+樹每個非葉子節點所能保存的關鍵字大大增加
- B+樹葉子節點保存了父節點的所有關鍵字記錄的指針,所有數據地址必須要到葉子節點才能獲取到。所以每次數據查詢的次數都一樣
- B+樹葉子節點的關鍵字從小到大有序排列,左邊結尾數據都會保存右邊節點開始數據的指針
- 非葉子節點的子節點數=關鍵字數(這裏有兩種算法的實現方式,另一種爲非葉節點的關鍵字數=子節點數-1,雖然他們數據排列結構不一樣,但其原理還是一樣的Mysql 的B+樹是用第一種方式實現)
- 特點
- B+樹的層級更少: 相較於B樹B+每個非葉子節點存儲的關鍵字數更多,樹的層級更少所以查詢數據更快
- B+樹查詢速度更穩定: B+所有關鍵字數據地址都存在葉子節點上,所以每次查找的次數都相同所以查詢速度要比B樹更穩定;
- B+樹天然具備排序功能: B+樹所有的葉子節點數據構成了一個有序鏈表,在查詢大小區間的數據時候更方便,數據緊密性很高,緩存的命中率也會比B樹高。
- B+樹全節點遍歷更快: B+樹遍歷整棵樹只需要遍歷所有的葉子節點即可,而不需要像B樹一樣需要對每一層進行遍歷,這有利於數據庫做全表掃描。
- B樹相對於B+樹的優點是,如果經常訪問的數據離根節點很近,而B樹的非葉子節點本身存有關鍵字其數據的地址,所以這種數據檢索的時候會要比B+樹快。
總結
-
相同思想和策略:
從平衡二叉樹、B樹、B+樹、B*樹總體來看它們的貫徹的思想是相同的,都是採用二分法
和數據平衡策略
來提升查找數據的速度。 -
不同方式的磁盤空間利用
不同點:通過IO從磁盤讀取數據的原理在不斷演變,每一次演變都是爲了讓節點的空間更合理的運用起來,從而使樹的層級減少達到快速查找數據
的目的。
二叉查找(排序)樹
- 特點
- 左小右大
- 左右子樹也一定分別爲二叉排序樹
- 可以有值相等的結點(這也是與平衡二叉樹的區別)
紅黑樹
- 它是一種自平衡的二叉查找樹,是在計算機科學中用到的一種數據結構,典型的用途是實現關聯數組。
- 特點:
- 節點是紅色或者黑色
- 根節點是黑色
- 每個葉子的節點都是黑色的空節點(NULL)
- 每個紅色節點的兩個子節點都是黑色的。
- 從任意節點到其每個葉子的所有路徑都包含相同的黑色節點。
- 如果插入數據破壞了紅黑樹的特性
- 變色: 如果插入結點的過程破壞了紅黑樹的規則(紅結點的兩個子節點必須爲黑)那麼就要把節點紅變黑或者黑變紅。
- 左旋轉 如果一步一步變到最後,全局不符合紅黑樹特性了,那麼就要進行左旋轉
- 右旋轉之後,如果還是不能滿足紅黑樹的特性,那麼就要進行右旋了
- 再變色 右旋之後,還是不行,就需要變色。
- 總結
紅黑樹很麻煩,但是用的很多,不得不重視!!!