De presentatie wordt gedownload. Even geduld aub

De presentatie wordt gedownload. Even geduld aub

Gebalanceerde bomen Zoekbomen: rotaties AVL-bomen Rood-zwart-bomen.

Verwante presentaties


Presentatie over: "Gebalanceerde bomen Zoekbomen: rotaties AVL-bomen Rood-zwart-bomen."— Transcript van de presentatie:

1 Gebalanceerde bomen Zoekbomen: rotaties AVL-bomen Rood-zwart-bomen

2 Dit onderwerp Gebalanceerde bomen: AVL-bomen Analyse vd hoogte Invoegen Rood-zwart-bomen Analyse vd hoogte, Invoegen Weglaten

3 Dit onderwerp We zagen: Veel operaties op zoekbomen gaan in O(h) met h de hoogte van de zoekboom Gebalanceerde bomen: zorg ervoor dat de hoogte van een boom O(log n) blijft Techniek: rotaties Twee soorten gebalanceerde bomen: AVL-bomen (niet in boek; we doen alleen invoegingen) Rood-zwart-bomen (wel in boek; invoegen en weglaten) Van beide: Eigenschappen bewijs van O(log n) hoogte, hoe doe je invoegingen (en weglatingen voor Rood-zwart)?

4 Zoekbomen recap Zoekboom: implementatie van ADT met operaties: ZOEK-ELEMENT VOORGANGER OPVOLGER MINIMUM MAXIMUM INSERT DELETE En andere operaties, bijv. Dynamic order statistics n is steeds het aantal niet-NIL keys in de zoekboom Bij een zoekboom kan elk van deze in O(h) tijd, met h de hoogte van de boom

5 Slechte zoekboom Als we niks doen, kan de hoogte groot worden Slechtste geval: elke knoop heeft maar 1 kind Kunnen we de zoekboom zo implementeren dat de hoogte beperkt blijft??

6 Zoekbomen met logaritmische hoogte Veel vormen van zoekbomen zijn ontworpen zodat De hoogte van de boom O(log n) blijft Operaties in O(log n) tijd gedaan kunnen worden We bekijken er twee: AVL-bomen (niet in boek) Rood-zwart-bomen (in boek) Principes zijn in beide gevallen: Rotaties Extra informatie in knopen die afdwingen Wanneer je roteert O(log n) hoogte van boom Andere datastructuren

7 Er zijn heel wat andere soorten bomen met zelfde eigenschappen: bomen, 2-3-bomen, alpha-beta-bomen, B-bomen Ook veel gebruikt: skip-lists. Andere datastructuur met zelfde soort tijdseigenschappen (gelinkte lijst met aantal extra pointers die maken dat je soms stukken slim kan overslaan (skippen)) Werkt probabilistisch

8 Rotatie Idee: verander de zoekboom lokaal zodat Eigenschappen van zoekboom behouden blijft Hij beter in balans komt

9 Root(T)

10 AVL-bomen Genoemd naar uitvinders: Adel’son-Vel’skii en Landis Idee: elke knoop houdt zijn hoogte bij en Broers hebben verschillen nooit meer dan 1 in hoogte

11 Definitie Een AVL-boom is een binaire zoekboom met de eigenschap dat voor elke knoop de hoogtes van zijn kinderen hooguit 1 verschillen Als een knoop maar 1 kind heeft, dan heeft dat kind hoogte 1 (d.w.z., is een blad)

12 Stellingen Stelling 1 Een AVL-boom met hoogte h heeft minstens 2 h/2-1 knopen. Stelling 2 Een AVL-boom met n knopen heeft hoogte O(log n). Stelling 2 volgt direct uit stelling 1 Stel een AVL boom met n knopen heeft hoogte h. Dan geldt dus n  2 h/2-1 Dus log n  log (2 h/2-1 ) = h/2 -1 Dus h  2* log n +2 Nu nog het bewijs van Stelling 1

13 Een AVL-boom met hoogte h heeft minstens 2 h/2-1 knopen. Bewijs met inductie Twee basisgevallen: h = 1: hoogte 1: alleen wortel: 1 knoop: OK h = 2: hoogte 2: wortel heeft een kind: minstens 2 knopen 2 2/2-1 = 2 0 = 1: OK h > 2: Stel de bewering is waar voor alle AVL-bomen met een hoogte kleiner dan h. Een AVL-boom met hoogte h heeft een wortel met twee kinderen. Minstens 1 van deze kinderen heeft hoogte h-1; het andere kind heeft hoogte h-1 of hoogte h-2. Dus hebben we minstens (h-1)/ (h-2)/2-1 knopen (wortel, boom hoogte h-1, boom hoogte h-2 of h-1) Dus minstens 2 h/2-1 knopen

