Drzewa AVL — definicje
Transkrypt
Drzewa AVL — definicje
Drzewa AVL — definicje 1 Uporzadkowane drzewo binarne jest drzewem AVL , jeśli dla każdego , wezà , la różnica wysokości dwóch jego poddrzew wynosi co najwyżej 1. º· M PP ³³¹¸ PP ³³ PP ³ ³ PP º· ³ º· ³ P ³ P ³ S D ¹¸ Q Q Q º· Q Q ´¹¸ Q ´ Q º· ´ º· Q ´ C ¹¸ F K ¹¸ ¹¸ h h A A h Z H ¹¸ ¶ S ¶ S º· º· ¶ S h ¢ A A ¢ h h A A h ¹¸ typowe” drzewo AVL ” h ¢ A A ¢ h h C ¤ A CC ¤¤ A hh h A minimalne” drzewa AVL ” A h WÃlasności drzew AVL gwarantuja,, że nawet w najgorszym przypadku wysokość drzewa wyniesie 1.44 × log(N + 2). 1 Drzewa te wprowadzili w 1962 roku dwaj rosyjscy matematycy: G.M.Adelson-Welskij i E.M.Landis, i od ich nazwisk (w angielskojezycznej transkrypcji) pochodzi nazwa AVL. , Drzewa AVL 1 Drzewa AVL — tworzenie Procedura wstawiania elementu do drzewa AVL jest nastepuj aca: , , 1. użyj standardowej procedury wstawiania elementu do uporzadkowanego , drzewa binarnego, oraz, 2. jeżeli drzewo utraciÃlo wÃlasność AVL, to przywróć ja, poprzez wykonanie jednej z czterech rotacji omówionych poniżej. Implementacja tego schematu wykorzystuje rekurencyjna, procedure, dodawania elementu i dodatkowe trójwartościowe pole balans w każdym weźle drzewa. , TYPE DrzewoAVL = ^WezelAVL; WezelAVL = RECORD info: T_Element; lewe, prawe: DrzewoAVL; balans : -1..1; { 1 oznacza prawe poddrzewo wyzsze, -1 ozn.wyzsze jest lewe poddrzewo, END; 0 ozn.poddrzewa rownej wysokosci} Drzewa AVL 2 Drzewa AVL — pojedyncza prawa rotacja ¿ B ÁÀ ¡ A ¡ A ¿ ª ¡ A A AU ÁÀ ¢ A AAU ¢®¢ A D1 D2 D3 ¿ A ⇒ ÁÀ ¢ @ ¢ @ ¿ R @ ¢ ¢ ®¢ D1 B ÁÀ ¢ A ¢ AAU ¢® D2 D3 h-1 h zauważmy ciekawe wÃlasności rotacji: • jeśli caÃle drzewo byÃlo uporzadkowane przed dodaniem elementu, to jest , również uporzadkowane po wykonaniu rotacji , • jeśli przed dodaniem elementu poddrzewa D1,D2,D3 miaÃly wÃlasność AVL to caÃle drzewo ma te, wÃlasność po dodaniu elementu i wykonaniu rotacji Drzewa AVL 3 Drzewa AVL — podwójna prawa rotacja ciag , dalszy wÃlasności rotacji: • rotacja pozostawia drzewo o tej samej wysokości co przed dodaniem elementu, zatem caÃla operacja nie narusza wÃlasności AVL z punktu widzenia żadnego nadrzednego” elementu drzewa (inaczej mówiac, , , ” rotacja kasuje” naruszenie wÃlasności AVL, jeśli takie nastapià , lo) ” ¿ ¿ C B ÁÀ ©ÁÀ ¿ © ¼© A ÁÀ ¢ ¢ ¢ ¢ ®¢ D1 B B B B A B A ¿ AU BN B ÁÀ ¢ A ¢ AAU ¢® D4 D2 D3 ⇒ ¡ @ ¡ @ ¿ ¿ ª ¡ @ R A ÁÀ B £ B £ BBN £°£ D1 D2 C ÁÀ B £ B £ BBN £°£ D3 D4 h-1 h Drzewa AVL 4 Drzewa AVL — implementacja dodawania elementu dodawanie elementu do drzewa można zrealizować zwykÃlym rekurencyjnym algorytmem dodawania elementu do drzew uporzadkowanych, jeśli , uwzgledni sie, , , za pomoca, pola balans, możliwy wzrost wysokości drzewa i konieczność wykonania rotacji (patrz funkcja DodajAVL): poprzedni balans -1 -1 -1 0 0 0 1 1 1 Drzewa AVL przyrost lewego poddrzewa 0 1(sk)/-1(we) 0 0 1(sk)/-1(we) 0 0 1(sk)/-1(we) 0 przyrost prawego poddrzewa 0 0 1(sk)/-1(we) 0 0 1(sk)/-1(we) 0 0 1(sk)/-1(we) nowy balans przyrost drzewa b.z. -2 → 0 0 b.z. -1 1 b.z. 0 2→0 0 0 0 0 1 1 0 0 0 komentarz drzewo bez zmian prawa rotacja poprawiÃlo sie, drzewo bez zmian dopuszcz.wzrost dopuszcz.wzrost drzewo bez zmian poprawiÃlo sie, lewa rotacja 5 FUNCTION DodajAVL(VAR korzen : DrzewoAVL; element : DrzewoAVL; FUNCTION PorownajEl(e1, e2 : T_Element) : CHAR) : INTEGER; {zwraca 0 gdy wysokosc drzewa nie wzrosla; -1/1 gdy wzrosla przez lewe/prawe poddrzewo} VAR l_wzr, p_wzr : -1..1; BEGIN IF korzen=NIL THEN BEGIN korzen := Element; korzen^.balans := 0; DodajAVL := 1; {w tym przypadku wartosc 1 lub -1 nie ma znaczenia} END ELSE BEGIN l_wzr := 0; {wartosc wzrostu lewego lub prawego poddrzewa potrzebna dla ...} p_wzr := 0; {wybrania rotacji: pojedynczej lub podwojnej, i prawej lub lewej} CASE PorownajEl(element^.info, korzen^.info) OF ’<’ : l_wzr := DodajAVL(korzen^.lewe, element, PorownajEl); ’=’ : ; (* blad - element jest juz w/na drzewie *) ’>’ : p_wzr := DodajAVL(korzen^.prawe, element, PorownajEl); END; (**** teraz rozwaz mozliwe przypadki (patrz tabela): - wykonaj odpowiednia rotacje jesli to konieczne, - ustaw pole balans, i wylicz wlasciwa wartosc funkcji. *) END; END; {DodajAVL} Drzewa AVL 6 Drzewa AVL — usuwanie elementu Usuwanie elementu z drzewa AVL jest zrealizowane analogicznie: element jest usuwany procedura, rekurencyjna,, i po powrocie z wywoÃlań rekurencyjnych na kolejnych poziomach aktualizowane jest pole balans, a w razie potrzeby wykonywana jest odpowiednia rotacja. Jednak w przypadku usuwania wezà , lów rotacja nie pozostawia drzewa o tej samej wysokości, co przed usunieciem wezà , , la, a o 1 niższe. Dlatego jednorazowe wykonanie rotacji nie kasuje do końca zaburzenia, które propaguje sie, dalej i na wyższych poziomach moga, być konieczne kolejne rotacje. Skrajnym przykÃladem takiej sytuacji jest ekstremalne” drzewo AVL, które ” na każdym poziomie posiada maksymalne niezrównoważenie dopuszczalne przez wÃlasność AVL. Usuniecie w tym drzewie wezà drzewa , , la z niższej gaÃlezi , powoduje kaskade, rotacji na wszystkich poziomach. Drzewa AVL 7 Skrajny przykÃlad usuwania wezà , la z drzewa AVL: ¾» M XX »» XXX ½¼ ¾»»»»» XXX » 9» » z X P ³ PP ³ ½¼ ¾» PP ¾» ³³ ³ )³ q P E B ... H ©½¼ HH ¾» ¾» HH ¾» ¾» ©©½¼ ©© H © H ¼ © j H © ¼ j H A ½¼ C F J ½¼ ½¼ ½¼ R R ª R @¾» @¾» ¾» ¡ @¾» D G I K ½¼ ½¼ ½¼ ½¼ R @¾» L ½¼ Usuniecie elementu A” powoduje naruszenie równowagi w weźle B”. Aby , , ” ” to skorygować należy wykonać lewa, rotacje, wynoszac , a, element ”C” w góre, , a element B” w dóÃl, i zmniejszajac , a, w efekcie wysokość drzewa ”B-C-D”. ” To jednak powoduje naruszenie równowagi w weźle E” i konieczność , ” ponownej lewej rotacji wynoszacej do góry wezeà , , l ”H”. Wysokość tego poddrzewa maleje, i może z kolei spowodować naruszenie równowagi w weźle M”, powodujac , konieczność wykonania w tym punkcie rotacji, itd. , ” Drzewa AVL 8 B-drzewa — definicja i wÃlasności B-drzewem2 nazywamy sortowane drzewo rzedu 2D + 1 (niebinarne), w , którym każdy wezeà korzenia, zawiera od D do 2D , , l, z wyjatkiem elementów (kluczy), a wszystkie ścieżki od korzenia do wszystkich liści maja, te, sama, dÃlugość. PrzykÃladowe B-drzewo rzedu 3 (liczba D = 1): , »»u » »»» 15 q 1 u À q q 7 » »»» 9»» » q u J J J ^ q 20 q 23 30 u80 40 q q 35 u À q q u XX XXX ? q u J J J ^ q 45 q 46 XXX XXX q XX z q 90 u À q q 87 89 q u J J ^ J q 91 q q Jak wynika z definicji, w B-drzewie liście wystepuj a, tylko na najniższym , poziomie. Z konstrukcji drzewa rzedu > 2 wynika, że każdy wezeà , , l drzewa, który zawiera k kluczy, posiada dokÃladnie k + 1 poddrzew, przy czym w B-drzewie wszystkie te poddrzewa musza, być niepuste, z wyjatkiem liści. , 2 B-drzewa zostaÃly wprowadzone w roku 1972 przez dwóch matematyków: Niemca Rudolfa Bayera i Amerykanina Edwarda M. McCreighta. Nie wiadomo skad , wzieli , nazwe, B-drzewa. B-drzewa 9 Zauważmy również, że korzeń B-drzewa jest jedynym wezà , lem, który może zawierać nieograniczona, liczbe, od 1 do 2D elementów. Cześciowe zrównoważenie B-drzew powoduje, że ich wysokość w , najgorszym przypadku jest również logarytmem (rzedu D) liczby wezà , , lów. Nadaja, sie, one zatem do przechowywania dużych ilości danych, w szczególności w plikach dyskowych, zwÃlaszcza jeśli wartość D jest tak duża, że wielkość wezà dyskowej, , la zajmuje caÃla, jednostke, alokacji pamieci , lub jej wielokrotność. Dlatego typowy rzad , B-drzewa może wynosić nawet kilkaset, i wtedy nawet bardzo duże drzewo może mieć tylko 3-4 poziomy. B-drzewa — definicja typu danych CONST BDrzewoMax = 500; TYPE TypElementu = INTEGER; BDrzewo = ^WezelB; WezelB = RECORD naddrzewo:BDrzewo; elementy :ARRAY[1..BDrzewoMax] OF TypElementu; poddrzewa:ARRAY[0..BDrzewoMax] OF BDrzewo; liczba :INTEGER; END; B-drzewa 10 B-drzewa — dodawanie kluczy • proste dodawanie kluczy - zawsze do liścia 10 20 30 10 20 30 40 30 ¡ ¡ @ @ ¡ @ ¡ ª @ R 10 20 40 50 • przelewanie” kluczy miedzy sasiednimi liściami , , ” 30 ¡ ¡ ¡ ¡ ª 10 20 25 B-drzewa 40 @ @ ¡ ¡ @ @ R 40 42 44 50 ¡ ¡ ª 10 20 25 30 @ @ @ @ R 41 42 44 50 11 B-drzewa — dodawanie kluczy (2) • rozpoÃlawianie” wezà , la z propagacja, klucza w góre, ” 40 40 43 ¡ @ ¡ @ ¡ ¡ ª @ ¡ @ R 10 20 25 30 41 42 44 50 ¡ ¡ ¡ ª 41 42 ©© © ©© @ @ © ©© © ¼ @ R 10 20 25 30 34 40 41 42 44 50 10 15 »» » » 9 10 15 B-drzewa » »»» 25 30 ¡ ¡ @ HHH @ HH @ H HH @ R H j 34 40 41 42 44 50 XX XXX XXX @ XXX @ XXX @ X R X z @ ¡ ¡ ¡ ¡ ª 20 32 43 ¡ ¡ ª 25 30 44 50 20 32 43 56 X »» »» »» »»» @ R ? 10 20 25 30 @ ? @ ¡ ª 32 43 ¡ @ @ ¡ ¡ ? 34 40 41 42 44 50 58 60 12 B-drzewa — usuwanie kluczy • usuwanie kluczy z liści i zapadanie sie” , drzewa ” ³ ³³ ³ ³ ³³ ) ³ © ©© ©© ©© 30 38 PP P PP P ³³ PP P P q HH ©© © © HH HH H j ? 32 34 ³ ³³ ³ ) 10 20 25 ³³ 32 34 HH ? 44 46 ³ ³³ ¡ ¡ ¡ ¡ ª 30 38 42 P @ HH HH © © ¼ 40 41 ³ ³³ 50 56 © ©© ³ B-drzewa PP P ³ ³³ HH © © ¼ 10 20 25 42 52 54 HH j H 58 60 PP @ @ @ R PP P 40 41 PP P PP P q P 44 50 56 13 B-drzewa — usuwanie kluczy (2) • usuwanie kluczy z liści i Ãlaczenie sasiednich liści , , 30 38 42 P ³ ³³ ¡ ¡ ³ ³ ³ ) ³³ ³ ³³ ³³ 10 20 25 ¡ ³ ³ ) ³ ³³ ³ ³³ ³³ ) ³ PP P PP P @ @ R PP P q P 40 41 ³ ³³ B-drzewa @ ¡ 44 50 56 PP @ ¡ ¡ 30 34 ³ PP P q P 25 38 42 P ¡ ª ³ ³³ PP P 40 41 ³³ 10 20 PP P @ @ R ¡ ª ³ 10 20 @ 32 34 ³³ PP @ ³ ³³ 44 50 56 25 42 P PP P PP P ? 30 38 40 41 PP P PP P q 44 50 56 14 Operacje na poznanych typach drzew Drzewa: zrównoważone niezrównoważone drzewa AVL B-drzewa Wysokość drzewa w przypadku: najgorszym najlepszym średnim log2(N + 1) N 1.44 × log2(N ) log2(N + 1) log2(N + 1) log2(N + 1) log2(N + 1) 1.39 × log2(N ) log2(N ) + 0.25 logD+1( N2+1 ) + 1 log2D+1(N + 1) N log1.38D+1( D+1 )+1 ZÃlożoność obliczeniowa operacji: Drzewa: nieuporzadkowane , uporzadkowane , zrównoważone drzewa AVL B-drzewa wyszukiwania elementu dodawania elementu usuwania elementu przegladania , uporzadkowanego , O(N) O(N) O(log N) O(log N) O(log N) O(1) O(N) O(log N) O(log N) O(log N) O(1) O(N) O(log N) O(log N) O(log N) O(N log N) O(N) O(N) O(N) O(N) Drzewa zrównoważone — podsumowanie 15