Előadást letölteni
Az előadás letöltése folymat van. Kérjük, várjon
KiadtaIrma Balogné Megváltozta több, mint 10 éve
1
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ó
2
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. 2 7 8 2 4 1 3 5 5 8 2 4 1 3 7 AVL nem AVL
3
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.328 a gyakorlatban: log ( N+1 ) + 0.25 Egy 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
4
AVL fák 4 eset lehetséges, az (alfa) csúcs két gyerekének magassága kettővel tér el: 1.beszúrás az bal gyerekének bal részfájába, 2.beszúrás az jobb gyerekének jobb részfájába, 3.beszúrás az jobb gyerekének bal részfájába, 4.beszúrás az bal gyerekének jobb részfájába. Az 1., 2. és 3., 4. esetek tükörképek. 4
5
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
6
AVL fák Egyetlen forgatás, 1. eset: 6 k2k2 k2k2 k1k1 k1k1 x x yy z z 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 k 2 -re. És Y nem lehet a Z-vel azonos szinten, mert akkor a k 1 -ben nem teljesülne először az egyensúly.
7
AVL fák Pl. 7 5 8 2 4 1 3 7 6 6 5 7 2 4 1 3 8 6
8
AVL fák 2. eset: 8 k1k1 k2k2 k2k2 z z y x k1k1 x y
9
Pl.: 3, 2, 1, 4, 5, 6, 7 9 3 2 1 2 3 1 2 3 1 4 5 2 4 1 3 5 2 4 1 3 5 6 4 5 2 6 1 3 4 5 2 6 7 1 3 2 3 1 6 7 5 4 a 4 bal gyereke (3) a 4 bal gyerekének (2) jobb gyereke lesz (3)
10
AVL fák A 3., 4. esetben a szimpla forgatás nem segít: 10 k2k2 k2k2 k1k1 k1k1 y y x x z z
11
AVL fák Dupla forgatás (3): 11 k1k1 A D k3k3 k2k2 B C k3k3 k2k2 k1k1 A B C D k2k2 k1k1 k3k3 BC A D Először forgatás k 3 gyereke és unokája között, és utána k 3 és új gyereke között.
12
AVL fák Dupla forgatás (4): 12 k2k2 A D k1k1 k3k3 B C k2k2 k3k3 k1k1 BC A D
13
AVL fák Példa folytatása: 16, 15, 14, 13, 12, 11, 10, 8, 9 13 4 2 3 1 6 7 5 16 15 ->16, 15 4 2 3 1 6 155 16 7
14
AVL fák 14 4 2 3 1 6 155 16 7 14 6 7 5 15 16 14 4 2 3 1 7 15 6 16 14 5
15
AVL fák 15 4 2 3 1 7 6 16 14 5 13 1313 1 53 26141416 415 7
16
AVL fák 16 12 1 1353 261416 415 7 12 141 1253 261316 415 7
17
AVL fák 17 11 121 105 14 3 16 261115 413 7 8 9 10 8 9 121 95 14 3 16 261115 413 7 810 10, 8
18
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
19
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; Else 19
20
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; 20
21
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 k2k2 k2k2 k1k1 k1k1 y x xy z z
22
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 k1k1 A D k3k3 k2k2 B C k2k2 k1k1 k3k3 B C A D
Hasonló előadás
© 2024 SlidePlayer.hu Inc.
All rights reserved.