14 Hoe zorgen we dat een AVL-boom een AVL-boom blijft? 1.Houd de hoogtes bij: 1.Bij elke knoop x hebben we een variabele hoogte(x) 2.Knoop zonder kinderen heeft hoogte(x)=1 3.Knoop x met 1 kind y heeft hoogte(x) = hoogte(y)+1 4.Knoop x met 2 kinderen y en z heeft hoogte(x) = max(hoogte(y),hoogte(z))+1 5.Als we de boom veranderen moeten we de hoogtes herberekenen: ALLEEN voor die plekken waar wat verandert en alle voorgangers hiervan 2.Als we een knoop tegenkomen waar de AVL-boom eigenschap niet langer geldt dan gaan we roteren om de eigenschap te herstellen

15 Links- en rechts-rotatie Links-rotatie Rechtsrotatie

16 Links- en rechts-rotatie Links-rotatie Rechtsrotatie

17 Invoegen van een knoop Voeg een knoop in bij een blad (zoals we al eerder zagen) Wat kan er gebeuren? De hoogte van alle knopen op het pad naar de wortel kan toenemen Een of meer knopen op het pad naar de wortel kunnen ‘uit balans’ raken Stel we voegen x toe Loop van x naar boven naar de wortel Bereken overal de hoogte Wat kan gebeuren is dat het verschil tussen de hoogte links en rechts bij een kind 2 wordt (was 1, kan 1 toenemen) Als dat zo is, gaan we roteren

18 Stel we voegen 14 toe Eerst een voorbeeld

19 14 is toegevoegd Herbereken hoogte

20 Herbereken hoogte hoogte wordt 2 15 is in balans

21 Een stap omhoog Herbereken hoogte

22 Opnieuw balanceren Herbereken hoogte hoogte is 3 16 is NIET in balans

23 Opnieuw balanceren is NIET in balans We gaan roteren

24 Na rotatie (hoogtes tijdelijk fout)

25 Herbereken hoogtes voor geroteerde knopen

26 Een stap omhoog: 13 in balans en correcte hoogte Klaar

27 Basisalgoritme Invoegen(boom T, key x) {De volgende twee stappen gaan als gewoon invoegen} Vind een blad in T waar we x kunnen invoegen Voeg x op die plek in {Nu moeten we de AVL-eigenschap herstellen} y = parent(x); klaar = false; while (niet klaar) do herbereken hoogte van y if y uit balans then herbalanceer (hoe?) if hoogte y niet veranderd en y was al in balans then klaar=true if y == root(T) then klaar = true else y = parent(y)

28 Uit balans Door invoegen van 1 knoop kan de hoogte van een knoop met hooguit 1 toenemen Knoop die uit balans is heeft twee kinderen met hoogteverschil 2 XhXh y h-1 z h-3 XhXh z h-3 y h-1 of

29 Herbalanceren door rotatie: 1e voorbeeld Rechts-rotatie x5x5 x5x5 y4y4 y4y4 z2z2 x3x3 x3x3 y4y4 y4y4 z2z2 w3w3 w3w3 q2q2 q2q2 Na rotatie van x en y zijn de knopen in balans geraakt Omdat de hoogte van de wortel daalde moeten we hoogtes en balansen van voorouders hierna doorrekenen

30 Herbalanceren: enkele (rechts) rotatie Roteer zodat het “hoge stuk” omhoog gaat: XhXh y h-1 z h-3 X h-1 of h-2 y h-1 of h z h-3 h-2 of h-3

31 Een aantal verschillende gevallen (1) We hebben onbalans. De knoop met de grotere hoogte kan links of rechts zitten Deze twee gevallen zijn gespiegeld. We behandelen hier alleen het eerste geval: XhXh y h-1 z h-3 XhXh z h-3 y h-1 of

32 Een aantal verschillende gevallen: wat zit er onder y? XhXh z h-3 y h-1 v?v? w?w? v h-2 w h-2 y h-1 v h-2 w h-3 y h-1 v h-3 w h-2

33 Geval 1: Een enkele (rechts) rotatie is voldoende xhxh xhxh y h-1 z h-3 x h-1 yhyh yhyh z h-3 v h-2 w h-2 … en we zijn klaar

34 Geval 2: Een enkele (rechts) rotatie herstelt de balans xhxh xhxh y h-1 z h-3 x h-2 y h-1 z h-3 v h-2 w h-3 … de hoogte van de wortel is omlaag gegaan: we moeten hoogtes en balansen opnieuw uitrekenen / herstellen voor de voorouders

35 Geval 3: Een dubbele rotatie is nodig xhxh y h-1 z h-3 v h-3 w h-2 xhxh y h-2 z h-3 v h-3 w h-1 h-3 of h-4 En daarna … Links-rotatie van y en w

36 Tweede deel dubbele rotatie xhxh xhxh y h-2 z h-3 v h-3 w h-1 h-3 of h-4 x h-2 y h-2 z h-3 v h-3 w h-1 h-3 of h-4 Rechts-rotatie van w en x … de hoogte van de wortel is omlaag gegaan: we moeten hoogtes en balansen opnieuw uitrekenen / herstellen voor de voorouders

37 Geval 3 in 1 stap weergegeven xhxh xhxh y h-1 z h-3 v h-3 w h-2 h-3 of h-4 x h-2 y h-2 z h-3 v h-3 w h-1 h-3 of h-4 … de hoogte van de wortel is omlaag gegaan: ook in dit geval moeten we hoogtes en balansen opnieuw uitrekenen / herstellen voor de voorouders

38 Opmerkingen Er zijn net zo veel gespiegelde gevallen; die gaan dus niet zo (gespiegeld) … Tijd: lineair in de hoogte van de boom: O(log n) Na afloop is de boom weer een AVL-boom: dus hoogte blijft O(log n)

39 Schema Zoek een blad om de knoop x in te voegen Voeg de knoop x toe op de gevonden positie y = parent(x) Herhaal: Reken de hoogte van y uit aan de hand van de hoogtes van de kinderen van y Controleer of y in balans is: wat is het verschil van de hoogtes van de kinderen van y? Zonodig: herstel balans bij y met enkele of dubbele rotatie Als y de wortel, of hoogte van wortel van boom waar we op werkten niet is veranderd: klaar (break)

40 Recap Invoegen van een knoop en het daarna herstellen van de AVL-boom eigenschap kan in O(h) tijd h = O(log n) Operaties op AVL-boom (invoegen, zoeken, minimum, successor, etc.) kunnen in O(log n) tijd Weglaten gaat ook (“dubbele rotatie”; doen we hier niet) We kijken zometeen naar een andere gebalanceerde boom: de rood-zwart-bomen. Daar doen we wel de weglatingen

41 Studiemateriaal Deze sheets Bijvoorbeeld hoofdstuk 7.4 van Data Structures and Algorithms in Java (of een andere versie) van Goodrich en Tamassia

42 Rood-zwart-bomen Binaire zoekboom Iedere knoop heeft de volgende velden: Kleurbit: rood of zwart Key Left (pointer naar linkerkind) Right (pointer naar rechterkind) P (Parent) (pointer naar ouder) Met een Boolean kunnen we de kleur bijhouden. We schrijven hier: rood en zwart ipv. bitwaarde voor notatiegemak.

43 Rood-zwart eigenschappen Een binaire zoekboom is een rood-zwart-boom, als de volgende rood-zwart eigenschappen gelden: 1.Elke knoop is rood of zwart 2.De wortel is zwart 3.Bladeren (die NIL zijn) zijn zwart 4.Als een knoop rood is, dan zijn allebei zijn kinderen zwart 5.Voor elke knoop v geldt: elk pad van v naar een blad onder v heeft hetzelfde aantal zwarte knopen Idee 1: we doen de operaties op de boom zodat de rood-zwart eigenschappen blijven kloppen Hierbij gebruiken we rotaties Idee 2: als de rood-zwart eigenschappen kloppen dan heeft de boom hoogte O(log n) Bewijs komt zometeen

44 NIL Een voorbeeld van een rood-zwart-boom NIL

45 We tekenen de boom zonder de NIL-knopen

