Drzewa czerwono-czarne

by Jerry Sky

2020-03-30



Introduction

Na poprzednim wykładzie poznaliśmy strukturę BST, które pozwalają zaimplementować operacje na zbiorach dynamicznych w złożoności obliczeniowej O(h)O(h), gdzie hh jest wysokością BST.
Operacje te działają więc szybko, jeżeli wysokość drzewa przeszukiwań jest mała. Jeśli jednak wysokość drzewa jest duża h=O(n)h = O(n), to koszty operacji mogą być równie duże jak dla zwykłych list.
Dlatego powstało dużo modyfikacji BST (drzewa czerwono-czarne, drzewa AVL etc.), które pozwalają utrzymać drzewa poszukiwań w postaci zbalansowanej, czyli wysokość drzewa w pesymistycznym przypadku można ograniczyć przez Θ(logn)\Theta(\log n).
Teraz zajmiemy się drzewami czerwono-czarnymi (RB-Trees).

Warunki na RB-Tree

  1. Każdy węzeł drzewa przechowuje dodatkową informację: kolor węzła - czerwony albo czarny
  2. Każdy liść przechowujący wartość NIL\mathrm{NIL} jest czarny
  3. Jeśli węzeł jest czerwony, to obaj jego potomkowie są czarni
  4. Każda prosta ścieżka z ustalonego węzła do liścia ma tyle samo czarnych węzłów (liczbę tę nazywamy czarną wysokością węzła i oznaczamy przez bh()bh())

Lemma A

RB-Tree o nn kluczach ma wysokość co najwyżej 2lg(n+1)2\lg(n+1) (czyli h2lg(n+1)=Θ(logn)h \le 2\lg(n+1) = \Theta(\log n)).

D-d Lemma A

  1. Rozpatrzmy drzewo TT' powstałe z RB-Tree TT o nn kluczach (czyli 2n+12n+1 węzłach licząc razem z liśćmi) poprzez złączenie każdego czerwonego węzła z jego czarnym rodzicem. Tak powstałe drzewo TT' (2-3-4-tree) ma węzły zawierające jeden, dwa lub trzy klucze i odpowiednio dwa, trzy lub cztery pod-drzewa. Wysokość tak powstałego drzewa hh' jest równa czarnej wysokości korzenia oryginalnego drzewa TT (h=bh(T))(h' = bh(T)).
    Liczba liści (przechowujących wartość NIL\mathrm{NIL}) jest taka sama dla RB-Tree i drzewa powstałego po transformacji TT' i jest równa n+1n+1.
  2. Zauważmy, że liczbę liści drzewa TT' możemy ograniczyć przez 2h#lisˊci4h 2^{h'} \le \#liści \le 4^{h'} a zatem hlg(n+1)h' \le \lg(n+1).
  3. Zauważmy również, że wysokość RB-Tree TT może wynosić maksymalnie 2bh(T)=2h2bh(T) = 2h'.
    Zatem h2lg(n+1)h \le 2\lg(n+1).

Operacje

Operacje dodawania i usuwania węzłów z drzewa znane z poprzedniego wykładu w oczywisty sposób nie zachowują własności (porządku) RB-Tree, dlatego należy je rozszerzyć.
Rozszerzenia te będą wykonywały rekonstrukcję drzewa po której własności RB-Tree będą spełnione.
Wykorzystywane będą dwie procedury:

Recolor(x,color)\mathrm{Recolor}(x, color)

Ustawia colorcolor jako kolor węzła xx.
Złożoność obliczeniowa O(1)O(1).

Rotateright(T,x)\mathrm{Rotate_{right}}(T,x), Rotateleft(T,x)\mathrm{Rotate_{left}}(T,x)

Są to operacje odpowiednio prawej i lewej rotacji drzewa. Podczas rotacji drzewa względem węzła xx, węzeł xx jest zastępowany swoim odpowiednim potomkiem yy (dla prawej rotacji lewym potomkiem, dla lewej rotacji prawym potomkiem), xx staje się potomkiem yy (dla prawej rotacji prawym potomkiem, dla lewej lewym), a odpowiednie pod-drzewa xx i yy są przepinane w taki sposób aby własność BST była zachowana.
Złożoność obliczeniowa rotacji to O(1)O(1).

InsertRB\mathrm{Insert_{RB}}, DeleteRB\mathrm{Delete_{RB}}

Operacje InsertRB\mathrm{Insert_{RB}}, DeleteRB\mathrm{Delete_{RB}} mają asymptotyczną złożoność obliczeniową O(h)O(h), czyli taką jak w przypadku operacji Insert\mathrm{Insert} oraz Delete\mathrm{Delete} w zwykłym BST.
Natomiast jasne jest, że stała występujące przy hh będzie większa.

Sources

Więcej informacji na temat RB-Trees można znaleźć tutaj: