Rød-Svarte Trær Lars Vidar Magnusson 21.2.2014 Kapittel 13 Rød-Svarte (Red-Black) trær Rotasjoner Insetting Sletting
Rød-Svarte Trær Rød-Svarte trær (red-black trees) er en variasjon binære søketrær som til enhver tid sørger for balanse i søketreet. Forsikrer at høyden på søketreet er O(log n). Dette forsikrer også at operasjonene vil ta O(log n). Vi legger til et ekstra attributt color i hver node som angir fargen til noden. En node er enten rød eller svart. Disse fargekodene brukes for å holde orden på strukturen til søketreet.
Representasjon av Rød-Svarte Trær Vi tar i bruk en enkelt sentinel T.nil for å representere nil i søketreet. T.nil.color er svart Alle bladnoder er tomme og svarte (de peker til T.nil). Forelderen til rotnoden peker også til T.nil.
Eksempel på et Rød-Svart Tre Figuren under viser et eksempel på et rød-svart tre uten bruk av en sentinel.
Eksempel på et Rød-Svart Tre Figuren under viser det samme eksempelet på et rød-svart tre hvor alle tomme pekere har blitt erstattet med en peker til sentinel-noden T. nil.
Eksempel på et Rød-Svart Tre Figuren under viser det samme eksempelet på et rød-svart tre, men nå uten alle hjelpenoder. Det er slik vi tegner rød-svarte trær, så lenge detaljene ikke av en eller annen grunn er påkrevd.
Egenskaper ved Rød-Svarte Trær Rød-svarte trær har følgende egenskaper: Hver node er enten rød eller svart. Rotnoden er svart. Hver eneste bladnode (T.nil) er svart. Hvis en node er rød, så er begge barna svarte (aldri to røde på rad i en enkel sti fra roten til en bladnode). For alle noder så inneholder hver eneste sti til bladnoder samme antall svarte noder. Disse egenskapene sørger for balanse i søketreet.
Høyden til et Rød-Svart Tre Rød-svarte trær har to typer høyder. Høyden til en node er antall kanter i lengste enkle sti til en bladnode (normal høyde) Svart-høyden til en node bh(x) er antall svarte noder (inkludert T.nil men ikke x) på stien fra x til en bladnode. Utifra den femte egenskapen ved rød-svart trær er bh(x) veldefinert i.e. alle stier gir samme antall svarte noder.
Høyden til et Rød-Svart Tre En node med høyde h har svart-høyde h/2. Følger av egenskap 4 ved rød-svarte trær siden minst halvparten av nodene må være svarte. Deltreet med rotnode x inneholder 2 bh(x) 1 interne noder (ikke bladnoder). Kan bevises med matematisk induksjon ved å utnytte det faktum at hvert barn har svart-høyde på enten bh(x) eller bh(x) 1 om barnet er henholdsvis rødt eller svart. Dette følger av egenskap 5 ved rød-svarte trær. Hvis vi setter disse to sammen får vi en øvre grense på høyden til et rød-svart tre med n interne noder på 2 log(n + 1). Dette kan bevises ved å løse ulikheten n 2 h/2 1 med hensyn på h.
Operasjoner på Rød-Svarte Trær Alle operasjonene vi presentere forrige uke som ikke modifiserer treet har kjøretide på O(log n). Dette gjelder for Minimum, Maximum, Successor, Predecessor og Search. Innsetting og sletting er ikke så enkelt siden vi må sørge for at egenskapene til rød-svarte trær blir ivaretatt Hvilken farge skal nye noder få? Hvis den er rød kan egenskap 4 brytes, eller også 2 hvis den nye noden er rotnoden. Hvis den er svart kan egenskap 5 brytes Hvordan påvirker fargen til en node egenskapene når en node slettes? Hvis den er svart kan egenskap 4 og 5 brytes, eller til og med 2 hvis noden var rotnoden og barnet som blir satt inn er rødt. Hvis den er rød blir egenskapene fortsatt ivaretatt.
Rotasjoner En rotasjon er operasjonen som benyttes for å restrukturere treet slik at det er balanse i søketreet. Forandrer på trestrukturen ved å endre pekerne. Påvirker ikke egenskapen til binære søketrær. Vi har både venstre- og høyre-rotasjoner. Operasjonene er symmetriske. Kjøretiden for begge rotasjonene er O(1). Benyttes av andre typer trær også (AVL, splay-trær).
Hvordan Rotasjoner Fungerer Figuren under viser hvordan rotasjoner fungerer. Operasjonen tar en referanse til søketreet og en intern node. Venstrerotasjoner gjør y sitt venstre barn til x sitt høyre Høyrerotasjoner gjør x sitt høyre barn til y sitt venstre
Left-Rotate Algoritmen Pseudokoden for Left-Rotate er listet under. Right-Rotate algoritmen er lik, men left og right er byttet om.
Eksempel Rotasjon Figuren under viser et eksempel på hvordan en rotasjon fungerer.
RB-Insert Algoritmen RB-Insert algoritmen brukes for å sette inn et nytt element i et rød-svart tre. Den er i hovedsak lik Tree-Insert algoritmen men skiller seg ut på to punkter RB-Insert setter den nye noden til å være rød Vi kaller en hjelpefunksjon RB-Insert-Fixup for å sørge for at de de rød-svarte egenskapene ivaretas. Ved å sette den nye noden til å være rød kan enten egenskap 2 eller 4 være brutt.
RB-Insert Pseudokode Pseudokoden til RB-Insert er listet under.
RB-Insert-Fixup Algoritmen Hjelpefunksjonen RB-Insert-Fixup brukes for å restrukturere treet slik at de rød-svarte egenskapene gjelder etter en insetting. Algoritmen løser konflikter med den 2 egenskapen ved å alltid sette rotnoden til å være svart Algoritmen løser konflikter med den 4 egenskapen ved rød-svart trær ved å se på på noden z sin onkel y (z.p sin bror ). Vi skiller på 6 ulike tilfeller (tre symmetriske tilfeller som avhenger om onkelen er høyre eller venstre barn). y er rød y er svart og z er høyre barn y er svart og z er venstre barn
RB-Insert-Fixup - Tilfelle 1 Vi ser først på tilfellet hvor y er rød. z.p.p (z sin besteforelder) må være svart, siden z og z.p begge er røde og det kan ikke være andre konflikter i treet. Vi setter både z.p og y til å være svart. Dette løser konflikten med den 4 egenskapen, men det kan også introdusere konflikter med den 5 egenskapen. Vi setter z.p.p til å være rød. Dette løser konflikter med den 5 egenskapen. Vi setter z til å være z.p.p før vi gå videre med neste iterasjon.
RB-Insert-Fixup - Tilfelle 1 Figuren under viser begge utgavene av tilfelle 1 (hvor y er rød). a viser utgaven hvor z er høyre barn b viser utgaven hvor z er venstre barn
RB-Insert-Fixup - Tilfelle 2 og 3 Det andre tilfellet forekommer når y er svart og z er høyre barn. Vi utfører en venstrerotasjon rundt z. p. Nå er z venstre barn, og både z og z.p er røde. Det tredje tilfellet forekommer når y er svart og z er venstre barn. Vi gjørz.p svart og z.p.p rød. Vi utfører en høyrerotasjon rundt z.p.p Dette løser konflikten med den 4 rød-svarte egenskapen. Nå er z.p er nå svart. Dette avbryter algoritmen. Vi utfører aldri mere enn to rotasjoner.
RB-Insert-Fixup - Tilfelle 2 og 3 Figuren under viser hvordan vi går fra tilfelle 2, til tilfelle 3, til et gyldig rød-svart tre.
Psedukode for RB-Insert-Fixup Algoritmen Pseudokoden til RB-Insert-Fixup algoritmen er listet under.
Analyse av RB-Insert Kjøretiden av RB-Insert er O(log n) frem til kallet til RB-Insert-Fixup. Kjøretiden til RB-Insert-Fixup kan sammenfattes med følgende punkter Hver iterasjon tar O(1) Hver iterasjon tar oss opp to nivåer Vi har O(log n) nivåer Vi har derfor en kjøretid på O(log n) Den totale kjøretiden av RB-Insert er derfor O(log n).
RB-Delete Algoritmen RB-Delete algoritmen benyttes til å slette et element fra et rød-svart tre. Algoritmen er vesentlig lengre enn Tree-Delete, men alle stegene i Tree-Delete finnes også i RB-Delete. Transplant har blitt byttet ut med en spesialisert hjelpefunksjon RB-Transplant y er en ekstra node referanse som enten peker til noden som skal slettes (hvis noden ikke har flere enn et barn) eller til noden som skal ta plassen til noden som skal slettes Vi lagrer orginalfargen til y for å kunne sjekke om noen av egenskapene har blitt brutt. x peker til noden som tar y sin plass (enten y sitt eneste barn eller T.nil). x.p blir oppdatert enten i RB-Transplant eller satt til å peke på y.
RB-Delete Pseudokode Pseudokoden til RB-Delete er listet under.
RB-Transplant Pseudokode Pseudokoden til RB-Transplant er listet under. Kjøretiden til RB-Transplant er O(1).
Konflikter Introdusert av RB-Delete RB-Delete kan introdusere konflikter. Disse forekommer bare når orginalfargen til y er svart. Hvis y er rotnoden og x er rød så har vi brutt egenskap 2 Hvis både x og x.p er røde har vi brutt egenskap 4 Vi har også brutt egenskap 5 siden vi har tatt bort en svart node fra stien til alle forfedre med y har nå en mindre svart node. Vi løser opp konfliktene med et kall til RB-Delete-Fixup.
RB-Delete-Fixup Algoritmen Konfliktene introdusert av RB-Delete blir fikset av RB-Delete-Fixup algoritmen. Den siste konflikten introdusert ved at vi tar bort en svart node kan løses ved at man lar x få en ekstra svart. En konseptuell endring i.e. ingen endring i koden. Vi antar bare en ekstra svart på alle nodene vi vurderer rød = rød-svart og svart = svart-svart Vi lar den ekstra svarte gå oppover i treet til x peker til en rød-svart node = vi gjør noden svart x peker til rotnoden = vi fjerner ekstra svart, eller vi utfører passende rotasjoner og omfarginger, og returnerer Vi har 8 tilfeller, men 4 av de er symmetriske med de resterende 4.
RB-Delete-Fixup - Tilfelle 1 Tilfelle 1 forekommer når x sin bror w er rød. w må ha to svarte barn. Vi gjør w svart og x.p rød Vi utfører en venstrerotasjon på x. p. Det nye barnet til x må være svart siden det var et barna til w før rotasjonen. Dette tar oss direkte til tilfelle 2, 3, eller 4
RB-Delete-Fixup - Tilfelle 2 Tilfelle 2 forekommer når x sin bror w er svart og begge barna til w er svarte. Merk at den lysegrå har en ukjent farge Ta bort ekstra svart på x og w. Dette gjør x svart og w rød. Flytt ekstra svart til x.p Kjør neste iterasjon med x.p som x. Hvis vi kom fra tilfelle 1 vil dette føre til at løkken avbrytes og x blir satt til svart
RB-Delete-Fixup - Tilfelle 3 Tilfelle 3 forekommer når x sin bror w er svart og det høyre barnet til w er svart. Gjør w rød og w sitt høyre barn svart. Utfør en høyrerotasjon på w. Den nye broren w er svart og har et rødt barn. Dette tar oss til tilfelle 4.
RB-Delete-Fixup - Tilfelle 4 Tilfelle 4 forekommer når x sin bror w er svart og det høyre barnet til w er rødt. Merk at vi nå har to noder med ukjent farge Gjør fargen til w til c (den ukjente fargen c til x.p) Gjør x.p svart og w sitt høyre barn svart Utfør en venstrerotasjon i x. p Fjern ekstra svart på x som vil gjøre x svart Vi er nå ferdig og kan sette x til rotnoden for å avbryte løkken.
RB-Delete-Fixup Pseudokode Pseudokoden til RB-Delete-Fixup er listet under.
Analyse av RB-Delete Kjøretiden til RB-Delete er O(log n) frem til kallet til RB-Delete-Fixup. Kjøretiden til RB-Delete-Fixup kan summeres med Det er bare tilfelle 2 som fører til ytterligere iterasjoner Går oppover nivå for nivå O(log n) nivåer Vi utfører totalt sett maksimum 3 rotasjoner Totalt sett er kjøretiden til RB-Delete O(log n).