AVL fák
AVL fák Az első kiegyensúlyozott fa algoritmus AVL fa AVL fa Kitalálói: Adelson-Velskii és Landis (1962) Tulajdonságok Bináris rendezőfa A bal és jobb részfák magassága legfeljebb 1-gyel különbözik A részfák AVL fák AVL fa AVL fa
Jelölje m(f) az f bináris fa magasságát (szintjeinek számát), ha x az f fa egy csúcsa; ekkor m(x) jelöli az x-gyökerű részfa magasságát. Definíció (AVL-tulajdonság): Egy bináris keresőfa AVL-fa, ha minden x csúcsára teljesül, hogy |m(bal[x]) - m(jobb[x]) | 1
Mekkora a k - szintű AVL-fa minimális csúcsszáma? S1 = 1 S2 = 2 S3 = 4 S4 = 7
Mekkora a k - szintű AVL-fa minimális csúcsszáma?
Összefüggés az AVL-fa pontszáma és magassága között: n adattal felépíthető fa minimális magassága? majdnem teljes bináris fa n adattal felépíthető fa maximális magassága? ugyanez a kérdés: az adott h szintszámú AVL-fák közül mennyi a minimális pontszám? A h szintszámú minimális csúcsszámú AVL-fa gyökerének egyik részfája h - 1, a másik h - 2 szintű; az eredeti fa minimalitása miatt pedig mindkét részfa minimális csúcsszámú.
h h-2 h-1 rekurzió: Sh = 1 + Sh-1 + Sh-2
AVL fák - magasság Tétel: Bizonyítás: Sh = Fh+3-1 Egy h magasságú AVL fának legalább Fh+3+1 csúcsa van Bizonyítás: Legyen Sh a legkisebb h magasságú AVL fa mérete Nyilván, S0 = 1 és S1 = 2 valamint Sh = Sh-1 + Sh-2 + 1 Indukcióval .. Sh = Fh+3-1 („3-mal eltolt Fibonacci”) (Fh+2-1+Fh+1-1 +1=Fh+3-1)
AVL fák - magasság A Fibonacci számokra igaz:
nSh h nem mehet az optimális fölé 44%- kal többel
AVL fák – újrakiegyensúlyozás beszúrásnál A beszúrás elrontja az AVL tulajdonságot 4 eset 1 és 4 tükörképek 2 és 3 tükörképek Egy új attribútumot vezetünk be: kiegyensúlyozási tényező -1 : bal részfa magasabb 1-gyel 0 : egyforma magasak a részfák +1: jobb részfa magasabb 1-gyel 1 2 3 4
AVL fák – újrakiegyensúlyozás beszúrásnál A. A (++,+) szabály: Az új levél a részfába került. A beszúrás előtt a fa magassága h+2 volt. + x ++ x y + h y h h h h h+1 beszúrás < x< < y<
AVL fák – újrakiegyensúlyozás beszúrásnál A. A (++,+) szabály: Az új levél a részfába került. A beszúrás előtt a fa magassága h+2 volt. Forgatás: ++ x y + y x h h+1 h h h h+1 A forgatás után ismét h+2 a magasság. Ezért feljebb, a befoglaló fában (ha van), változatlanul érvényes az AVL tulajdonság, nem kell feljebb menni ellenőrizni. < x< < y< Ennek a tükörképe a (--,-) szabály! (1. eset)
AVL fák – újrakiegyensúlyozás beszúrásnál Példa: ++ 15 + 10 20 - 18 3 25 - 22 30 17 21 ezt szúrtuk be
AVL fák – újrakiegyensúlyozás beszúrásnál Példa: 20 15 25 10 18 22 30 21 3 17
AVL fák – újrakiegyensúlyozás beszúrásnál B. A (++,-) szabály: Az új levél a z alatti vagy részfába került. A beszúrás előtt a z csúcs alatti fák egyformák: + x ++ x h y h - y z z h h h-1 h-1 h h-1 h-1 h < x< < z < < y < A beszúrás után az egyik részfa magassága h lett, a másik maradt h-1.
AVL fák – újrakiegyensúlyozás beszúrásnál B. A (++,-) szabály: Dupla forgatás kell: először jobbra: ++ x ++ x h - + z y z 0 v.+ y h-1 v. h h h h v. h-1 h h-1 h-1 h < x< < z < < y <
AVL fák – újrakiegyensúlyozás beszúrásnál azután balra: z x z x y y
AVL fák – újrakiegyensúlyozás beszúrásnál B. A (++,-) szabály: A beszúrás előtt az x gyökerű fa magassága h+2 volt. A forgatás után ismét h+2 a magasság. Ezért feljebb, a befoglaló fában (ha van), változatlanul érvényes az AVL tulajdonság, nem kell feljebb menni ellenőrizni. Végül tehát: z x y Ennek a tükörképe a (--,+) szabály! < x< < z < < y < továbbra is igaz
AVL fák – újrakiegyensúlyozás beszúrásnál Összefoglalva: A beszúrás után az új levéltől felfelé haladva a gyökér felé újra számoljuk a csúcsok címkéit ezen az útvonalon. Ha egy x csúcs címkéje ++ vagy –-lesz, akkor az x gyökerű (rész)fa (esetleg dupla) forgatásával helyreállítható az AVL tulajdonság. Műveletigény: O(1) Tétel. Legyen S egy n csúcsból álló AVL-fa. BESZÚR(s; S) után legfeljebb egy (esetleg dupla) forgatással helyreállítható az AVL-tulajdonság. A beszúrás költsége ezzel együtt is O(log n). Bizonyítás: az előzőekből következik
AVL fák – újrakiegyensúlyozás törlésnél A. A (++,+) szabály: A törlés az részfában történt. Ennek a magassága h+1 volt és h lett. Az x gyökerű fa magassága h+3-ról h+2-re csökkent. Forgatás: ++ x y + y x h h+1 h h h h+1 A forgatás után h+2 a magasság. Ezért feljebb, a befoglaló fában (ha van), nem biztos, hogy változatlanul érvényes az AVL tulajdonság, feljebb kell menni ellenőrizni, amíg a gyökérig nem jutunk. < x< < y<
AVL fák – újrakiegyensúlyozás törlésnél B. A (++,-) szabály: A törlés az részfában történt. Ennek a magassága h+1 volt és h lett. Az x gyökerű fa magassága h+3-ról h+2-re csökkent. A törlés előtt a z csúcs alatt fa: ++ x h - z y h h z h h h dupla forgatás < x< < z < < y <
AVL fák – újrakiegyensúlyozás törlésnél B. A (++,-) szabály: A forgatás után h+2 a magasság. Ezért feljebb, a befoglaló fában (ha van), nem biztos, hogy változatlanul érvényes az AVL tulajdonság, feljebb kell menni ellenőrizni, amíg a gyökérig nem jutunk. Végül tehát: z x y < x< < z < < y < továbbra is igaz
AVL fák – újrakiegyensúlyozás törlésnél Összefoglalva: Mivel az x gyökerű fa magassága csökkent a forgatással, ezért feljebb is, ha van befoglaló fa, elromolhatott az AVL tulajdonság. A törlés után a törölt elem szülőjétől kezdve felfelé haladva a gyökér felé újra számoljuk a csúcsok címkéit ezen az útvonalon. Ha egy x csúcs címkéje ++ vagy –- lesz, akkor az x gyökerű (rész)fa (esetleg dupla) forgatásával helyreállítjuk annak AVL tulajdonságát. Ha x nem a gyökér, akkor feljebb kell lépni és folytatni kell az ellenőrzést. Szélsőséges esetben az adott útvonal minden pontjában forgatni kell! Tétel: Az n pontú AVL-fából való törlés után legfeljebb 1,44 log2 n (sima vagy dupla) forgatás helyreállítja az AVL-tulajdonságot. Bizonyítás: az előzőekből következik.
Összefoglalás AVL fák Az első dinamikusan kiegyensúlyozott fák A magasság az optimális 44%-án belül Újrakiegyensúlyozás forgatásokkal O(log n)
További kiegyensúlyozott fák Az AVL-tulajdonság csak egy a lehetséges kiegyensúlyozottsági feltételek közül. Általánosítása: Definíció: HB[k]-fák: (C. C. Foster, 1973) Legyen k ≥ 1 egy egész szám. Egy bináris keresőfa HB[k]-fa, ha minden x csúcsára teljesül, hogy |m(bal(x)) −m(jobb(x))| ≤ k. ⇒HB[1]-fák→AVL-fák
Súlyra kiegyensúlyozott fák A részfák súlya legyen a csúcsszámuk: s(f). Definíció. Egy bináris keresőfát súlyra kiegyensúlyozott fának (röviden SK-fának) nevezünk, ha minden x belső csúcsára teljesül, hogy Tétel. Egy n csúcsú SK-fa mélysége ≤ 2 log2 n + 1. Bizonyítás: s(x) > s(y)+s(z) > s(y)+(√2−1)s(y) = √2s(y) x y z
Legyenek x1, x2, . . . , xk egy k-hosszúságú gyökértől levélig menő út csúcsai. n = s(x1) > √2s(x2) > (√2)2s(x3) > · · ·> (√2)k−1s(xk) = (√2)k−1 = 2(k−1)/2 OK