1. 程式人生 > >經典搜尋演算法之2-3-4樹與紅黑樹

經典搜尋演算法之2-3-4樹與紅黑樹

1.2-3-4樹

    在筆者上篇文章中,介紹了B樹和B+樹,這裡我所說的2-3-4樹就是階為4的B樹。根據離散數學的圖論相關知識,可以證明2-3-4樹和紅黑樹是等價的。對於m階(m指的結點的最大分支數)B樹,其結點的值的個數n:1<=n<m。因此,對於2-3-4樹,其結點的值的個數1<=n<4,如下圖所示:

                      

2.紅黑樹

    紅黑樹也是一種平衡查詢樹,只不過其結點是帶有色彩的二叉查詢樹,紅黑樹可以保證在Olog(n)時間內完成查詢,插入和刪除。此外,紅黑樹具有其下特性:

  1. 結點是紅色或黑色。
  2. 根結點是黑色。
  3. 每個葉子結點都帶有兩個空的黑色結點(稱之為NIL節點,它又被稱為黑哨兵)。
  4. 每個紅色結點必須有兩個黑色的子結點。(從每個葉子到根的所有路徑上不能有兩個連續的紅色結點。)
  5. 從任一結點到其每個葉子結點的所有簡單路徑都包含相同數目的黑色節點。

  下面進行舉例說明:

                               

    上圖中左右兩棵樹是一樣的,只不過一個畫出了null結點,一個沒有畫出。我們在理解和真正操作的時候,以沒有null結點的圖進行理解操作即可。新增null結點表示資料結束,保證了所有結點都有兩個子結點,這樣做的好處是使得紅黑樹在演算法的實現上更簡單些。

   下面我們從圖來看2-3-4樹和紅黑樹為何的等價的:

   首先,我們將上圖中的紅結點放平:

                                      

    然後,我們將紅結點合併到與其在同一層、並直接相連的黑結點:

                                                          

   通過上面過程可看出任何紅黑樹可以轉化為2-3-4樹。都可以可以想想如何將最上面的2-3-4樹轉化為紅黑樹。

   紅黑樹的旋轉變色:

由於插入操作可能會破壞紅黑樹的平衡性,因此我們在插入值後需要對紅黑樹進行調整,這個調整過程就是紅黑樹結點的顏色變換和旋轉操作,這些操作都可以從2-3-4樹的角度來理解。

   假設我們在上圖的2-3-4樹中插入17,則:

         

    將其轉化為紅黑樹:

      

    插入完畢,相比直接在原紅黑樹進行旋轉變色,以2-3-4樹的方式更容易簡單理解。插入17後的紅黑樹其實是在原紅黑樹基礎上旋轉、變色得到的。

    紅黑樹一般應用在關聯陣列,關聯陣列是一種具有特殊索引方式的陣列。不僅可以通過整數來索引它,還可以使用字串或者其他型別的值來索引它。通俗的講,關聯陣列就是大家熟知的key-value系統。最典型的是,在java8以前,hashmap是陣列和連結串列實現的,在java8以後,為了防止某一索引處連結串列過長,造成hashmap的查詢、增刪操作效率降低,在某一索引處的連結串列長度達到8時,該處的連結串列會被紅黑樹所替換,以保證hashmap的效率。