紅黑樹是什么?紅黑樹 與 B+樹區別和應用場景?


紅黑樹是什么?怎么實現?應用場景

  紅黑樹(Red-Black Tree,簡稱R-B Tree),它一種特殊的二叉樹。 意味着它滿足二叉查找樹的特征:任意一個節點所包含的鍵值,大於等於左孩子的鍵值,小於等於右孩子的鍵值。 除了具備該特性之外,紅黑樹還包括許多額外的信息。

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

 紅定理:不會有連續的紅色節點 。黑定理:根節點必須是黑節點,所有葉子節點都是黑色。

性質1:每個節點要么是黑色,要么是紅色。
性質2:根節點是黑色。
性質3:每個葉子節點(NIL)是黑色。
性質4:每個紅色結點的兩個子結點一定都是黑色。
性質5:任意一結點到每個葉子結點的路徑都包含數量相同的黑結點。

基本操作是添加、刪除和旋轉。在對紅黑樹進行添加或刪除后,會用到旋轉方法。旋轉的目的是讓樹保持紅黑樹的特性。旋轉包括兩種:左旋 和 右旋;

紅黑樹的應用比較廣泛,主要是用它來存儲有序的數據,它的查找、插入和刪除操作的時間復雜度是O;

 

 

紅黑樹實際應用:

IO多路復用的實現采用紅黑樹組織管理,以支持快速的增刪改查.
ngnix中,用紅黑樹管理timer,因為紅黑樹是有序的,可以很快的得到距離當前最小的定時器.
java中TreeMap,jdk1.8的hashmap的實現.

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

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

B+樹:

B+ 樹是一種樹數據結構,是一個特殊的二叉樹,每個節點通常有多個子節點,一棵B+樹包含根節點、內部節點和葉子節點。根節點可能是一個葉子節點,也可能是一個包含兩個或兩個以上孩子節點的節點。

    • 非葉結點僅具有索引作用,跟記錄有關的信息均存放在葉結點中。
    • 樹的所有葉結點構成一個有序鏈表,可以按照關鍵碼排序的次序遍歷全部記錄,便於區間查找和遍歷。
    • B+ 樹的優點在於:由於B+樹在內部節點上不包含數據信息,因此在內存頁中能夠存放更多的key。因此訪問葉子節點上關聯的數據也具有更好的緩存命中率。B+樹的葉子結點都是相連的,因此對整棵樹的便利只需要一次線性遍歷葉子結點即可。而且由於數據順序排列並且相連,所以便於區間查找和搜索。
    • 而B樹則需要進行每一層的遞歸遍歷。相鄰的元素可能在內存中不相鄰,所以緩存命中性沒有B+樹好。但是B樹也有優點,其優點在於,由於B樹的每一個節點都包含key和value,因此經常訪問的元素可能離根節點更近,因此訪問也更迅速。下面是B 樹和B+樹的區別圖:
    • 如圖所示,區別有以下兩點:

      1. B+樹中只有葉子節點會帶有指向記錄的指針,而B樹則所有節點都帶有,在內部節點出現的索引項不會再出現在葉子節點中。
      2. B+樹中所有葉子節點都是通過指針連接在一起,而B樹不會。

B+樹 的優點:

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

B樹 的優點 對於在內部節點的數據,可直接得到,不必根據葉子節點來定位。

b+樹的應用場景:

B/B+樹是為了磁盤或其它存儲設備而設計的一種平衡多路查找樹,適用於數據庫存儲數據.
二叉查找樹的結構不適合數據庫,因為它的查找效率與層數相關。越處在下層的數據,就需要越多次比較。

 

為什么b+磁盤友好?

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

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

  3. 遍歷所有的數據更方便
    B+樹只要遍歷葉子節點就可以實現整棵樹的遍歷,而其他的樹形結構 要中序遍歷才可以訪問所有的數據。

 


免責聲明!

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



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