Datastrukturer föreläsning 10 Maps 1
AVL-träd 1 2 5 2 0 4 1 8 3 2 1 11 1 7 Lecture 6 2
Insättning i AVL-träd Sätt först in det nya elementet på samma sätt som i ett vanligt BST! Det nya trädet kan bli obalanserat Balansera om trädet! Exempel: vi har satt in en ny nod med nyckel 7: 0 1 2 Lecture 6 3 5 1 8 1 ny nod obalans 6 4 3 2 0 7 0 lokal obalans 11 lokal obalans
Enkelrotation: princip nederst lokal obalans alltför djup nod Balansen återställd Lecture 6 4
Enkelrotation: exempel 5 obalans 3 5 11 8 11 3 8 10 10 alltför djup nod Balansen återställd Lecture 6 5
Dubbelrotation: princip nederst lokal obalans alltför djup nod Balansen återställd Lecture 6 6
Dubbelrotation: exempel 5 obalans 8 2 5 6 8 10 alltför djup nod 2 6 10 Balansen återställd Lecture 6 7
Trenodsomstrukturering Enkel och dubbelrotationer kallas med ett gemensamt namn trenodsomstruktueringar. Vi letar upp tre noder: den nedersta noden med lokal obalans samt dess barn och barnbarn så att barnet och barnbarnet tillhör delträd som har blivit alltför djupa. Dessa tre noder bestämmer fyra delträd. Vid enkelrotation gör man barnet till ny förälder med den gamla föräldern och barnbarnet som nya barn. Vid dubbelrotation gör man barnbarnet till ny förälder med gamla föräldern och barnet som nya barn. Lecture 6 8
Borttagning i AVL-träd Borttagning: som i binära sökträd Om obalans uppkommer omstrukturera med rotationer! Omstrukturering i delträd kan ge upphov till obalans högre upp vi kan behöva omstrukturera flera gånger Jfr: insättning räcker att omstrukturera en gång (kring nedersta obalanserade noden)! Lecture 6
Splayträd 6 2 1 4 8 Lecture 6 10
Splayträd Binärt sökträd Behöver ej vara balanserade som AVLträd Nycklar som man ofta letar efter skall ligga högt upp i trädet 0-10-regeln: 0% av sökningar är efter 10% av nycklarna Lecture 6 11
Splayträd Insättning, sökning och borttagning som i vanligt binärt sökträd, följt av en splay, dvs man omstrukturerar trädet så att den sist besökta nyckeln placeras i roten. Splayträden är inte balanserade som AVL-träd. Värstafallstiden är O(n). Den amorterade tidskomplexiteten per operation är trots detta O(log n). Lecture 6 12
Zig-zig Lecture 6 13
( dubbelrotation Zig-zag (jfr Lecture 6 14
Zig Lecture 6 15
Exempel: sätt in 11 5 5 3 3 8 12 8 12 10 10 11 Lecture 6 16
Exempel: sätt in 11 zig zag 3 5 8 12 3 5 8 11 10 11 10 12 Lecture 6 17
Exempel: sätt in 11 zig zig 5 11 3 12 8 11 5 10 10 12 3 8 Lecture 6 18
(2,4)-träd 2 5 7 10 14 Maps 1
Ett (2,4)-träd till 11 2 6 8 27 32 1 3 5 7 10 13 17 23 30 34 Maps 20
(2,4)-träd Varje inre nod har 2-4 barn. Varje nod lagrar 1-3 nycklar (+ värden) En inre nod som lagrar n nycklar har n+1 barn Alla löv ligger på samma djup (ett perfekt balanserat träd). Sökträdsegenskap: de n nycklarna i en nod separerar nycklarna i de n+1 delträden (se nästa bild, boken ger den allmänna egenskapen) Maps 21
(2,4)-träd har sökträdsegenskap 2, 8 är mindre än 10 12 ligger mellan 10 och 15 18 ligger mellan 15 och 24 27, 32 är större än 24 10 15 24 2 8 12 18 27 32 Maps 22
Sökning i (2,4)-träd Exempel: sök efter 30! 11 24 2 6 8 15 27 32 30 saknas Maps 23
Insättning Kan ge upphov till overflow. Vi måste då splittra en nod (se boken) Exempel: insättning av 30 orsakar overflow nedan: 10 15 24 2 8 12 18 v 27 32 35 10 15 24 Sätt in 30 2 8 12 18 27 30 32 35 Maps 24 v overflow
Röd-svarta träd v 6 3 8 4 z Maps 25
Rödsvarta träd: binära sökträd som representerar (2,4)-träd Ett röd-svart träd är ett binärt sökträd vars noder är färgade röda eller svarta Så här gör man om (2,4)-träd till rödsvarta träd: 4 3 5 2 6 7 4 5 3 6 3 eller 5 2 7 Maps 26
Röd-svarta träd Roten är svart Barnen till en röd nod är svarta Alla löv har samma svart-djup, dvs samma antal svarta förfäder (inklusive lövet självt). Detta motsvarar balanseringskravet på (2,4)-träd. 4 15 2 6 12 21 7 Maps 27
Insättning i röd-svarta träd 1. Använd först algoritmen för insättning i binära sökträd! 2. Färga den nya noden röd (undantag: den nya noden är rot)! 3. Vi kan då få en dubbel röd strukturera om eller måla om! 4 15 2 6 12 21 7 13 dubbel röd ny nod Maps 28
Ommålning Poängen med röd-svarta träd är att det ibland räcker att måla om trädet och detta är billigare än att omstrukturera det som i (2,4)- träd! (Jfr hur man handskas med overflow i (2,4)- träd.) måla röd 4 2 6 12 7 13 15 21 måla svart måla svart Maps 2
Omstrukturering Gör en enkelrotation (som i AVL-träd) av 6,7, 8! 7 blir svart med de röda barnen 6 och 8. (Jfr sambandet med (2,4)-träd. Vi behöver här bara se till att vi får en korrekt röd-svart representation av en 4-nod!) 4 15 2 6 12 21 dubbel röd 7 8 ny nod Maps 30
B-träd för sökning i externminne Om vår datasamling (mängd, lexikon) inte får plats i primärminnet måste vi lagra delar av den på externminne Tiden det tar för sökningar, insättningar och borttagningar beror huvudsakligen på antalet dataöverföringar från externminnet (disk) B-träd generaliserar (2,4)-träd, i stället för noder med mellan 2 och 4 barn har det noder med mellan d/2 och d barn. Storleken d kan vara ett block i externminnet. Maps 31
Mer om B-träd B-träd används ofta för filsystem och databaser Ett typiskt minnesblock kan vara 16 kb som ger ungefär d = 100. Söktid + rotationstid för ett element, ca 10 ms Förfiningar: B+ träd (nycklar i interna noder, element i löv) och B* träd (tätare packade interna noder) Man kan använda index (innehåller ett Maps 32 element från varje block)