230 likes | 345 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ó. Splay fa. Splay : kiszélesedik, lesarkít, ferdére vág
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ó
Splay fa Splay: kiszélesedik, lesarkít, ferdére vág Garantálja – üres fából kiindulva – , hogy M egymás utáni fa művelet legfeljebb O(M log N) idejű. Általában, ha M művelet wc teljes ideje O(M F(N)) akkor az amortizált futási idő O(F(N)), ezért a splay fa műveleteinek amortizált ideje O(log N). Az alapelv: ha elértünk egy csúcsot, akkor azt egy sor AVL fa forgatással a gyökérbe nyomjuk. (Sok alkalmazásban, ha egyszer megkerestünk egy elemet, akkor valószínű, hogy a közeljövőben újból keressük, ez az eset gyakoribb, mint gondolnánk.) ! Nem kell a magasság információ ! 2
k2 k1 k2 k1 k5 k4 k3 k3 D F A B C E C A B D Splay fa Egy nem működő egyszerű ötlet: Minden csúcsot az elérési úton a szülőjével megforgatunk. k1-k2 3
k3 k4 k5 k1 k2 k2 k1 k4 k3 A A B E C F D B E C D Splay fa k1-k4 k1-k3 4
k2 k1 k5 k4 k3 A B F E C D Splay fa k1-k5 A k1 ugyan a gyökérbe került, de a k3 majdnem olyan mélyre került, mint a k1 volt... 5
Splay fa Splaying Továbbra is alulról-felfelé forgatunk. Legyen X egy csúcs az elérési útvonalon (nem gyökér). Ha X szülője a gyökér, akkor egyszerűen megforgatjuk őket, ez lesz az útvonalon az utolsó forgatás. Különben van szülője (P) és nagyszülője (G). 6
G X P P X G G C P D X B B D A C C B D A A Splay fa 1. eset : X jobb gyerek és P bal gyerek (vagy fordítva) dupla forgatás mint az AVL-nél Zig-Zag 7
P G P X G X P G X D A B D A C C D A B C B Splay fa 2. eset: X és P mindegyike bal (jobb) gyerek Zig-Zig 8
k4 k4 k1 k2 k5 k3 k3 k2 k1 k5 C D D A E B C F B F E A Splay fa Az előző példa így: k1-k2-k3 Zig-Zag (AVL dupla) 9
k5 k5 k4 k3 k3 k4 k1 k2 k1 k2 C E A A D C F B D B E F Splay fa k1-k4-k5 Zig-Zig A k1 helyzete kiváló, az egész laposodott, nagyobb példán jobban látszik. 10
2 1 7 6 5 4 5 3 7 6 3 4 1 7 6 1 4 3 2 5 2 7 1 6 2 5 4 3 Splay fa Implementáció nem rekurzív + szülő pointer. 11
Splay fa felülről-lefelé Az alap splay-fánál: az X elemet levélként beszúrtuk, utána egy sor forgatással (splay) az X a fa új gyökere lett. A keresés folyamán is végeztünk splay-t. Ha az elem nem található, akkor az elérési út utolsó csúcspontjára végeztük a splay-t. Ehhez a stratégiához a fát be kell járni a gyökértől lefelé, majd a splay-hez alulról-felfelé. Ezt vagy a szülő pointerekkel, vagy az elérési út stackre tételével tudjuk megvalósítani. Most a forgatásokat az elérési út mentén hajtjuk végre. Ez a gyakorlatban gyorsabb, O(1) plusz hely kell, és az amortizált időkorlát O(log N) marad. 12
Splay fa felülről-lefelé Az elérés bármely pontján az aktuális csúcs X, az alfájának gyökere, ez lesz a középső fa. Az L fa az X-nél kisebb, de az X alfájában nem szereplő csúcsokat tárolja. Az R hasonlóan a T fa X-nél nagyobb, de X alfájában nem lévő csúcsokat tárolja. Kezdetben X a T gyökere, L ésR üres. 13
Y A Y A X X L B R L B R Splay fa felülről-lefelé Zig: A középső fa új gyökere Y lesz. Az X és a B alfa az R legkisebb elemének bal gyereke lesz, így R-ben a legkisebb elem az X lesz. AzY-nak nem kell levélnek lennie a Zig-hez. Ha egy Y-nál kisebb elemet keresünk és az Y-nak nincs bal gyereke (jobb gyerekének kell lennie), akkor a Zig-et alkalmazzuk. 14
Z Z Y X X Y A A B L R C R L C B Splay fa felülről-lefelé Zig-Zig: 15
Z Z Y Y X X B B R L A A L R C C Splay fa felülről-lefelé Zig-Zag: Forgatás valójában nem történt. 16
Z Z Y X X Y B B R L A A L R C C Splay fa felülről-lefelé Egyszerűsített Zig-Zag: Így a Zig-Zag csak egy Zig lesz és Y a középső gyökér Z helyett. 17
X X A L L B R A R B Splay fa felülről-lefelé Az utolsó splaying után összerakjuk a fákat: 18
ü ü 20 25 15 13 16 12 5 30 24 18 Splay fa felülről-lefelé Példa: a 19-et keressük 19
ü 12 20 25 15 13 16 5 30 24 18 Splay fa felülről-lefelé Egyszerűsített Zig-Zag (12-25-20): 20
12 24 25 15 13 16 5 30 20 18 Splay fa felülről-lefelé Zig-Zig (25-20-15) 21
18 24 25 12 5 13 30 20 15 16 Splay fa felülről-lefelé Zig (15-18): 22
16 13 5 15 12 20 18 30 24 25 Splay fa felülről-lefelé Összerakás: 23