二叉樹、平衡二叉樹、紅黑樹、B樹、B+樹與B*樹

1、二叉樹

1️⃣二叉查找樹的特色就是左子樹的節點值比父親節點小,而右子樹的節點值比父親節點大,如圖:java

img

基於二叉查找樹的這種特色,在查找某個節點的時候,能夠採起相似於二分查找的思想,快速找到某個節點。n 個節點的二叉查找樹,正常的狀況下,查找的時間複雜度爲 O(logN)。之因此說是正常狀況下,是由於二叉查找樹有可能出現一種極端的狀況,例如:面試

img

這種狀況也是知足二叉查找樹的條件,然而,此時的二叉查找樹已經近似退化爲一條鏈表,這樣的二叉查找樹的查找時間複雜度頓時變成了 O(n)。由此必須防止這種狀況發生,爲了解決這個問題,因而引伸出了平衡二叉樹。算法

2、平衡二叉樹

1️⃣概念
平衡二叉樹是基於二分法的策略提升數據的查找速度的二叉樹的數據結構。sql

2️⃣規則
平衡二叉樹是採用二分法思惟把數據按規則組裝成一個樹形結構的數據,用這個樹形結構的數據減小無關數據的檢索,大大的提高了數據檢索的速度;平衡二叉樹的數據結構組裝過程有如下規則:
①非葉子節點只能容許最多兩個子節點存在。
②每個非葉子節點數據分佈規則爲左邊的子節點小當前節點的值,右邊的子節點大於當前節點的值(這裏值是基於本身的算法規則而定的,好比hash值)。數據庫

img

平衡樹的層級結構:平衡二叉樹的查詢性能和樹的層級(高度h)成反比,h值越小查詢越快。爲了保證樹的結構左右兩端數據大體平衡。下降二叉樹的查詢難度通常會採用一種算法機制實現節點數據結構的平衡,實現了這種算法的有好比Treap、紅黑樹。使用平衡二叉樹能保證數據的左右兩邊的節點層級相差不會大於1,經過這樣避免樹形結構因爲刪除增長變成線性鏈表影響查詢效率,保證數據平衡的狀況下查找數據的速度近於二分法查找:設計模式

img

3️⃣平衡二叉樹特色:
①非葉子節點最多擁有兩個子節點。
②非葉子節點值大於左邊子節點、小於右邊子節點。
③樹的左右兩邊的層級數相差不會大於1。
④沒有值相等重複的節點。緩存

3、紅黑樹

1️⃣爲何有了平衡樹還須要紅黑樹?
雖然平衡樹解決了二叉查找樹退化爲近似鏈表的缺點,可以把查找時間控制在 O(logn),不過卻不是最佳的,由於平衡樹要求每一個節點的左子樹和右子樹的高度差至多等於1,這個要求實在是太嚴了,致使每次進行插入/刪除節點的時候,幾乎都會破壞平衡樹的第二個規則,進而都須要經過左旋和右旋來進行調整,使之再次成爲一顆符合要求的平衡樹。數據結構

2️⃣紅黑樹的特性
顯然,若是在插入、刪除很頻繁的場景中,平衡樹須要頻繁調整,這會使平衡樹的性能大打折扣,爲了解決這個問題,因而有了紅黑樹,紅黑樹具備以下特色:
①每一個節點或者是黑色,或者是紅色。
②根節點是黑色。
③每一個葉子節點(NIL)是黑色。 [注意:這裏葉子節點,是指爲空(NIL或NULL)的葉子節點]
④若是一個節點是紅色的,則它的子節點必須是黑色的。
⑤從一個節點到該節點的子孫節點的全部路徑上包含相同數目的黑節點。[這裏指到葉子節點的路徑]函數

包含n個內部節點的紅黑樹的高度是 O(log(n))。如圖:性能

img

3️⃣紅黑樹的使用場景
java中使用到紅黑樹的有TreeSet和JDK1.8的HashMap。紅黑樹的插入和刪除都要知足以上5個特性,操做很是複雜,爲何要使用紅黑樹?緣由:
紅黑樹是一種平衡樹,複雜的定義和規則都是爲了保證樹的平衡性。若是樹不保證平衡性就是下圖:很顯然這就變成一個鏈表了。

img

保證平衡性的最大的目的就是下降樹的高度,由於樹的查找性能取決於樹的高度。因此樹的高度越低搜索的效率越高!

4、B樹(B-tree)

B樹和B-tree,實際上是同一種樹。

1️⃣概念
B樹和平衡二叉樹稍有不一樣的是B樹屬於多叉樹又名平衡多路查找樹(查找路徑不僅兩個),數據庫索引技術裏大量使用B樹和B+樹的數據結構。

2️⃣規則
①排序方式:全部節點關鍵字是按遞增次序排列,並遵循左小右大原則。
②子節點數:非葉子節點的子節點數>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樹(便於理解直接用實際字母的大小來排列C>B>A):

img

3️⃣B樹的查詢流程
如要從上圖中找到E,查找流程以下:
①獲取根節點的關鍵字進行比較,當前根節點關鍵字爲M,E<M(26個字母順序),因此往找到指向左邊的子節點(二分法規則,左小右大,左邊放小於當前節點值的子節點、右邊放大於當前節點值的子節點)。
②拿到關鍵字D和G,D<E<G 因此直接找到D和G中間的節點。
③拿到E和F,由於E=E,因此直接返回關鍵字和指針信息(若是樹結構裏面沒有包含所要查找的節點則返回null)。