46 Implementatie van NIL-knopen Er zijn verschillende implementaties van de NIL-knopen mogelijk: Gewoon aparte knoop voor elke NIL-knoop Geen object-verwijzing in NIL-knoop (extra test bij bijv. Zoekacties op dit soort verwijzingen) Boolean’s In het boek wordt het volgende gedaan: Alle NIL-knopen worden door een en hetzelfde object gerepresenteerd Die ene NIL-knoop is ook de parent van de root Deze knoop heet NIL[T] Verschillende implementaties kunnen in de constante, verstopt in de O-notatie, uitmaken

47 Implementatie boek

48 Hoogte-analyse van rood-zwartbomen 1 Definitie: de zwart-hoogte (black-height) van een knoop x, notatie zh(x) is het aantal zwarte knopen van x naar een blad. We tellen x zelf niet mee, het blad wel. Vanwege eigenschappen van rood-zwartbomen: het hangt niet af welk blad we bekijken (eigenschap 5)

49 zh(x)

50 Een Lemma Lemma Laat x een knoop zijn. Als x zwarthoogte r heeft, dan bevat de deelboom, gevormd door x en al zijn afstammelingen tenminste 2 r -1 niet-NIL knopen. Bewijs Met inductie naar de (gewone) hoogte van x. Als x hoogte 0 heeft, dan is x een leaf (NIL-knoop); de boom gevormd door x en al zijn afstammelingen bevat alleen x en dus 0 niet-NIL knopen, wat precies is. Stel x heeft hoogte h >0, en het lemma geldt voor alle knopen met hoogte < h. Dus: het lemma geldt voor de kinderen van x. Elk kind van x heeft zwarthoogte r-1 of r. De deelboom bevat:  2 r-1 – 1 niet-NIL knopen in de linkerdeelboom van x;  2 r-1 – 1 niet-NIL knopen in de rechterdeelboom van x; en x zelf (ook niet-NIL). Dus minstens 2 r r = 2 r -1 niet-NIL knopen. QED

51 r r r-1 IH: hier 2 r -1 of meer knopen IH: hier 2 r-1 -1 of meer knopen Voorbeeld van tellen Totaal hier minstens 2 r r knoop

52 Zwart-hoogte en hoogte van boom Lemma De wortel van een rood-zwartboom met n interne knopen heeft zwarthoogte hooguit lg (n+1). Want n  2 zh(root) -1 Stelling De hoogte van een rood-zwartboom is hooguit 2 lg(n+1). Bewijs: tenminste de helft van alle knopen op een pad van de wortel naar een blad zijn zwart, want er zijn geen twee rode knopen na elkaar op zo’n pad. Dus de hoogte is maximaal twee keer de zwart-hoogte van de wortel. QED Gevolg: operaties Tree-Search, Minimum, Maximum, Successor, Predecessor kosten O(lg n) tijd als we een rood-zwart-boom hebben.

53 Rotaties 1 Bij INSERTIONs en DELETIONs moeten we zorgen dat rood-zwart-eigenschap behouden blijft Hoe? Weer met rotaties: Links-rotatie en rechts-rotatie Kunnen rood-zwart eigenschap verknoeien of herstellen Behouden de zoekboom-eigenschappen Links-rotatie:

54 Links- en rechts-rotatie (herhaling)

55

56 Eigenschap van rotaties Rood-zwart-eigenschappen kunnen veranderen voor de geroteerde knopen en alle knopen op pad van geroteerde knopen naar wortel

57 Invoegen van een nieuwe node Als we een nieuwe knoop met key z willen invoegen: Eerst voegen we z toe, net als in zoekboom z is (in eerste instantie) rood Daarna doen we een stap RB-INSERT-FIXUP(T,z): Herstelt de rood-zwart eigenschap door rotaties

58 Pseudocode RB-INSERT(T,z) Neem aan dat we een knoop- object z hebben met een key-waarde key[z]. Ongeveer net als bij gewone zoekbomen voegen we in, maar Gebruik van nil[T] Nieuwe knoop krijgt kleur rood We roepen RB-INSERT-FIXUP aan y = nil[T]; x = root[T]; while x  nil[T] do y = x; if key[z] < key[x] then x = left[x] else x = right[x] p[z] = y; if (y == nil[T]) then root[T]= z; else if key[z] < key[y] then left[y] = z else right[y] = z left[z] = nil[T]; right[z] = nil[T]; color[z] = rood; RB-INSERT-FIXUP(T,z) Pseudocode van een “gewone insert”

