Temat: Stuktuy dzewiste 1. Stuktua słownika { } I Stuktua danych = system elacyjny U, i i U uniwesum systemu { i } i I - zbió elacji (opeacji) na stuktuze danych Fomalna definicja stuktuy danych składa się z : sygnatuy systemu elacyjnego, sygnatu wszystkich opeacji stuktuy specyfikacji (opisu) opeacji stuktuy Def. Stuktuą słownika nazywamy system: E D, seach, inset, gdzie: E- niepusty zbió możliwych danych D- niepusty zbió zwany zbioem słowników seach: E D inset : E D : E D D oolean D (oolean typ logiczny o watościach tue i false) Specyfikacja opeacji słownikowych 1. Opeacja seach(e, d) zwaca watość tue, gdy element e znajduje się w słowniku d, a false w pzypadku pzeciwnym.. Opeacja inset(e,d) wstawia element e do słownika d, o ile seach(e, d) = false. 3. Opeacja (e,d) usuwa element e ze słownika d, o ile seach(e, d) = tue.
. Implementacje słownika w stuktuach liniowych a) Implementacja tablicowa tablica nieupoządkowana n - ozmia słownika: opeacja elementana - poównania Koszt pesymistyczny: seach Tmax ( n) ( n) = T ( n) = Θ( n) inset = Tmax max Koszt edni: T seach ( n) = T inset ( n) = T ( n) = Θ( n) b) Implementacja tablicowa tablica upoządkowana n - ozmia słownika: opeacja elementana - poównania Koszt pesymistyczny: T Koszt edni: T seach max seach inset ( n) = Tmax max ( n) = T ( n) = Θ( logn) ( n) = T ( n) = ( logn) inset ( n) = T Θ Ale!!! Tzeba pzyjąć, że opeacją elementaną pzy ealizacji opeacji inset oaz są pzestawienia elementów tablicy. Wówczas: seach Tmax ( n) Θ, inset ( logn) T ( n) = T ( n) = Θ( n) = max max T seach ( n) inset ( logn) T ( n) = T ( n) = Θ( n) = Θ,
- kozeń dzewa węzeł, któy nie ma popzednika (ojca) s- lewy potomek (syn) węzła v pawy potomek (syn) węzła t-liść-węzeł, któy nie ma ani lewego ani pawego potomka (syna) s- kozeń lewego poddzewa węzła v kozeń pawego poddzewa węzła głębokość węzła nume poziomu, na któym leży węzeł w dzewie. oziom kozenia ma nume 0. Węzły s i v leżą na poziomie nume 1. c) Implementacja listowa opeacja elemntana: poównania Koszt pesymistyczny: seach Tmax ( n) ( n) = T ( n) = Θ( n) inset = Tmax max Koszt edni: T seach ( n) = T inset ( n) = T ( n) = Θ( n) 3. Dzewo ST ( z ang. inay Seach Tee) Def. Dzewo ST to dzewo binane z elacją poządku symetycznego Def. Dzewo binane to gaf skieowany, bez cykli, z wyóżnionym węzłem zwanym kozeniem dzewa. Każdy z węzłów dzewa ma stopień ówny co najwyżej dwa. Do każdego z węzłów opócz kozenia dochodzi dokładnie jedna kawędź. Nazewnictwo: s v t
-s-t pzykład ścieżki w dzewie długość ścieżki nume poziomu liścia w ścieżce wysokość dzewa nume poziomu liścia w najdłuższej ścieżce. Wysokość dzewa na ysunku wynosi. Def. Poządek symetyczny polega na tym, że dla każdego węzła dzewa x dzewa jest spełniony następujący waunek: Jeżeli y leży w lewym poddzewie x, to key(y) key(x). Jeżeli y leży w pawym poddzewie x, to key(x) key(y). Relacja jest elacją poządku liniowego, a key(x) jest watością pola (klucza) danych, na któym elacja jest okeślona. ędziemy zakładali w dalszych ozważaniach, że dane umieszczane w dzewie to liczby całkowite. Pzykład Węzeł dzewa ST to ades na stuktuę (ekod) z polami: dane pole do pzechowywania danych, left, ight adesy węzłów potomnych dane left ight 10 kozeń dzewa 6
4. Algoytmy opeacji słownikowych na dzewie ST a) Opeacja seach seach(e, ); e liczba szukana, kozeń dzewa seach(e,)=1, gdy e jest w słowniku, seach(e,)=0, gdy e nie należy do słownika cuent=; while (cuent!=null) 9 if (cuent->dane==e) etun 1; else if (cuent->dane>e) cuent=cuent->left else cuent=cuent->ight if (cuent==null) etun 0; cuent 3 6 cuent=null seach(3, )=1 seach(10, )=0 W implementacji opeacji inset i niezwykle pzydatna okazuje się zmodyfikowana funkcja seach (seach1), któa zwaca ades węzła, w któym znajduje się poszukiwany element e oaz dodatkowo ades p ojca węzła z daną e. W szczególności, gdy wynikiem funkcji jest kozeń dzewa, to p jest adesem pustym. Gdy danych e nie ma w słowniku, to zwacany jest ades pusty, a p ustawia się na adesie potencjalnego ojca węzła z daną e. seach1(e,, p); 10 p 10 6 cuent cuent=seach1(,, p) p 6 seach1(1,, p)=null
cuent cuent=seach1(,, p) 10 p=null 6 b) Opeacja inset inset(e, ); Pzypadki: dzewo jest puste, inset(, ) dana e już jest w słowniku wówczas dzewo się nie zmienia dana e jeszcze nie znajduje się w słowniku wówczas nowy węzeł z daną e jest podwiązywany do dzewa jako liść i odpowiedni (lewy albo pawy) potomek węzła p zwóconego w funkcji seach1. 9 inset(11,) 10 p 6 11
c)opeacja (e, ); Pzypadki: Element e nie należy do słownika. Wywołanie funkcji seach1(e,, p) zwaca wówczas ades pusty. Słownik w tym pzypadku nie zmienia się po wykonaniu opeacji. Element e znajduje się w kozeniu dzewa i kozeń dzewa jest jedynym węzłem dzewa. Wywołanie funkcji seach1(e,, p) zwaca wówczas ades i adesy left i ight w kozeniu są puste. Słownik w tym pzypadku staje się pusty do wykonaniu opeacji. Pzed (, ) Po (, ) = NULL
Element e znajduje się w węźle o adesie v i węzeł v ma puste lewe albo pawe podzewo. Wywołanie funkcji seach1(e,, p) zwaca wtedy ades niepusty v i albo ades left albo ight w węźle v jest pusty. Ustalmy, że ades ight w węźle v jest pusty. Wówczas nowym potomkiem węzła p będzie lewy potomek usuwanego węzła v. Może się zdazyć, że kozeń dzewa musi być uaktualniony w tym pzypadku. achodzi to wtedy, gdy v=. Pzed (, ) Po (, ) p v 9 9 6 6
Element e znajduje się w węźle o adesie v i węzeł v ma niepuste lewe albo pawe podzewo. Wywołanie funkcji seach1(e,, p) zwaca wtedy ades niepusty v adesy left i ight w węźle v są niepuste. Ustalamy wówczas ades takiego węzła, któy zawiea największy element lewego podzewa węzła v albo najmniejszy element pawego poddzewa węzła v. Oznaczmy znaleziony węzeł pzez f. Dane z węzła f kopiujemy do węzła v, a sam węzeł f usuwamy wg algoytmu z popzedniego pzypadku, gdyż ma on na pewno puste co najmniej jedno z poddzew. Może się zdazyć, że kozeń dzewa musi być uaktualniony w tym pzypadku. achodzi to wtedy, gdy v=. Pzed (, ) Po (, ) 10 p 10 v 11 v 11 3 9 3 9 f 4 4
. Koszt opeacji słownikowych na dzewie ST Opeacja elementana: poównania między elementem wstawianym, wyszukiwanym lub usuwanym, a elementami słownika. Rozmia zadania: n ilość danych w słowniku pzed ealizacją opeacji słownikowej. Koszt opeacji słownikowych zasadniczo zależy od kosztu opeacji seach (seach1): Koszt seach: pesymistyczny T ( n) = n = Θ( n) max - pzypadek dzewa zdegeneowanego edni O(logn) okeślony na postawie wyników ekspeymentów, ale nie udowodniony. 6. Dzewa AVL Nazwa dzewo AVL pochodzi od nazwisk dwóch specjalistów teoii algoytmów i stuktu danych: Adelsona-Velskii i Landisa. Def. Dzewo AVL to wyważone dzewo ST. Dzewo jest wyważone, kiedy dla każdego wiezchołka, wysokości dwóch jego poddzew óżnią się co najwyżej o jeden. Dzewo wyważone Dzewo, któe nie jest wyważone
. Wysokość dzewa AVL Lemat Wysokość dzewa AVL o n wiezchołkach (n 1) jest nie większa niż log n. Dowód: Niech D h będzie dzewem AVL o wysokości h, któe ma najmniejszą, możliwą liczbę wiezchołków wód dzew AVL o wysokości h. Niech n h będzie liczbą wiezchołków w dzewie D h. Gdy: h = 0, to D 0 n 0 = 1 h = 1, to D 1 n 1 = h =, to D n = 4 h = 3, to D 3 n 3 = Ogólnie: D h-1 D h- n h = n h-1 + n h- +1
Udowodnimy pzez indukcję, że: ałożenie indukcyjne: n h = n h nh dla h >1 n h 1 h 1 h 1 h h 1 h h h 1 1 h 1 + nh + 1 + + 1 = + + 1 = + + 1 Czyli Stąd 1 log n h h log h nh. udowa węzła dzewa AVL Stuktua węzła dzewa AVL jest wzbogacona o wagę w taką, że: w(dzewo_puste)= -1, w(v)=h(l) - h(p), gdzie h(l) i h(p) to odpowiednio wysokość lewego i pawego poddzewa węzła v. v L P Pzykład watości wagi w dla węzłów dzewa o kozeniu -1 +1 +1 0 0 +1 0
9. Opeacje słownikowe na dzewie AVL seach(e, d) - opeacja ealizowana tak samo jak dla dzewa ST inset(e, d) - opeacja ealizowana w piewszej fazie tak samo jak dla dzewa ST. Duga faza to ewentualne wyważenie powstałego dzewa. (e, d) - opeacja ealizowana w piewszej fazie tak samo jak dla dzewa ST. Duga faza to ewentualne wyważenie powstałego dzewa. Podczas ealizacji piewszej fazy opeacji inset i należy na stosie odłożyć adesy węzłów ze ścieżki, któą odwiedza wywołanie funkcji seach1. Stos jest niezbędny do zealizowania dugiej fazy algoytmu, tj. spawdzenia waunku wyważenia na podstawie wag węzłów ze stosu. atem funkcja seach1 zwacać powinna, w pzypadku dzew AVL, ades wiezchołka takiego stosu, zamiast adesu p. 10. Rotacje powadzące do wyważenia dzewa po usunięciu albo wstawieniu elementu Rotacje w pawo +; +1 + 0 A +1 A * 0 * pojedyncza otacja w pawo względem
+; -1 C + 0-1 A U A C 0 U * * podwójna otacja w pawo: otacja pojedyncza w lewo względem A i pojedyncza w pawo względem C Rotacje w lewo -; -1 - A 0 A -1 0 * pojedyncza otacja w lewo względem
-; +1 C - 0 U A +1 0 C +1 A U * otacja podwójna w lewo: pojedyncza w pawo względem A i pojedyncza w lewo względem C * Uwaga Rotacje w pocesie wyważania wykonywane są tylko na jednej ścieżce w dzewie. Opeacja ealizowana na dzewie AVL wymaga wykonania co najwyżej log n otacji. Opeacja inset ealizowana na dzewie AVL wymaga wykonania co najwyżej jednej otacji. Może się zdazyć, że po zealizowaniu piewszej fazy opeacji zajdzie konieczność wykonania otacji o układzie wag +;0 albo ;0. Wykonujemy wówczas odpowiednio pojedyncza otacje w lewo albo pawo względem węzła z wagą odpowiednio + albo -. Wniosek Ponieważ dzewo AVL ma pesymistyczną wysokość O(logn), a ewentulane otacje wykonywane podczas wstawiania albo usuwania elementów ealizowane są kosztem O(logn), to opeacje słownikowe zealizowane na dzewie AVL mają koszt pesymistyczny O(logn).