Wykład 8 Drzewa AVL i 2-3-4 1
Drzewa AVL Ø Drzewa AVL Definicja drzewa AVL Operacje wstawiania i usuwania Złożoność obliczeniowa Ø Drzewa 2-3-4 Definicja drzewa 2-3-4 Operacje wstawiania i usuwania Złożoność obliczeniowa Literatura R. Sedgewick, Algorytmy w C++, rozdz. 13 2
Drzewa AVL Definicja: drzewem AVL nazywamy drzewo BST, takie że dla każdego z węzłów różnica wysokości jego lewego i prawego poddrzewa wynosi co najwyżej 1. Skrót AVL pochodzi od nazwisk twórców: Adelson-Velskii oraz Landis x h h-1 S h-1 S h-2 h-2 S h S h = S h 1 + S h 2 3
Przykład drzewa AVL 2 4 44 17 78 1 2 32 50 1 1 48 62 3 88 1 4
Wysokość drzewa AVL Twierdzenie:wysokość drzewa AVL przechowującego n węzłów wynosi O(log n). n(2) 3 4 n(1) Dowód: ograniczymy najpierw n(h): minimalną ilość wewnętrznych węzłów w drzewie AVL o wysokości h. widać, że n(1) = 1 i n(2) = 2 dla n > 2, drzewo o wysokości h zawiera korzeń oraz dwa poddrzewa o wysokościach h-1 i h-2. stąd: n(h) = 1 + n(h-1) + n(h-2) wiemy, że n(h-1) > n(h-2), więc n(h) > 2n(h-2). Dalej n(h) > 2n(h-2), n(h) > 4n(h-4), n(h) > 8n(n-6),,n(h) > 2 i n(h-2i) rozwiązując powyższe dostaniemy n(h) > 2 h/2-1, czyli h < 2log n(h) +2 Ø Stąd wysokość drzewa AVL wynosi O(log n) 5
Wstawianie Ø Wstawiamy tak jak do drzewa BST Ø Zawsze dodajemy nowy liść. Ø Przykład : 44 44 17 78 17 78 a=y c=z 32 50 88 32 50 88 48 62 48 62 b=x w 54 przed Po wstawieniu 54 6
Rotacje Rotacja w prawo y x x δ Rotacja w lewo α y α β β δ α x β i x y δ α x y i β y δ 7
Left-Rotate Left-Rotate(T,x) y ß right[x] right[x] ß left[y] parent[left[y]] ß x parent[y] ß parent[x] if parent[x] = null then root[t] ß y else if x = left[parent[x]] then left[parent[x]] ß y left[y] ß x else right[parent[x]] ß y parent[x] ß y Inicjuj y Zamień lewe poddrzewo y na prawe poddrzewo x Przyłącz ojca x jako ojca y Przyłącz x jako lewego syna y 8
Przykład: Left-Rotate (1) 7 4 11 x 3 6 9 18 y 2 14 19 12 17 22 20 9
Przykład: Left-Rotate (2) 7 4 11 x 2 3 6 α 9 14 18 19 y 12 17 β 20 22 δ 10
Przykład: Left-Rotate (3) 7 4 18 y 3 6 11 x 19 2 9 α 14 12 17 β 20 22 δ 11
Przykład: Left-Rotate (4) 7 4 18 y 3 6 11 x 19 2 9 14 22 12 17 20 12
Rotacje Ø Zachowują własność drzewa BST. Ø Zajmują stały czas O(1) stała ilość operacji na wskaźnikach. Ø Rotacje w lewo i w prawo są symetryczne. 13
Przebudowa drzewa Ø niech (a,b,c) będzie pożądaną listą wierzchołków w porządku inorder Ø Przeprowadzamy rotacje, niezbędne do przemieszczenia b na górę poddrzewa a=z b=y (pozostałe dwa przypadki są symetryczne) a=z c=y przypadek 2: podwójna rotacja (prawa c, a potem lewa a) T 0 c=x T 0 b=x T 1 b=y T 3 b=x T 2 T 3 a=z c=x T 1 T 2 a=z c=y przypadek 1: pojedyncza rotacja (lewa rotacja a) T 0 T 1 T 2 T 3 T 0 T 1 T 2 T 3 14
Przykład wstawiania niezbalansowane... 5 44 z 2 64 17 78 2 1 3 y 32 1 50 4 2 1 x 48 3 62 1 54 5 T T 0 2 T 1 2 17...zbalansowane 7 1 88 T 3 4 44 3 2 y 1 2 2 32 1 50 3 78 1 1 5 48 54 4 Nie można wyświetlić obrazu. Na komputerze może brakować pamięci do otwarcia obrazu lub obraz może być uszkodzony. Uruchom ponownie komputer, a następnie otwórz plik ponownie. Jeśli czerwony znak x nadal będzie wyświetlany, konieczne może być usunięcie obrazu, a następnie ponowne wstawienie go. 62 x T 2 z 6 7 88 1 T 0 T 1 T 3 15
Przebudowa drzewa (pojedyncza rotacja) T 0 a = z T 1 b = y Nie moż na wyś wietl ić obra zu. Na kom pute rze moż e brak ować T 2 c = x 1 rotacja T 3 a = z b = y Nie moż na wyś wietl ić obra zu. Na kom pute rze moż e brak ować T 0 T 1 T 2 c = x T 3 T 0 a = x T 1 Nie mo żna wyś wiet lić obr azu. Na ko mp uter b = y T 2 c = z T 3 1 rotacja T 3 a = x T 2 Nie mo żna wyś wiet lić obr azu. Na ko mp uter b = y T 1 c = z T 0 16
Przebudowa drzewa (podwójna rotacja) T 0 a = z Nie możn a wyświ etlić obraz u. Na komp uterz e może brako wać pamię ci do otwar b = x T 2 c = y 2 rotacje T 3 T 0 a = z Nie możn a wyświ etlić obraz u. Na komp uterz e może brako wać pamię ci do otwar T 1 b = x T 2 c = y T 3 T 1 a = y b = x Nie mo żna wyś wiet lić obr azu. Na ko mp uter c = z 2 rotacje b = x a = y T 0 T 3 T 2 T 3 T 1 T 0 T 1 T 2 Nie mo żna wyś wiet lić obr azu. Na ko mp uter c = z 17
Usuwanie z drzewa AVL Ø Usuwamy, jak z drzewa BST może spowodować to zaburzenie zbalansowania drzewa. Ø Przykład: 44 44 17 62 17 62 32 50 78 50 78 48 54 88 48 54 88 Przed usunięciem 32 Po usunięciu 18
Przywracanie zbalansowania po usunięciu Ø Niech z będzie pierwszym niezbalansowanym węzłem, na który natrafiamy idąc od w. Niech y będzie dzieckiem z o większej wysokości, a x jego dzieckiem o większej wysokości. Ø Przeprowadzamy przebudowę drzewa w x, tak aby przywrócić zbalansowanie w z. Ø Ponieważ operacja taka może zachwiać balans w węźle powyżej - musimy sprawdzać zbalansowanie drzewa powyżej (aż do korzenia) a=z 44 62 w 17 62 b=y 44 78 50 78 c=x 17 50 88 48 54 88 48 54 19
Złożoność obliczeniowa operacji na drzewach AVL Ø Pojedyncza przebudowa zabiera czas O(1) Jeśli korzystamy ze struktury łączonego drzewa binarnego Ø Wyszukiwanie zajmuje O(log n) Wysokość drzewa wynosi O(log n), nie potrzeba przebudowywać drzewa Ø Wstawianie zajmuje O(log n) Odnalezienie miejsca O(log n) ze względu na wysokość drzewa Przebudowa drzewa O(1) Ø Usuwanie - O(log n) Odnalezienie zabiera czas O(log n) Naprawa drzewa O(log n) ze względuu na wysokość drzewa 20
Drzewa 2-3-4 9 2 5 7 10 14 21
Drzewa poszukiwań o wielu drogach Ø Drzewem poszukiwań o wielu drogach (B-drzewem) nazywamy uporządkowane drzewo o następujących cechach: Każdy węzeł wewnętrzny posiada co najmniej 2 potomków i przechowuje d -1 elementów-kluczy (k i, o i ), gdzie d jest ilością potomków węzła Dla każdego węzła o potomkach v 1 v 2 v d przechowującego klucze k 1 k 2 k d-1 Klucze w poddrzewie v 1 są mniejsze od k 1 Klucze w poddrzewie v i są pomiędzy k i-1 i k i (i = 2,, d - 1) Klucze w poddrzewie v d są większe od k d-1 Liście nie przechowują kluczy 11 24 2 6 8 15 27 32 30 22
Przechodzenie InOrder w drzewach o wielu drogach Ø Możliwe jest rozszerzenie notacji odwiedzania węzłów InOrder z drzew binarnych na drzewa o wielu drogach Ø Odwiedzamy element (k i, o i ) w węźle v pomiędzy rekursywnymi odwiedzinami poddrzew v o korzeniu w v i i v i + 1 Ø Odwiedzane węzły w tak zdefiniowanym porządku InOrder są uporządkowane rosnąco 11 24 8 12 2 6 8 15 27 32 2 4 6 10 14 18 30 1 3 5 7 9 11 13 16 19 15 17 23
Poszukiwanie w drzewach o wielu drogach Ø Podobnie do poszukiwania w drzewie BST Ø Dla każdego węzła wewnętrznego o potomkach v 1 v 2 v d o kluczach k 1 k 2 k d-1 : k = k i (i = 1,, d - 1):poszukiwanie zakończone sukcesem k < k 1 : poszukiwanie kontynuujemy w poddrzewie v 1 k i-1 < k < k i (i = 2,, d - 1): poszukiwanie kontynuujemy w poddrzewie v i k > k d-1 : poszukiwania kontynuujemy w poddrzewie v d Ø Dotarcie do liścia kończy poszukiwania (porażka) Ø Przykład : odszukujemy klucza 30 11 24 2 6 8 15 27 32 30 24
Drzewa 2-3-4 Ø Drzewa 2-3-4 nazywane też (2,4) są drzewami poszukiwań o wielu drogach o następujących własnościach własność ilości potomków: każdy węzeł wewnętrzny ma co najwyżej 4 potomków własność wysokości: wszystkie liście mają tę samą wysokość Ø W zależności od ilości potomków, wewnętrzne węzły będziemy nazywać 2-węzłami, 3-węzłami i 4-węzłami 10 15 24 2 8 12 18 27 32 25
Wysokość w drzewach 2-3-4 Ø Twierdzenie: Drzewo 2-3-4 przechowujące n elementów ma wysokość O(log n) dowód: niech h będzie wysokością drzewa 2-3-4 o n elementach ponieważ mamy co najmniej 2 i elementów na poziomie i = 0,, h - 1 i nie ma elementów ma poziomie h, więc stąd, h log (n + 1) n 1 + 2 + 4 + + 2 h-1 = 2 h - 1 Ø Wyszukiwanie w drzewie 2-3-4 o n elementach zajmuje czas O(log n) poziom 0 1 h-1 h elementy 1 2 2 h-1 0 26
Wstawianie Ø Nowy element (k, o) wstawiamy do węzła v ostatniego wewnętrznego węzła, przez który przechodziliśmy poszukując k Nie psujemy własności wysokości drzewa Możemy spowodować przepełnienie węzła (v może stać się 5-węzłem) Ø Przykład: wstawianie 30 powoduje przepełnienie 10 15 24 2 8 12 18 v 27 32 35 10 15 24 2 8 12 18 27 30 32 35 v 27
Przepełnienie i rozdzielanie węzła Ø Problem przepełnienia można rozwiązać przez podział węzła v: niech v 1 v 5 będą potomkami v i k 1 k 4 będą kluczami w v węzeł v zastępujemy 2 węzłami v' i v" v' jest 3-węzłem o kluczach k 1 k 2 i potomkach v 1 v 2 v 3 v" jest 2-węzłem o kluczach k 4 i potomkach v 4 v 5 klucz k 3 jest wstawiany do rodzica u węzła v (to może tworzyć nowy korzeń) Ø Przepełnienie może teraz nastąpić w węźle u u 15 24 u 15 24 32 12 18 27 30 32 35 v 12 18 27 30 v' 35 v" v 1 v 2 v 3 v 4 v 5 v 1 v 2 v 3 v 4 v 5 28
Analiza wstawiania Algorytm insertitem(k, o) 1. Odszukujemy klucz k w celu zlokalizowania węzła do wstawienia wartości v 2. Dodajemy nowy element (k, o) w węźle v 3. while overflow(v) if isroot(v) twórz nowy pusty korzeń nad v v split(v) Ø Niech T będzie drzewem 2-3-4 o n elementach T ma wysokość O(log n) krok 1 zajmuje czas O(log n), ponieważ odwiedzamy O(log n) węzłów krok 2 zajmuje czas O(1) krok 3 zabiera O(log n) czasu, ponieważ każde rozdzielanie zabiera O(1) i możemy mieć O(log n) takich operacji Ø Stąd wstawianie do drzewa 2-3-4 zajmuje czas O(log n) 29
Usuwanie Ø Rozważania na temat usuwania można sprowadzić tylko do przypadku usuwania wartości z węzła nie posiadającego potomków Ø W przeciwnym razie zastępujemy element kolejnym w porządku inorder Ø Przykład: usuwanie 24 zastępujemy 24 prze następnik w porządku inorder - 27 10 15 24 2 8 12 18 27 32 35 10 15 27 2 8 12 18 32 35 30
Niedobór i łączenie Ø Usunięcie elementu z węzła v może spowodować niedobór - v może stać się 1-węzłem (0 klucz, 1 potomek) Ø Dla obsługi tej sytuacji należy połączyć v z rodzicem u, rozpatrzmy dwa przypadki Ø przypadek 1: sąsiedni brat v jest 2-węzłem operacja łączenia: łączymy v z bratem w i przenosimy element z u do połączonego węzła v' po połączeniu, niedobór może nastąpić w węźle powyżej (u) u 9 14 u 9 2 5 7 10 w v 2 5 7 10 14 v' 31
Niedobór i łączenie Ø przypadek 2: sąsiedni brat w węzła v jest 3-węzłem lub 4-węzłem przenosimy: 1. potomka w do v 2. element z u do v 3. element z w do u po przeniesieniu nie występują przepełnienia u 4 9 u 4 8 2 6 8 w v w 2 6 9 v 32
Analiza usuwania Ø Niech T będzie drzewem 2-3-4 o n elementach wysokość T wynosi O(log n) Ø Operacja usuwania: odwiedzamy O(log n) węzłów aby odszukać węzeł, z którego usuwamy element obsługa niedoborów może prowadzić do wykonania serii O(log n) łączeń węzłów (przyp. 1) oraz jednego przesuwania (przyp. 2) każde łączenie zajmuje O(1) Ø Stąd operacja usuwania w drzewie 2-3-4 zajmuje czas O(log n) 33