Előadást letölteni
Az előadás letöltése folymat van. Kérjük, várjon
KiadtaAndor Gáspár 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
Treap A csúcspontban: érték, bal, jobb pointer, prioritás. A prioritás random a csúcs létrehozásakor a szabályos beviteli sorrendből eredő degeneráció elkerülésére. A treap egy bináris kereső fa azzal, hogy a csúcs prioritására teljesül a heap sorrend: bármely csúcs prioritása legfeljebb olyan nagy mint a szülőjének a prioritása. Beszúrás: a tételt levélként hozzátesszük, addig forgatjuk felfelé míg a heap feltétel nem teljesül. A forgatások várható értéke kisebb mint 2! Törlés: megkeres, prioritása legyen végtelen, lefelé forgatjuk, a kis prioritású gyerekek felé, ha levél lesz eltávolítjuk. 2
3
Treap {a nilnode inicializálása, végpont} Procedure Inicializal(var T:treap) Begin If Nilnode = nil then Begin New(Nilnode); Nilnode^.Left = Nilnode; Nilnode^.Right = Nilnode; Nilnode^.Prior = infinity; {max longint} End; T := Nilnode; End; Procedure Insert(Tetel: elemtipus; var T: treap) Begin If T = Nilnode then Begin New(T); T^.elem = tetel; T^.Prior = random; T^.Left := Nilnode; T^.Right = Nilnode; End 3
4
Treap Else If Tetel < T^.elem then Begin Insert(Tetel, T^.Left) If T^.Left^.Prior < T^.Prior then Forgatbalgyerekkel(T) End Else If Tetel > T^.elem then Begin Insert(Tetel, T^.Right) If T^.Right^.Prior < T^.Prior then Forgatjobbgyerekkel(T); End; {különben duplikátum, semmit sem csinál} End; 4
5
Treap Példa: értékek: {1, 2, 3, 4, 5, 6, 7}bináris keresőfa szerint generált sorszám: {6, 3, 1, 4, 2, 5, 7}heap szerint 5 1616 2323 2323 1616 2323 3131 1616 2323 1616 3131 2323 1616 3131 4 2323 1616 3131 4 5252 2323 1616 3131 5252 4 2323 1616 3131 5252 4 6565 7
6
Treap Procedure Torol(Tetel: elemtipus; var T : treap); Begin If T <> Nilnode then Begin If Tetel < T^.elem then Torol(Tetel, T^.Left) Else If Tetel > T^.elem then Torol(Tetel, T^.Right) Else {egyezés} Begin If T^.Left^.Prior < T^.Right^.Prior then Forgatbalgyerekkel(T) Else Forgatjobbgyerekkel(T); If T <> Nilnode then Torol(Tetel, T); {folytatás lefelé} Else 6
7
Treap Begin {levélen vagyunk} Dispose(T^.Left); T^.Left := Nilnode; End; 7
8
Red-Black tree Az AVL egy népszerű alternatívája, a műveletek wc: O(log N). Nem rekurzív beszúrás könnyebb, mint az AVL-ben. A RB fa bináris kereső fa az alábbi színezési tulajdonságokkal: 1.mindegyik csomópont vagy piros vagy fekete 2.a gyökér fekete 3.ha egy csúcs piros, akkor a gyerekeinek feketének kell lenniük 4.minden útvonalnak egy csúcsból egy nil pointerig ugyanannyi fekete csúcsot kell tartalmaznia. A RB fa magassága legfeljebb 2log(N+1), így a keresés garantáltan logaritmikus rendű. 8
9
Red-Black tree Példa: a beszúrás sorrendje: 10, 85, 15, 70, 20, 60, 30, 50, 65, 80, 90, 40, 5, 55 9 30 3 20 15 8 5 10 25 65 50 85 70 4055 60 8090 7999
10
Red-Black tree A legnehezebb, mint általában a beszúrás. Az új elemet levélként helyezzük el: - ha feketére kenjük, akkor a 4. feltétel sérül, mivel lesz egy fekete-csúcs útvonal, ami hosszabb - ezért pirosra kell kenni o ha a szülője fekete, akkor rendben van o ha a szülője piros, akkor a 3. feltétel sérül, mivel lesz egymás utáni piros csúcs ilyenkor ki kell igazítani a fát, hogy a 3. feltétel fennálljon, anélkül, hogy a 4. feltételt közben megsértenénk. Az alapműveletek: színváltás, faforgatás 10
11
Red-Black tree Alulról-felfelé beszúrás Pl. a 25 beszúrása sima ügy, mivel a szülője fekete. Több eset lehetséges (tükörképek is) ha a szülő piros: a szülő testvére fekete (a nil legyen fekete) pl. a 3 és 8 beszúrásánál, de pl. a 99-nél nem. Jelölés: az új levél X, szülője: P, nagyszülő G, S (sibling) a szülő testvére (ha van), ekkor csak X és P piros, G nem lehet piros, mert az már a beszúrás előtt sértette volna a 3-at, mint a splaynél X, P, G lehet zig-zig vagy zig-zag lánc (mindkét irányban). A forgatás után az alfa új gyökerét feketére kenjük, és így még ha az eredeti ükszülő piros lett volna, akkor sem lesz egymás után két piros. És G piros lesz. 11
12
Red-Black tree Zig: 12 B A X P G C S B A X G P C S Színváltás: P, G Az A, B, C-hez vezető utakon így nem változott a fekete csúcsok száma.
13
Red-Black tree Zig-Zag: 13 A G B1B1 P X C S B2B2 X A P G B1B1 B2B2 C S Színváltás: X, G Az A, B, C-hez vezető utakon így nem változott a fekete csúcsok száma.
14
Red-Black tree Mi történik, ha a szülő testvére, S piros, pl. 79-nél? 14 B A X P G C S B A X G C P S A C-ig 1 fekete volt, a forgatás után is 1-nek kellene lennie. Ha az ükszülő is piros, akkor felbugyborékoltatjuk a gyökérig, amíg nem lesz két egymás utáni piros vagy ha elértük a gyökeret azt feketére váltjuk.
15
Felülről-lefelé Red-Black tree A felbugyborékoltatás az útvonal tárolását igényli (stack vagy szülő pointer). A felülről-lefelé már bevált a splay-nél ez alkalmazható az RB-re is, ami garantálja, hogy az S ne legyen piros. Lefelé mentében, ha látunk egy X csúcsot 2 piros gyerekkel akkor az X-et bepírosítjuk, két gyerekét befeketítjük. Ez csak akkor okoz gondot, ha X P szülője piros. 15 C1C1 X C2C2 C2C2 C1C1 X
16
Felülről-lefelé Red-Black tree Színváltás, utána ha X szülője piros akkor forgatunk. - ha X szülőjének testvére fekete, akkor nincs gond - ha X szülőjének testvére piros, ez az eset nem lehet az eljárás miatt mert, ha Y két gyereke piros, akkor Y unokáinak feketének kell lennie, és Y gyerekét is feketére kell változtatni, így forgatáskor két szinten nem láthatunk pirosat, így ezután amikor X-et nézzük, ha X szülője piros, akkor az X szülőjének testvére nem lehet piros. 16
17
Felülről-lefelé Red-Black tree Pl. insert 45: lefelé mentében látjuk az 50-t két piros gyerekkel, az 50-et pirosra váltjuk, két gyerekét 40-t és 55-öt feketére, most az 50 és a 60 is piros, egyszerű forgatás 60 és 70 között, így a 30 jobboldali gyökere 60 fekete lesz, a 70 piros lesz, az 50 piros. És így tovább megyünk lefelé, ha elérünk a levélhez a 45-öt piros csúcsként beszúrjuk, mivel a szülője fekete: kész. 17 30 20 4 10 55 40 60 45 50 70 85 65 80 90
18
Felülről-lefelé Red-Black tree Az RB fa nagyon gyakran jól kiegyensúlyozott. Tapasztalatok szerint az RB átlagos mélysége az AVL-ével megegyezik. Előny a viszonylag kis munkaigényű beszúrás és a forgatások viszonylagos ritkasága. A törlést szintén felülről-lefelé hajtjuk végre, hogy egy levelet tudjunk törölni. Kétgyerekes csúcsot úgy törlünk, hogy kicseréljük a jobb alfában lévő legkisebb elemmel, aminek legfeljebb egy gyereke van és töröljük. A csak jobb gyerekes csúcsot ugyanígy töröljük. A csak bal gyerekes csúcsot helyettesítjük a bal alfa legnagyobb elemével és utána töröljük..... 18
Hasonló előadás
© 2024 SlidePlayer.hu Inc.
All rights reserved.