alg_avl_fak

26

Upload: csaba-torda

Post on 14-Dec-2014

16 views

Category:

Documents


0 download

DESCRIPTION

AVL fak

TRANSCRIPT

Page 1: Alg_AVL_fak
Page 2: Alg_AVL_fak

AVL fák

• Az elsı kiegyensúlyozott fa algoritmus• 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

Page 3: Alg_AVL_fak

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

Page 4: Alg_AVL_fak

• Mekkora a k - szint ő AVL-fa minimális csúcsszáma?

S1 = 1 S2 = 2 S3 = 4 S4 = 7

Page 5: Alg_AVL_fak

• Mekkora a k - szint ő AVL-fa minimális csúcsszáma?

S5=12

Page 6: Alg_AVL_fak

• Ö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észf a minimális csúcsszámú.

Page 7: Alg_AVL_fak

h-2

h-1

h

⇒ rekurzió:Sh = 1 + Sh-1 + Sh-2

Page 8: Alg_AVL_fak

AVL fák - magasság

Tétel:• 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)

Page 9: Alg_AVL_fak

AVL fák - magasság

A Fibonacci számokra igaz:

−−

+=

nn

nF2

51

2

51

5

1

=−

+

+≥−

−−

+

++

22

51

2

51

5

11

2

51

2

51

5

1333 hhh

=−+ 13hF

Page 10: Alg_AVL_fak

nhSh h

hhh

hh

22

2

2

log44,1log

251

log

1

log/2

512

2

51

5

2

2

51

22

51

5

522

2

51

8

5553531

5

1

≤⇒⋅

+

+≥−

++

+=

=−

++=−

++⋅++

n≥Sh h nem mehet az optimális fölé44%- kal többel

Page 11: Alg_AVL_fak

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épekEgy új attribútumot vezetünk be:

kiegyensúlyozási tényez ı-1 : bal részfa magasabb 1-gyel0 : egyforma magasak a részfák

+1: jobb részfa magasabb 1-gyel

1 2 3 4

Page 12: Alg_AVL_fak

AVL fák – újrakiegyensúlyozás beszúrásnál

A. A (++,+) szabály:

αβ

γ

x

y

h

hh+1

++

+

α < x< β < y< γ

Az új levél a γ részfába került. A beszúrás elıtt a fa magassága h+2 volt.

αβ

x

y

h

h h

0

+

γ

beszúrás

Page 13: Alg_AVL_fak

AVL fák – újrakiegyensúlyozás beszúrásnál

A. A (++,+) szabály:

αβ

γ

x

y

h

hh+1

++

+

α < x< β < y< γ

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

h hh+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.

Ennek a tükörképe a (--,-) szabály! (1. eset)

Page 14: Alg_AVL_fak

AVL fák – újrakiegyensúlyozás beszúrásnál

• Példa:

22

15

10

++

20

+

17

25

-

3 18

21

30

-

ezt szúrtuk be

Page 15: Alg_AVL_fak

AVL fák – újrakiegyensúlyozás beszúrásnál

• Példa:

22

15

10

20

17

25

3

18

21

30

Page 16: Alg_AVL_fak

AVL fák – újrakiegyensúlyozás beszúrásnál

B. A (++,-) szabály:

α

x

yh

h

+

0

α < x< β < z < γ < y < δ

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:

β γ

z

δ

A beszúrás után az egyik részfa magassága h lett, a másik maradt h-1.

α

x

yh

++

-

β γ

z

h-1h

δ

hh-1

h-1h

h-1

0

Page 17: Alg_AVL_fak

AVL fák – újrakiegyensúlyozás beszúrásnál

B. A (++,-) szabály:

α

x

yh

h

++

-

α < x< β < z < γ < y < δ

Dupla forgatás kell: elıször jobbra:

β γ

z

h-1h

δ

hh-1

α

x

γ

z

δ

+

++

0 v.+

hh v. h-1

h-1 v.h

Page 18: Alg_AVL_fak

AVL fák – újrakiegyensúlyozás beszúrásnál

α

x

γ

z

δ

α β

x

γ δ

y

z

azután balra:

Page 19: Alg_AVL_fak

AVL fák – újrakiegyensúlyozás beszúrásnál

• B. A (++,-) szabály:

α < x< β < z < γ < y < δtovábbra is igaz

Végül tehát:

α β

x

γ δ

y

z

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.

Ennek a tükörképe a (--,+) szabály!

Page 20: Alg_AVL_fak

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. Abeszúrás költsége ezzel együtt is O(log n ).

Bizonyítás: az el ızıekbıl következik

Page 21: Alg_AVL_fak

AVL fák – újrakiegyensúlyozás törlésnél

A. A (++,+) szabály:

αβ

γ

x

y

h

hh+1

++

+

α < x< β < y< γ

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

h hh+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 menniellenırizni, amíg a gyökérig nem jutunk.

Page 22: Alg_AVL_fak

AVL fák – újrakiegyensúlyozás törlésnél

B. A (++,-) szabály:

α

x

yh

h

++

-

α < x< β < z < γ < y < δ

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:

β γ

z

h h

β γ

z

h

δ

h

dupla forgatás

Page 23: Alg_AVL_fak

AVL fák – újrakiegyensúlyozás törlésnél

• B. A (++,-) szabály:

α < x< β < z < γ < y < δtovábbra is igaz

Végül tehát:

α β

x

γ δ

y

z

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 menniellenırizni, amíg a gyökérig nem jutunk.

Page 24: Alg_AVL_fak

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 A VL 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 a z útvonalon. Ha egy x csúcs címkéje ++ vagy –- lesz, a kkor az x gyöker ő (rész)fa (esetleg dupla) forgatásával helyreállítju k annak AVL tulajdonságát. Ha x nem a gyökér, akkor f eljebb 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 log 2 n (sima vagy dupla) forgatás helyreállítja az AVL-tulajdonságot.

Bizonyítás: az el ızıekbıl következik.

Page 25: Alg_AVL_fak

AVL fák - adatszerkezetek

• AVL implementálása: egy flag jelzi a csúcs állapotát

• Nézzük meg az animációt!

typedef enum { LeftHeavy, Balanced, RightHeavy }BalanceFactor;

struct AVL_node {BalanceFactor bf;void *item;struct AVL_node *left, *right;}

Page 26: Alg_AVL_fak

Ö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)