1 / 22

Miskolci Egyetem Informatikai Intézet Általános Informatikai Tanszé k Pance Miklós

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.

Download Presentation

Miskolci Egyetem Informatikai Intézet Általános Informatikai Tanszé k Pance Miklós

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  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. 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

  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.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

  4. 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

  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. 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. 7 8 5 8 2 4 1 3 6 6 5 7 2 4 1 3 6 AVL fák Pl. 7

  8. x z y z k1 k2 k2 k1 x y AVL fák 2. eset: 8

  9. 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

  10. 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

  11. 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

  12. D k2 k1 k1 k3 k3 k2 C A A C B B D AVL fák Dupla forgatás (4): 12

  13. 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

  14. 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

  15. 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

  16. 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

  17. 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

  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; 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; End; 20

  21. 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

  22. 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

More Related