59 RB-INSERT(T,z) x wordt een blad waar key[z] zou passen; y is de ouder van x Zet z op de plek van x en zet alle pointers goed Kleur z rood Roep RB-INSERT-FIXUP aan y = nil[T]; x = nil[T]; while x  nil[T] do y = x; if key[z] < key[x] then x = left[x] else x = right[x] p[z] = y; if (y == nil[T]) then root[T]= z; else if key[z] < key[y] then left[y] = z else right[y] = z left[z] = nil[T]; right[z] = nil[T]; color[z] = rood; RB-INSERT-FIXUP(T,z)

60 Hoe doen we de fixup? Kijk eens naar de rood-zwart-eigenschappen: 1.Elke knoop is rood of zwart 2.De wortel is zwart 3.Bladeren (die NIL zijn) zijn zwart 4.Als een knoop rood is, dan zijn allebei zijn kinderen zwart 5.Voor elke knoop v geldt: elk pad van v naar een blad onder v heeft hetzelfde aantal zwarte knopen Alleen eigenschappen 2 en 4 kunnen worden geschonden. Eigenschap 2 is makkelijk: als de ingevoegde knoop de wortel is, dan is die rood, maar moet zwart zijn. Dus, kleur de wortel zwart. Dat verknoeit niets. Eigenschap 4 kan verknoeid worden als we z onder een rode knoop hangen. We kunnen niet zomaar z dan zwart kleuren, want dat zou eigenschap 5 schaden…

61 Duw het probleem omhoog Ons algoritme gebruikt als invariant z is rood Als p[z] de wortel is, dan is p[z] zwart Als de rood-zwart-eigenschappen niet gelden, dan gelden ze op precies 1 punt niet, nl. bij z, en 1 van de volgende 2 gevallen geldt: z is de wortel en z is rood OF z is rood en p[z] is rood Merk op: deze geldt initieel (met z de ingevoegde knoop) In het begin geldt dit voor de ingevoegde knoop z (onderaan de boom). Door rotaties en herkleuringen schuiven we het probleem omhoog, tot we bij de wortel zijn of er geen probleem meer is… Hoe we precies dit doen: gevalsonderscheid!

62 Geval 0: z is de wortel Kleur z zwart Klaar! Als z niet de wortel is: z is rood, de ouder van z is rood (en dus is vanwege invariant is de ouder van z ook niet de wortel)

63 Als z niet de wortel is: Als z niet de wortel is: z is rood, de ouder van z is rood (en dus is vanwege invariant is de ouder van z ook niet de wortel) 6 gevallen z p[z] z

64 6 gevallen 1 en 1b: de oom van z is rood 2 en 2b: “recht”: z is linkerkind van linkerkind, of rechterkind van rechterkind, en de oom van z is zwart 3 en 3b: “zigzag”: z is linkerkind van rechterkind, of rechterkind van linkerkind, en de oom van z is zwart

