drzewa czerwono-czarne
Transkrypt
drzewa czerwono-czarne
Binboy at Sphere http://binboy.sphere.p l Drzewa czerwono-czarne. Autor: Jacek Zacharek Wstęp. Pojęcie drzewa czerwono-czarnego (red-black tree) zapoczątkował Rudolf Bayer w książce z 1972 r. pt. „Symmetric Binary B-Trees: Data Structure and Maintenance Algorithms”. Nową strukturę Bayer nazywał początkowo symetrycznymi drzewami binarnymi. Później zagadnieniu przyglądali się L. J. Guibas i R. Sedgewick, którzy dodali własności czerwono-czarne. Drzewa RB są szczególnym przypadkiem drzew przeszukiwań binarnych (BST). Aby w pełni zrozumieć artykuł należy zapoznać się z podstawowymi pojęciami/operacjami na drzewach BST. Podstawowe pojęcia. Definicja: Drzewo czerwono-czarne (RB) jest to drzewo przeszukiwań binarnych (BST) o następujących 5 własnościach: 1) każdy węzeł ma jeden z dwóch kolorów: czerwony lub czarny, 2) korzeń ma kolor czarny, 3) każdy pusty liść (NIL) jest czarny, 4) synowie czerwonego wierzchołka są czarni, 5) każda ścieżka z korzenia do jakiegokolwiek liścia zawiera tą samą liczbę czarnych węzłów. Ostatni podpunkt jest własnością, która powoduje zrównoważenie całego drzewa. Poprzez wymuszenie identycznej „czarnej wysokości” dla węzłów na tej samej wysokości, wymuszana jest tym samym wysokość całego drzewa. Czarna wysokość węzła v, oznaczana jako bh(v), jest to liczba czarnych węzłów znajdujących się na dowolnej ścieżce z węzła v (wykluczając v) do któregokolwiek liścia. Przykładowe drzewo czerwono-czarne. Wszystkie powyższe własności, zastosowane dla drzewa przeszukiwań binarnych, tworzą nową, udoskonaloną, strukturę danych. Drzewa czerwono-czarne, lepiej niż drzewa innego typu, sprawdzają się w szybkim wyszukiwaniu elementów. Operacje takie jak dodanie/usuwanie, wyszukiwanie elementu, wyszukiwanie elementu najmniejszego/największego, wskazanie następnika/poprzednika danego elementu działają w czasie O(lg n). Wyszukiwanie. Jako że, drzewo czerwono-czarne jest drzewem przeszukiwań binarnych, wyszukiwanie elementu o kluczu k odbywa się tak samo jak wyszukiwanie w standardowym drzewie BST. Rekurencyjna funkcja Search(v, k) jako parametry przyjmuje wskaźnik do korzenia v oraz wartość klucza k do znalezienia. Funkcja zwraca wskaźnik do elementu o wartości klucza k lub wartość NIL, jeżeli taki klucz nie został znaleziony: Search(v, k) if (v jest liściem) lub (key[v] = k) then return v if k < key[v] then return Search(left[v], k) else return Search(right[v], k) Rotacja. Rotacja jest kluczową procedurą wykorzystywaną w procesie wstawiania i usuwania. Schemat przedstawia działanie 2 odmian: lewej i prawej rotacji. Rotacja zachowuje porządek inorder kluczy. Lewa rotacja może być wykonana tylko, gdy prawy syn x jest niepusty. Lewa rotacja polega na „obrocie” wokół krawędzi między węzłami x i y. W wyniku rotacji y staje się nowym korzeniem poddrzewa, x staje się jego lewym synem, a lewy syn y zostaje prawym synem węzła x. Ogólny schemat rotacji. Wstawianie. Operacja wstawiania nowych elementów jest operacją dość skomplikowaną. W odróżnieniu od drzew BST, wstawiając element musimy pamiętać, aby zachować zrównoważenie drzewa. Wstawienie elementu w dowolnym miejscu może powodować zaburzenie struktury drzewa RB. Aby uniknąć pomyłek należy zapamiętać następujące własności: - Początkowo wstawiamy element tak, jak do standardowego drzewa BST. - Kolor każdego nowo dodanego elementu jest czerwony. - Jeżeli rodzic wstawionego węzła jest czarny to własność drzewa została zachowana. - Jeżeli rodzic wstawionego węzła jest czerwony to własność 4 została zaburzona (rodzic i syn mają kolor czerwony). Aby przywrócić własność należy przekolorować niektóre węzły i zmienić relację (wartości wskaźników) między niektórymi węzłami. Insert(T, v) if T = NIL //T jest pustym drzewem then v jest korzeniem i jest czarny przerwij if Search(T, key[v]) = NIL //sprawdzenie, czy elementu v nie ma już w drzewie then wstaw v do drzewa T tak jak w drzewie BST pokoloruj v na czerwono if rodzic v jest czerwony then przywróć własność drzewa RB wg 3 przypadków poniżej else przerwij //element v jest już w drzewie Przywracanie własności drzewa RB następuje tylko w sytuacji, gdy rodzic dodanego węzła jest czerwony. Oto 3 możliwe przypadki takiego zdarzenia: Przypadek 1. CZERWONY WUJEK Pierwsza możliwa sytuacja w przypadku czerwonego wujka. Druga możliwa sytuacja w przypadku czerwonego wujka. Opis: Nowo dodany węzeł jest zaznaczony niebieską obwódką. Aby pozbyć się ustawienia dwóch czerwonych węzłów (ojciec-syn) zmieniamy kolor ojca, dziadka oraz pradziadka dodanego węzła. W tym przypadku pradziadek powinien zmienić kolor na czerwony, jednak mając na uwadze drugą własność drzew RB pradziadek zmienia kolor z powrotem na czarny, gdyż jest korzeniem. Przypadek 2. CZARNY WUJEK, PRAWY SYN kolejność: a - b - c - d Opis: Nowo dodany węzeł jest zaznaczony niebieską obwódką. W pierwszej kolejności poddrzewo przechodzi proces rotacji (b-c) tak, że nowy wierzchołek i ojciec zmieniają poziom w drzewie. Po rotacji kolorujemy nowy węzeł na czarno, a stary korzeń na czerwono (d). Jak widać na rysunku przed rotacją wysokość drzewa wynosiła 2, po rotacji zmniejszyła się do 1. Przypadek 3. CZARNY WUJEK, LEWY SYN kolejność: a - b - c Opis: Przypadek 3 jest bardzo zbliżony do przypadku 2. Faktycznie został wykonany podobny zabieg, tylko dla innego węzła. Ponownie dokonano zabiegu rotacji, ale tym razem ojciec został umieszczony na szczycie poddrzewa, a nie nowo dodany wierzchołek. Podobnie jak poprzednio zmieniono kolory odpowiednich węzłów. Wysokość poddrzewa zmniejszyła się o jeden. PRZYKŁAD WSTAWIANIA NOWEGO WĘZŁA DO DRZEWA CZERWONO-CZARNEGO: Oryginalne drzewo. W następnych rysunkach czarne puste liście zostały pominięte ze względu na czytelność schematu. Wstawiamy wierzchołek oznaczony jako 4. Własność drzewa RB została zaburzona – czerwony zarówno ojciec jak i syn. Zaznaczono nowy węzeł jako x i jego wujka jako y. y jest czerwony, więc rozważamy przypadek 1. Zmieniono kolor węzła 5, 7 i 8. W następnym kroku x wskazuje na swojego dziadka – 7. Ojciec x jest nadal czerwony, więc nie została przywrócona własność drzewa RB. Oznaczamy wujka x jako y. W tej sytuacji wujek jest czarny, więc rozważamy przypadek 2. x wskazuje teraz na swojego ojca – 2, po czym zastosowano rotację lewą. W dalszym ciągu nie jest to drzewo czerwono-czarne. Zmieniono kolory węzłów 7 i 11 oraz zastosowano rotację prawą. Dopiero tak powstałe drzewo posiada wszystkie własności drzewa RB. Usuwanie. Podobnie, jak w przypadku wstawiania, usuwanie wymaga dodatkowej uwagi w celu zachowania zrównoważenia drzewa. Tym razem, zamiast martwić się o rodzica wstawianego elementu, skupić należy uwagę na kolorze usuwanego węzła. Należy pamiętać, że: - jeżeli usuwany wierzchołek jest czerwony, czarna wysokość drzewa nie jest zakłócona, - jeżeli usuwany wierzchołek jest czarny powoduje on zakłócenie zrównoważenia drzewa i należy naprawić czarną wysokość dla każdej ścieżki w drzewie. Delete(T, v) if v jest liściem then usuń v //zostaje zastąpiony czarnymi pustymi liśćmii if v jest czerwony //nie ma zmiany czarnej wysokości then koniec usuwania if v jest czarny then zrównoważ drzewo wg 4 przypadków poniżej else //v nie jest liściem znajdź najbardziej odpowiednie dziecko u do zamiany zamień v z u usuń v //zostaje zastąpiony czarnymi pustymi liśćmi if v jest czerwony //nie ma zmiany czarnej wysokości then koniec usuwania if v jest czarny then zrównoważ drzewo wg 4 przypadków poniżej Operację usuwania wykonuje się oczywiście tylko przy założeniu, że wierzchołek v istnieje w drzewie T. 4 przypadki, na które należy zwrócić uwagę w przypadku usuwania czarnego wierzchołka. Przypadek 1. CZERWONY BRAT kolejność: a - b - c - d Opis: W tym przypadku usunięcie wierzchołka 20 powoduje, ze w jego miejsce trafia syn 10 (b). Drzewo potrzebuje powtórnego zrównoważenia. Po wykonaniu rotacji lewej (c) wierzchołek x oraz jego brat muszą zostać przekolorowane (d). Przypadek 2. CZARNY BRAT, CZARNY BRATANEK kolejność: a - b - c Opis: W tym przypadku po usunięciu węzła 20, węzeł 10 trafia w jego miejsce. W odróżnieniu od przypadku pierwszego, tutaj następuje zmiana wysokości drzewa. Należy pokolorować x na czarno, brata na czerwono, ojca x na czarno, o ile to już nie zostało zrobione. Taki zabieg może powodować zachwianie własności RB drzewa. Należy sprawdzić czy relacje ojciec-dziadek są zachowane w tym przypadku i dalej w górę drzewa. Jest to jeden z najprostszych przypadków usuwania, gdyż zmienia się tylko kolory węzłów, a nie połączenia między nimi. Przypadek 3. CZARNY BRAT, LEWY CZERWONY BRATANEK kolejność: a - b - c - d Opis: Po usunięciu wierzchołka 35, węzeł 40 trafia w jego miejsce. Zgodnie z własnością 5 tak powstała drzewo nie jest drzewem czerwono-czarnym (b). Lewy syna brata x (10) jest czerwony, więc należy wykonać zabieg rotacji prawej (c) wokół brata x. Następnie należy zmienić kolor (d). W dalszym ciągu nie ma gwarancji, że tak zmodyfikowane drzewo jest drzewem RB, więc potrzebna jest jeszcze jedna rotacja, tym razem wokół nowego brata x – węzła 10. Ten zabieg jest podobny do sytuacji, gdyby wierzchołek 20 oryginalnie miał czerwonego prawego syna, więc rozważmy przypadek 4. Przypadek 4. CZARNY BRAT, PRAWY CZERWONY BRATANEK kolejność: a - b - c - d Opis: Powtórnie, 35 jest usuwany, a 40 wchodzi na jego miejsce. Brat x ma czerwone prawe dziecko (przypadek 3d). Po zabiegu rotacji, prawy bratanek jest na szczycie poddrzewa (c). Potrzebna jest zmiana koloru niektórych węzłów. Należy pokolorować starego brata x (20) oraz nowego brata (30) na czarno. X dostaje kolor czarny, a nowy dziadek (10) kolor taki sam jaki miał rodzic x przed rotacja (30 – czerwony). Linki. http://www.eli.sdsu.edu/courses/fall95/cs660/notes/RedBlackTree/RedBlack.html http://www.oopweb.com/Algorithms/Documents/Sman/Volume/s_rbt.txt - implementacja w C Bibliografia. T.H. Cormen - Wprowadzenie do algorytmów. Wikipedia - encyklopedia internetowa Wyświetleń: 5283 Jacek Zacharek (O użytkowniku) [email protected] Liczba punktów: 75 Użytkownik przyłączył się: 03.05.2005 i opublikował już: 1 artykuł. Copyright Š 2002-2006 by Binboy & Sphere