220 likes | 327 Views
Miskolci Egyetem Informatikai Intézet Általános Informatikai Tanszé k Pance Miklós Adatstruktúrák, algoritmusok előadásvázlat Miskolc, 2004 Technikai közreműködő: Imre Mihály, műszaki informatikus hallgató. 3. 4. 2. 8. 5. 5. 1. 7. 2. 8. 7. 1. 3. 4. AVL fák.
E N D
Miskolci Egyetem Informatikai Intézet Általános Informatikai Tanszék Pance Miklós Adatstruktúrák, algoritmusok előadásvázlat Miskolc, 2004 Technikai közreműködő: Imre Mihály, műszaki informatikus hallgató
3 4 2 8 5 5 1 7 2 8 7 1 3 4 AVL fák AVL fák (Adelson - Velskii - Landis) Az AVL fa olyan bináris kereső fa, amelyben a fa minden csúcsára érvényes, hogy a bal és jobb alfa magassága legfeljebb 1-gyel térhet el. AVL nem AVL 2
AVL fák A magasságot minden csúcsra a csúcs rekordjában tárolhatjuk. Az AVL fa magassága legfeljebb 1.44 log ( N+2 ) - 0.328a gyakorlatban: log ( N+1 ) + 0.25Egy AVL fában a csúcspontok minimális száma a h magasság függvényében: S(h) = S(h-1) + S(h-2) + 1 h = 0 : S(h) = 1; h = 1 : S(h) = 2. Az S(h) szorosan kapcsolódik a Fibonacci számokhoz. Ebből következik a fenti képlet. Beszúráskor a magasság információkat a gyökérig vissza fel kell frissíteni. Az AVL tulajdonság megsérülhet. Pl. beszúrjuk a 6-ost, a 8-as csúcsban nem teljesül. Helyreállítás: forgatással az első olyan csúcsban, ahol megsérült az AVL feltétel. 3
AVL fák • 4 eset lehetséges, az (alfa) csúcs két gyerekének magassága kettővel tér el: • beszúrás az bal gyerekének bal részfájába, • beszúrás az jobb gyerekének jobb részfájába, • beszúrás az jobb gyerekének bal részfájába, • beszúrás az bal gyerekének jobb részfájába. • Az 1., 2. és 3., 4.esetek tükörképek. 4
AVL fák Helyreállítás: A beszúrás „kívül” (bal-bal, jobb-jobb) történt, akkor egyetlen forgatással… A beszúrás „belül” (bal-jobb, jobb-bal) történt, akkor kettős forgatással… Ezek a kiegyensúlyozott fa algoritmusok alap műveletei. 5
k2 k2 k1 k1 z x y y z x AVL fák Egyetlen forgatás, 1. eset: Ez az egyetlen lehetséges eset, mivel az Y nem lehet az X-szel azonos szinten, mert akkor már a beszúrás előtt sem teljesült volna az AVL feltétel k2-re. És Y nem lehet a Z-vel azonos szinten, mert akkor a k1-ben nem teljesülne először az egyensúly. 6
7 8 5 8 2 4 1 3 6 6 5 7 2 4 1 3 6 AVL fák Pl. 7
x z y z k1 k2 k2 k1 x y AVL fák 2. eset: 8
7 5 3 2 2 3 1 3 2 1 4 5 2 4 1 3 1 1 1 1 3 2 6 4 5 4 4 1 3 4 5 2 2 2 a 4 bal gyereke (3) a 4 bal gyerekének (2) jobb gyereke lesz (3) 7 5 6 6 3 6 5 3 Pl.: 3, 2, 1, 4, 5, 6, 7 9
k2 k2 k1 k1 z y x x z y AVL fák A 3., 4. esetben a szimpla forgatás nem segít: 10
D k1 k1 k2 k2 k3 k2 k3 k1 k3 B A C D C A A D C B B AVL fák Dupla forgatás (3): Először forgatás k3 gyereke és unokája között, és utána k3 és új gyereke között. 11
D k2 k1 k1 k3 k3 k2 C A A C B B D AVL fák Dupla forgatás (4): 12
5 2 4 1 6 5 3 6 1 3 2 4 7 15 16 7 15 16 AVL fák Példa folytatása:16, 15, 14, 13, 12, 11, 10, 8, 9 ->16, 15 13
4 14 4 7 2 6 2 3 15 1 6 3 5 15 1 5 14 16 16 7 14 6 5 7 15 14 16 AVL fák 14
13 4 7 7 2 3 15 1 6 4 15 5 14 2 6 14 16 16 1 3 5 13 13 AVL fák 15
7 4 15 2 6 13 16 1 14 3 5 12 12 7 4 15 2 6 14 16 1 3 5 13 12 AVL fák 16
11 7 16 8 4 15 11 6 2 14 3 10 5 9 1 13 7 12 9 4 13 10 2 6 11 15 8 1 12 14 16 3 5 10 9 8 AVL fák 10, 8 17
AVL fák type Avlmut= ^Avlcsucs; avlcsucs= record elem : elemtip; bal: Avlmut; jobb: Avlmut; mag: integer; End; Kerfa = Avlmut; Function Magas(P : Avlmut) : integer Begin If P = nil then Magas := -1 else Magas := P^.mag End; 18
AVL fák Procedure Insert (x: elemtip; var T : Kerfa); Begin If T = nil then Begin new(T); If T = nil then nincs memoria Else Begin T^.elem := x; T^.bal := nil; T^.jobb := nil; T^.mag := 0; End; End; Else 19
AVL fák Begin If x < T^.elem then Begin Insert (x, T^.bal); If Magas(T^.bal) – Magas(T^.jobb) = 2 then If x < T^.bal^.elem then Sforgatjobbra(T) Else Dforgatjobbra(T) Else T^.mag:= 1 + Max(Magas(T^.bal),Magas(T^.jobb)); End Else If x > T^.elem then Begin {szimmetrikus eset a jobb alfára} End Else {már benne van} End; End; 20
z x x y z k2 k2 k1 k1 y AVL fák {k2 –nek van bal gyereke, forgat a k2 és bal gyereke között, a magasságot aktualizálja, az új gyökér is k2 lesz} Procedure Sforgatjobbra( var k2: kerfa) Var x : kerfa; Begin x:= k2^.bal; k2^.bal:= x^.jobb; x^.jobb:= k2; k2^.Mag:= 1 + Max(Magas(k2^.bal),Magas(k2^.jobb)); x^.Mag:= Max(Magas(x^.bal), k2^.Mag) + 1; k2:= x; end; 21
D k1 k3 k3 k2 k1 k2 C A A C B B D AVL fák {k3 –nak van bal gyereke és k3 bal gyerekének van jobb gyereke, a bal-jobb kettős forgatást csinálja meg, magasságot aktualizálja} Procedure Dforgatjobbra(var k3 : kerfa) Begin Sforgatbalra(k3^.bal); {k1 és k2 között forgat} Sforgatjobbra(k3); {k3 és k2 között forgat} End; 22