65 Geval 1: p[z] is linkerkind, en right[p[p[z]] is rood In geval 1 is p[z] het linkerkind van zijn ouder: left[p[p[z]] == p[z] En is het rechterkind van de ouder van de ouder van z rood Naamgeving: right[p[p[z]] is de oom van z z

66 Geval 1: p[z] is linkerkind, en right[p[p[z]] is rood Kleur ouder en oom van z zwart Kleur grootouder van z rood z wordt grootouder z = p[p[z]] z z Check de invarianten!

67 Geval 1B: p[z] is rechterkind, en left[p[p[z]] is rood Net als geval 1, maar gespiegeld z z

68 Wat is het geval? We krijgen nog deze gevallen: Geval 2: p[z] is een linkerkind, de oom van z is zwart, en z is een linkerkind Geval 2B: p[z] is een rechterkind, de oom van z is zwart, en z is een rechterkind Gespiegeld aan geval 2 Geval 3: p[z] is een linkerkind, de oom van z is zwart, en z is een rechterkind Geval 3b: p[z] is een rechterkind, de oom van z is zwart, en z is een linkerkind Gespiegeld aan geval 3

69 Geval 2: p[z] is een linkerkind, de oom van z is zwart, en z is een linkerkind Ziet er zo uit Lijkt op geval 1, maar nu is de oom van z zwart, en we eisen dat z een linkerkind is (maakte niet uit bij geval 1) z

70 Geval 2: rotatie en herkleuren Doe rechterrotatie en herkleur z … en klaar!

71 Geval 3: p[z] is een linkerkind, de oom van z is zwart, en z is een rechterkind We doen nu een linkerrotatie en komen daarmee in geval z 71

72 z z 71 Linkerrotatie: dit beinvloedt alleen z en zijn ouder. Hierna zijn we in geval 2 beland en lossen we het op als in geval 2!

73 Recap Geval 1 en 1B: kleur de ouder en oom van z zwart, en de grootouder van z rood; z wordt zijn grootouder Geval 2: doe een rechterrotatie en kleur de oude ouder van z zwart en de oude grootouder van z rood. Nu gelden alle rood-zwart-boom-eigenschappen weer. Geval 2B: doe een linkerrotatie en kleur de oude ouder van z zwart en de oude grootouder van z rood. Nu gelden alle rood-zwart-boom-eigenschappen weer. (Niet getoond.) Geval 3: doe een linkerrotatie en je komt in geval 2 Geval 3B: doe een rechterrotatie en je komt in geval 2B (niet getoond)

74 Pseudocode for RB-INSERT-FIXUP(T,z) while color[p[z]] == rood do if (p[z] == left[p[p[z]]) then y = right[p[p[z]]]; if (color[y] == rood) {geval 1} thencolor[p[z]] = zwart; color[y] = zwart; color[p[p[z]] = rood; z = p[p[z]]; elseif (z == right[p[z]]){geval 2} then z = p[z]; LEFT-ROTATE(T,z); color[p[z]] = black;{geval 3} color[p[p[z]] = red; RIGHT-ROTATE(T,p[p[z]]); else zelfde code als voor het if-geval met links en rechts verwisseld

75 Tijd van invoeging De hoogte van de boom is en blijft O(log n) Eerst gaan we van de wortel naar een blad, en dan weer terug omhoog Op elke positie doen we een constant aantal acties O(log n) tijd

76 Opmerking Andere soorten zoekbomen met O(log n) tijd voor insertions werken ook met rotaties, maar hebben een ander mechanisme om te zien waar en wanneer je moet roteren

77 Weglaten / deletion Weglaten lijkt er een beetje op: iets meer gevallen Weglaten heeft twee stappen: 1.Verwijderen van de knoop, ongeveer als in “gewone” zoekboom 2.Fixup, die rood-zwart eigenschappen herstelt, met herkleuringen en rotaties Bij het weglaten kan gebeuren: Een knoop a wordt verplaatst naar een andere plek waar een knoop b stond die weggelaten werd Geef verplaatste knoop a de kleur van de weggelaten knoop b Een blad wordt weggelaten Een knoop met 1 kind wordt overgeslagen

78 RB-DELETE(T,z) Pseudocode: zie boek We doen eigenlijk hetzelfde als de oorspronkelijke delete, maar nil-pointers Kleur van knoop die verplaatst wordt Na afloop een FIXUP: herstel de rood-zwart eigenschappen

79 RB-Fixup-Delete Herinner van “gewone” delete de gevallen: We kunnen een blad weglaten Rood of zwart We kunnen een knoop met 1 kind “overslaan” Rood of zwart Bij het verplaatsen: knoop kan nieuwe kleur krijgen: Kleur van de knoop die weggelaten was op wiens plek hij komt

80 Rode knopen zijn makkelijk De rood-zwart-boom eigenschappen blijven geldig als we een rood blad weggooien of overslaan 1.Elke knoop is rood of zwart 2.De wortel is zwart 3.Bladeren (die NIL zijn) zijn zwart 4.Als een knoop rood is, dan zijn allebei zijn kinderen zwart 5.Voor elke knoop v geldt: elk pad van v naar een blad onder v heeft hetzelfde aantal zwarte knopen Dus we hoeven alleen een “fixup” te doen als we een zwarte knoop overslaan of weglaten

81 Gevallen Weglaten van een zwarte knoop Wortel (heeft dan 1 kind) Oplossen door nieuwe wortel zwart te maken (als ie ‘t niet al was) Knoop met 1 kind middenin, kind is zwart Kan niet gebeuren Knoop met 1 kind middenin, kind is rood Kleur kind zwart Blad Oplossen met rotaties

82 Geval 1 Geval 1: de wortel heeft 1 kind, en we laten de wortel weg Mogelijk probleem: conditie 2: wortel kan rood wortel Oplossing: kleur de wortel zwart. Condities gelden nu

83 Geval 2: Overslaan van zwarte knoop met 1 rood kind Als we een zwarte knoop x met 1 rood kind overslaan, dan doen we: Kleur het kind zwart Controleer dat we weer een rood-zwart-boom hebben aan de eisen In feite is het rode kind weggelaten

84 Geval 2B: Overslaan van zwarte knoop met 1 zwart kind Als we een zwarte knoop x met 1 zwart kind overslaan, dan was de boom geen rood- zwart-boom! In het voorbeeld: linksaf heeft “8” een grotere zwarthoogte dan rechtsaf… Dus, dit geval doet zich niet voor ?

85 Geval 3: Weglaten van zwart blad Alleen eigenschap 5 is verknoeid: voorouders van weggelaten knoop x hebben verschillend aantal zwarte knopen op paden naar bladeren Oplossen door omhoog te lopen en door rotaties e.e.a. op te lossen Preciezer: 1 knoop en al zijn voorouders hebben eigenschap 5 niet vervuld

86 … en links en rechts kunnen anders zitten Samenvatting probleem z x y i-1 zwarte knopeni zwarte knopen Deze namen blijf ik gebruiken Als we een zwart blad hebben weggelaten

87 Weer verschillende gevallen gevallen x is een knoop die te weinig zwart heeft naar beneden, vergeleken met z’n broer 1.De broer van x is rood 2.De broer van x is zwart en heeft twee zwarte kinderen 3.De broer van x is zwart, heeft een zwart kind en een rood kind, en het rode kind “zit aan de kant van x” 4.De broer van x is zwart, heeft een zwart kind en een rood kind, en het zwarte kind “zit aan de kant van x” OF: De broer van x is zwart en heeft twee rode kinderen NB: nil-bladeren tellen hier ook als zwarte kinderen

88 Geval 1: de broer van x is rood Roteer en herkleur om ervoor te zorgen dat de broer van x zwart is Nu kom je in geval 2-4: de broer van x is zwart z x y a b y bz x a i-1 i i i i i Getallen: aantal zwarte knopen op bladpaden, inclusief

89 Geval 2: zwarte broer die twee zwarte kinderen heeft Stel x heeft zwarte broer, en die heeft twee zwarte kinderen Oplossing: kleur de broer van x rood Nu heb je het probleem 1 omhoog geschoven in de boom Het probleem kan zich mogelijk nog bij z voordoen (niet altijd) Herhaal de analyse met z=x z x y a b i i-1 i z x y a b i

90 Geval 3: broer heeft dichtbij rood kind en ver zwart kind Stel x is linkerkind van z, broer y van x is rechterkind Stel linkerkind a van y is rood Stel rechterkind b van y is zwart Nu roteren we y en a en herkleuren Zelfde soort geval met links en rechts gespiegeld Je zit nu in geval 4: de wortel van de paarse boom is zwart want hing onder rood z x y a b i i-1 i z x y a b i i

91 Geval 4: broer heeft veraf rood kind Stel x is linkerkind van z, broer y van x is rechterkind Stel rechterkind b van y is rood Roteer Controleer verder 1 hoger in de boom Zelfde soort geval met links en rechts gespiegeld z x y a b i i-1 i y z b xa i i i

92 Algemeen Door herkleuren en roteren schuif je probleem steeds 1 hoger de boom in Probleem: knoop met verschillend aantal zwarte knopen op paden via linkerkind en via rechterkind Als we bij de wortel zijn, ben je klaar Soms ben je eerder klaar O(1) werk per niveau van de boom, dus O(log n) totaal

93 Stelling Operaties: zoeken, invoegen, weglaten, minimum, opvolger, voorganger, kunnen allemaal in O(log n) tijd op rood-zwart-bomen

94 Conclusies Technieken: Invariant houden van eigenschappen van de boom Gevalsanalyse Probleem (tijdelijke overtreding van invariante eigenschappen) duwen naar wortel, of duwen naar blad toe en zo oplossen Hoogte boom blijft O(log n) Dus operaties gaan in O(hoogte) = O(log n)


Download ppt "Gebalanceerde bomen Zoekbomen: rotaties AVL-bomen Rood-zwart-bomen."

Verwante presentaties


Ads door Google