Drzewa AVL i 2-3-4
Transkrypt
Drzewa AVL i 2-3-4
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 Sh-2 h-2 Sh Sh = Sh–1 + Sh–2 3 Przykład drzewa AVL 4 44 2 3 17 78 1 2 32 1 88 50 1 48 62 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) > 2in(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 c=z a=y 32 50 48 88 62 32 50 48 w przed 88 62 b=x 54 Po wstawieniu 54 6 Rotacje Rotacja w prawo y x Rotacja w lewo x α δ β α≤x≤β i x≤y≤δ y α β δ α≤x≤y i β≤y≤δ 7 Left-Rotate Inicjuj y Left-Rotate(T,x) y ß right[x] right[x] ß left[y] Zamień lewe poddrzewo y na prawe poddrzewo x parent[left[y]] ß x parent[y] ß parent[x] Przyłącz ojca x jako ojca y if parent[x] = null then root[T] ß y else if x = left[parent[x]] then left[parent[x]] ß y else right[parent[x]] ß y left[y] ß x Przyłącz x jako lewego syna y parent[x] ß y 8 Przykład: Left-Rotate (1) 7 4 3 x 11 6 9 19 14 2 12 y 18 22 17 20 9 Przykład: Left-Rotate (2) 7 4 3 2 x 11 6 9 α y 18 19 14 12 22 17 β 20 δ 10 Przykład: Left-Rotate (3) 7 4 3 2 18 11 6 19 14 9 α x y 12 22 17 β 20 δ 11 Przykład: Left-Rotate (4) 7 4 3 2 18 11 6 x y 19 14 9 12 22 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 (pozostałe dwa przypadki są symetryczne) a=z a=z przypadek 2: podwójna rotacja (prawa c, a potem lewa a) c=y b=y T0 T0 b=x c=x T1 T3 b=y T2 T3 przypadek 1: pojedyncza rotacja (lewa rotacja a) T0 T1 a=z b=x T2 c=x T1 T2 a=z T3 T0 c=y T1 T2 T3 14 Przykład wstawiania 44 2 5 z 17 3 1 1 32 niezbalansowane... 1 50 48 2 1 7 78 2y 1 64 3 4 62 88 x 5 T3 54 T2 T0 T1 44 4 3 2 17 1 32 1 1 2 y 2 48 ...zbalansowane T0 50 4 x z6 62 3 1 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. 5 78 54 T1 2 7 1 88 T2 T3 15 Przebudowa drzewa (pojedyncza rotacja) 1 rotacja a=z b=y b=y a=z Nie moż na wyś wietl ić obra zu. Na kom pute rze moż e brak ować T0 T1 c=x T3 T0 T2 T0 a=x T3 T2 c=x T3 T2 b=y b=y Nie mo żna wyś wiet lić obr azu . Na ko mp uter T1 1 rotacja c=z a=x Nie moż na wyś wietl ić obra zu. Na kom pute rze moż e brak ować T3 c=z Nie mo żna wyś wiet lić obr azu. Na ko mp uter T2 T1 T0 T1 16 Przebudowa drzewa (podwójna rotacja) 2 rotacje a=z b=x c=y Nie możn a wyświ etlić obraz u. Na komp uterz e może brako wać pamię ci do otwar T0 a=z b=x T3 T2 T0 c=y Nie możn a wyświ etlić obraz u. Na komp uterz e może brako wać pamię ci do otwar T2 T1 T3 T1 2 rotacje c=z b=x a=y a=y b=x T3 Nie mo żna wyś wiet lić obr azu. Na ko mp uter T2 T0 T3 T2 Nie mo żna wyś wiet lić obr azu. Na ko mp uter T1 c=z T0 T1 17 Usuwanie z drzewa AVL Ø Usuwamy, jak z drzewa BST – może spowodować to zaburzenie zbalansowania drzewa. Ø Przykład: 44 44 17 62 32 50 48 17 62 78 54 Przed usunięciem 32 50 88 48 78 54 88 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 w 62 44 17 50 48 c=x 78 54 44 b=y 62 88 17 78 50 48 88 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 (ki, oi), gdzie d jest ilością potomków węzła – Dla każdego węzła o potomkach v1 v2 … vd przechowującego klucze k1 k2 … kd-1 • Klucze w poddrzewie v1 są mniejsze od k1 • Klucze w poddrzewie vi są pomiędzy ki-1 i ki (i = 2, …, d - 1) • Klucze w poddrzewie vd są większe od kd-1 – Liście nie przechowują kluczy 11 2 6 8 24 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 (ki, oi) w węźle v pomiędzy rekursywnymi odwiedzinami poddrzew v o korzeniu w vi i vi + 1 Ø Odwiedzane węzły w tak zdefiniowanym porządku InOrder są uporządkowane rosnąco 11 24 8 2 6 8 2 1 4 3 15 6 5 12 27 14 10 7 9 32 18 30 11 13 19 16 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 v1 v2 … vd o kluczach k1 k2 … kd-1: – k = ki (i = 1, …, d - 1):poszukiwanie zakończone sukcesem – k < k1: poszukiwanie kontynuujemy w poddrzewie v1 – ki-1 < k < ki (i = 2, …, d - 1): poszukiwanie kontynuujemy w poddrzewie vi – k > kd-1: poszukiwania kontynuujemy w poddrzewie vd Ø Dotarcie do liścia kończy poszukiwania (porażka) Ø Przykład : odszukujemy klucza 30 11 2 6 8 24 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 2i elementów na poziomie i = 0, … , h - 1 i nie ma elementów ma poziomie h, więc n ≥ 1 + 2 + 4 + … + 2h-1 = 2h - 1 – stąd, h ≤ log (n + 1) Ø Wyszukiwanie w drzewie 2-3-4 o n elementach zajmuje czas O(log n) poziom elementy 0 1 1 2 h-1 2h-1 h 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 10 15 24 2 8 12 18 v 27 32 35 v 27 30 32 35 27 Przepełnienie i rozdzielanie węzła Ø Problem przepełnienia można rozwiązać przez podział węzła v: – niech v1 … v5 będą potomkami v i k1 … k4 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 k1 k2 i potomkach v1 v2 v3 • v" jest 2-węzłem o kluczach k4 i potomkach v4 v5 – klucz k3 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 u 15 24 32 15 24 v 12 18 27 30 32 35 v1 v2 v3 v4 v5 v' 12 18 27 30 v1 v2 v3 v4 v" 35 v5 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 2 5 7 u 9 14 10 w v 2 5 7 9 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 u 4 9 2 6 8 4 8 w v 2 6 w 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