對B+樹,B樹,紅黑樹的理解

 出處:https://www.jianshu.com/p/86a1fd2d7406mysql

寫在前面,好像不一樣的教材對b樹,b-樹的定義不同。我就不糾結這個究竟是叫b-樹仍是b-樹了。sql

如圖所示,區別有如下兩點:數據庫

  1. B+樹中只有葉子節點會帶有指向記錄的指針,而B樹則全部節點都帶有,在內部節點出現的索引項不會再出如今葉子節點中。
  2. B+樹中全部葉子節點都是經過指針鏈接在一塊兒,而B樹不會。

B+樹的優勢:數據結構

  1. 非葉子節點不會帶上指向記錄的指針,這樣,一個塊中能夠容納更多的索引項,一是能夠下降樹的高度。二是一個內部節點能夠定位更多的葉子節點。
  2. 葉子節點之間經過指針來鏈接,範圍掃描將十分簡單,而對於B樹來講,則須要在葉子節點和內部節點不停的往返移動。具體的來說,如何想掃描一次全部數據,對於b+樹來講,能夠從由於他們的葉子結點是連在一塊兒的,因此能夠橫向的遍歷過去。而對於b-樹來講,就這能中序遍歷了。

B樹的優勢:
對於在內部節點的數據,可直接獲得,沒必要根據葉子節點來定位。性能

B樹長什麼樣子?mysql索引

紅黑樹和B樹應用場景有何不一樣?
爲何要設計紅黑樹?

  先說一下紅黑樹,紅黑樹有一個比較複雜的規則,紅的結點balala怎麼樣,黑的結點balalal怎麼樣。大一大二學這些的時候,傻呵呵的想背課文同樣背下來,當也不知道爲何要設計成這樣。換一句話說,爲何平衡樹和紅黑樹的區別是什麼?爲何有了平衡樹還要設計出來紅黑樹?spa

紅黑樹的規則:
1)每一個結點要麼是紅的,要麼是黑的。
2)根結點是黑的。
3)每一個葉結點(葉結點即指樹尾端NIL指針或NULL結點)是黑的。
4)若是一個結點是紅的,那麼它的倆個兒子都是黑的。
5)對於任一結點而言,其到葉結點樹尾端NIL指針的每一條路徑都包含相同數目的黑結點。設計

  如今想一想,個人理解是平衡樹(AVL)更平衡,結構上更加直觀,時間效能針對讀取而言更高,可是維護起來比較麻煩!!!(插入和刪除以後,都須要rebalance)。可是,紅黑樹經過它規則的設定,確保了插入和刪除的最壞的時間複雜度是O(log N) 。指針

設計紅黑樹的目的,就是解決平衡樹的維護起來比較麻煩的問題,紅黑樹,讀取略遜於AVL,維護強於AVL,每次插入和刪除的平均旋轉次數應該是遠小於平衡樹。blog

小結一下:

能用平衡樹的地方,就能夠用紅黑樹。用紅黑樹以後,讀取略遜於AVL,維護強於AVL。

紅黑樹 和 b+樹的用途有什麼區別?
  1. 紅黑樹多用在內部排序,即全放在內存中的,STL的map和set的內部實現就是紅黑樹。

  2. B+樹多用於外存上時,B+也被成爲一個磁盤友好的數據結構。

爲何b+磁盤友好?

  1. 磁盤讀寫代價更低
    樹的非葉子結點裏面沒有數據,這樣索引比較小,能夠放在一個blcok(或者儘量少的blcok)裏面。避免了樹形結構不斷的向下查找,而後磁盤不停的尋道,讀數據。這樣的設計,能夠下降io的次數。

  2. 查詢效率更加穩定
    非終結點並非最終指向文件內容的結點,而只是葉子結點中關鍵字的索引。因此任何關鍵字的查找必須走一條從根結點到葉子結點的路。全部關鍵字查詢的路徑長度相同,致使每個數據的查詢效率至關。

  3. 遍歷全部的數據更方便
    B+樹只要遍歷葉子節點就能夠實現整棵樹的遍歷,而其餘的樹形結構 要中序遍歷才能夠訪問全部的數據。

題外話:爲何mysql索引使用b+樹而不使用紅黑樹?

  b+樹就是爲文件存儲而生的。若是數據庫文件存儲在主存中我認爲兩種結構的查詢速度差距不是很大,由於主存的查找速度很是快。而數據庫文件實際存儲在磁盤中,定位一行信息須要查找該行文件所在柱面號,磁盤號,扇區號,頁號這個階段是很耗費時間的。每一次的定位請求意味着要作一次IO操做,也意味着成倍的時間消耗。所以減小IO查詢的次數是提升查詢性能的關鍵。而IO的查詢次數就是索引樹的高度,高度越低查詢的次數越少。一樣的結點次數紅黑樹的高度最多爲2log(n+1),而B+樹的高度最多爲(logt (n+1)/2)+1,隨着t增大高度會更小,IO次數也會減小。

相關文章
相關標籤/搜索