4️⃣B樹的插入節點流程
定義一個5階樹(平衡5路查找樹),如今要把三、八、3一、十一、2三、2九、50、28這些數字構建出一個5階樹出來。遵循規則:
①節點拆分規則:當前是要組成一個5路查找樹,那麼此時m=5,關鍵字數必須<=5-1(這裏關鍵字數>4就要進行節點拆分)。
②排序規則:知足節點自己比左邊節點大,比右邊節點小。

先插入 三、八、3一、11:

img

再插入2三、29:

img

再插入50、28:

img

5️⃣B樹節點的刪除

規則:
①節點合併規則:當前是要組成一個5路查找樹,那麼此時m=5,關鍵字數必須大於等於ceil(5/2)(這裏關鍵字數<2就要進行節點合併)。
②知足節點自己比左邊節點大,比右邊節點小的排序規則。

③關鍵字數小於二時先從子節點取,子節點沒有符合條件時就向父節點取,取中間值往父節點放。

img

特色:
B樹相對於平衡二叉樹的不一樣是,每一個節點包含的關鍵字增多了,特別是在B樹應用到數據庫中的時候,數據庫充分利用了磁盤塊的原理(磁盤數據存儲是採用塊的形式存儲的,每一個塊的大小爲4K,每次IO進行數據讀取時,同一個磁盤塊的數據能夠一次性讀取出來)把節點大小限制和充分使用在磁盤快大小範圍;把樹的節點關鍵字增多後樹的層級比原來的二叉樹少了,減小數據查找的次數和複雜度。

5、B+樹

1️⃣概念
B+樹是B樹的一個升級版,B+樹更充分的利用了節點的空間,讓查詢速度更加穩定,其速度徹底接近於二分法查找。爲何說B+樹查找的效率要比B樹更高、更穩定?

2️⃣規則
①B+跟B樹不一樣。B+樹的非葉子節點不保存關鍵字記錄的指針,只進行數據索引,這樣使得B+樹每一個非葉子節點所能保存的關鍵字大大增長。
②B+樹葉子節點保存了父節點的全部關鍵字記錄的指針,全部數據地址必需要到葉子節點才能獲取到。因此每次數據查詢的次數都同樣。
③B+樹葉子節點的關鍵字從小到大有序排列,左邊結尾數據都會保存右邊節點開始數據的指針。
④非葉子節點的子節點數=關鍵字數(百度百科。根據各類資料,這裏有兩種算法的實現方式,另外一種爲非葉節點的關鍵字數=子節點數-1(維基百科),雖然數據排列結構不同,但其原理仍是同樣的。Mysql 的 B+樹是用第一種方式實現)。

img

百度百科算法結構示意圖

img

維基百科算法結構示意圖

3️⃣特色
①B+樹的層級更少:相較於B樹B+每一個非葉子節點存儲的關鍵字數更多,樹的層級更少因此查詢數據更快。
②B+樹查詢速度更穩定:B+全部關鍵字數據地址都存在葉子節點上,因此每次查找的次數都相同因此查詢速度要比B樹更穩定。
③B+樹自然具有排序功能:B+樹全部的葉子節點數據構成了一個有序鏈表,在查詢大小區間的數據時候更方便,數據緊密性很高,緩存的命中率也會比B樹高。
④B+樹全節點遍歷更快:B+樹遍歷整棵樹只須要遍歷全部的葉子節點便可,而不須要像B樹對每一層進行遍歷,這有利於數據庫作全表掃描。
⑤B樹相對於B+樹的優勢是,若是常常訪問的數據離根節點很近,而B樹的非葉子節點自己存有關鍵字其數據的地址,因此這種數據檢索的時候會要比B+樹快。

6、B*樹

1️⃣規則
B樹是B+樹的變種,區別以下:
①首先是關鍵字個數限制問題,B+樹初始化的關鍵字初始化個數是cei(m/2),B
樹的初始化個數爲cei(2/3m)。
②B+樹節點滿時就會分裂,而B
樹節點滿時會檢查兄弟節點是否滿(由於每一個節點都有指向兄弟的指針),若是兄弟節點未滿則向兄弟節點轉移關鍵字,若是兄弟節點已滿,則從當前節點和兄弟節點各拿出1/3的數據建立一個新的節點出來。

2️⃣特色
在B+樹的基礎上因其初始化的容量變大,使得節點空間使用率更高,而又存有兄弟節點的指針,能夠向兄弟節點轉移關鍵字的特性使得B*樹額分解次數變得更少;

img

7、 總結

1️⃣相同思想和策略
從平衡二叉樹、B樹、B+樹、B*樹整體來看它們的貫徹的思想是相同的,都是採用二分法和數據平衡策略來提高查找數據的速度。

2️⃣不一樣的方式的磁盤空間利用
不一樣點是它們一個一個在演變的過程當中經過IO從磁盤讀取數據的原理進行一步步的演變,每一次演變都是爲了讓節點的空間更合理的運用起來,從而使樹的層級減小達到快速查找數據的目的。

做者:平常更新
連接:https://www.jianshu.com/p/b597aa97c9de

歡迎關注公衆號 【碼農開花】一塊兒學習成長 我會一直分享Java乾貨,也會分享免費的學習資料課程和麪試寶典 回覆:【計算機】【設計模式】【面試】有驚喜哦

相關文章
相關標籤/搜索