紅黑樹,B+和B-區別


二叉查找樹

二叉查找樹也稱為有序二叉查找樹,滿足二叉查找樹的一般性質,是指一棵空樹具有如下性質:

  • 任意節點左子樹不為空,則左子樹的值均小於根節點的值.
  • 任意節點右子樹不為空,則右子樹的值均大於於根節點的值.
  • 任意節點的左右子樹也分別是二叉查找樹.
  • 沒有鍵值相等的節點.

B/B+樹是為了磁盤或其它存儲設備而設計的一種平衡多路查找樹(相對於二叉,B樹每個內節點有多個分支),與紅黑樹相比,在相同的的節點的情況下,一顆B/B+樹的高度遠遠小於紅黑樹的高度

B+樹,B-樹區別

 

 

1)B+樹中只有葉子節點會帶有指向記錄的指針,而B樹則所有節點都帶有,在內部節點出現的索引項不會再出現在葉子節點中。

2)B+樹中所有葉子節點都是通過指針連接在一起,而B樹不會。

3)B+樹的所有葉結點構成一個有序鏈表,可以按照關鍵碼排序的次序遍歷全部記錄,由於數據順序排列並且相連,所以便於區間查找和搜索。而B樹則需要進行每一層的遞歸遍歷。相鄰的元素可能在內存中不相鄰,所以緩存命中性沒有B+樹好。

B樹的優點:
如果經常訪問的數據離根節點很近,而B樹的非葉子節點存儲關鍵字數據的地址,所以這種數據檢索的時候會要比B+樹快。
B+樹優點:
  1. B+樹的層級更少:相較於B樹B+每個非葉子節點存儲的關鍵字數更多,樹的層級更少所以查詢數據更快;

  2. B+樹查詢速度更穩定:B+所有關鍵字數據地址都存在葉子節點上,所以每次查找的次數都相同所以查詢速度要比B樹更穩定;

  3. B+樹天然具備排序功能:B+樹所有的葉子節點數據構成了一個有序鏈表,在查詢大小區間的數據時候更方便,數據緊密性很高,緩存的命中率也會比B樹高。

  4. B+樹全節點遍歷更快:B+樹遍歷整棵樹只需要遍歷所有的葉子節點即可,而不需要像B樹一樣需要對每一層進行遍歷,這有利於數據庫做全表掃描。

 

適應場景

通常用於數據庫和操作系統的文件系統中。

紅黑樹

一種二叉查找樹,但在每個節點增加一個存儲位表示節點的顏色,可以是red或black. 通過對任何一條從根到葉子的路徑上各個節點着色的方式的限制,紅黑樹確保沒有一條路徑會比其它路徑長出兩倍.它是一種弱平衡二叉樹(由於是若平衡,可以推出,相同的節點情況下,AVL樹的高度低於紅黑樹),相對於要求嚴格的AVL樹來說,它的旋轉次數變少,所以對於搜索,插入,刪除操作多的情況下,我們就用紅黑樹.

性質

1.每個節點非紅即黑.

2.根節點是黑的。

3.每個葉節點(葉節點即樹尾端NUL指針或NULL節點)都是黑的.

4.如果一個節點是紅的,那么它的兩兒子都是黑的.

5.對於任意節點而言,其到葉子點樹NIL指針的每條路徑都包含相同數目的黑節點

適用場景

1.JAVA中TreeMap就是用的紅黑樹

 

 

現在想想,我的理解紅黑樹是讓平衡樹(AVL)更平衡,結構上更加直觀,時間效能針對讀取而言更高,但是維護起來比較麻煩!!!(插入和刪除之后,都需要rebalance)。但是,紅黑樹通過它規則的設定,確保了插入和刪除的最壞的時間復雜度是O(log N) 。

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

小結一下:

能用平衡樹的地方,就可以用紅黑樹。用紅黑樹之后,讀取略遜於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次數也會減少。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM