Datastructuren en algoritmen voor CKI Jeroen Bransen 1 14 oktober 2015 1 met dank aan Hans Bodlaender en Gerard Tel
Willekeurig gebouwde zoekbomen
Willekeurig gebouwde zoekbomen Hoogte van zoekboom met n elementen kan n 1 zijn Hoogte is minstens log n Bij invoegen en verwijderen weinig garanties over hoogte Maken van boom door n (verschillende) elementen in willekeurige volgorde in te voegen: verwachte hoogte O(log n)
Willekeurig gebouwde zoekbomen Het eerste element dat wordt ingevoegd wordt de wortel Alle elementen kleiner dan dat element komen in linker subboom terecht Alle elementen groter komen in rechter subboom terecht
Willekeurig gebouwde zoekbomen Het eerste element dat wordt ingevoegd wordt de wortel Alle elementen kleiner dan dat element komen in linker subboom terecht Alle elementen groter komen in rechter subboom terecht R i geeft de rank van i, dat is de positie van i als elementen gesorteerd zouden zijn Linker subboom heeft grootte R i 1 Rechter subboom grootte n R i
Willekeurig gebouwde zoekboom Linker en rechter subboom onafhankelijk Hoogte van boom met n elementen en i als wortel: hoogte(n) = 1 + max(hoogte(r i 1), hoogte(n R i )) Hoe groot worden R i 1 en n R i?
Willekeurig gebouwde zoekboom Kans is 1/2 dat 1/4n R i 3/4n In dat geval hoogte(n) = 1 + hoogte(3/4n)
Willekeurig gebouwde zoekboom Kans is 1/2 dat 1/4n R i 3/4n In dat geval hoogte(n) = 1 + hoogte(3/4n) We verwachten elke 2 stappen dat iets met kans 1/2 voorkomt Verwachte hoogte is dus hoogte(n) = 2 + hoogte(3/4n)
Willekeurig gebouwde zoekboom Hoe vaak kunnen we n met 3/4 vermenigvuldigen totdat we bij 0 zijn? log 4/3 n keer Verwacht is dus hoogte(n) = 2 log 4/3 n = O(log n)
Willekeurig gebouwde zoekboom Analyse lijkt op die van QuickSort Analyse in boek ingewikkelder (en preciezer) Conclusie is hetzelfde Willekeurige boom is gebalanceerd (O(log n)) Maar op volgorde invoegen zeker niet!
Gebalanceerde zoekbomen
Gebalanceerde zoekbomen Binaire zoekboom met zoekboomeigenschappen Bij verwijderen/toevoegen extra stappen om boom te balanceren h = O(log n) Vrijwel alle operaties dus in O(log n)
Gebalanceerde zoekbomen Rood-zwart boom (Red-Black Tree) AVL-boom 2-3-boom Splayboom..
Rood-zwart bomen
Eigenschappen van rood-zwart bomen Binaire zoekboom Elke knoop is rood of zwart De wortel is zwart Elk blad (nil) is zwart Als een knoop rood is zijn de kinderen zwart Voor elke knoop x: alle paden van x naar een blad onder x bevatten evenveel zwarte knopen
Voorbeeld 17 14 41 13 nil 28 47 nil nil 26 30 nil nil nil nil nil nil
Voorbeeld 17 14 41 13 28 47 26 30
Hoogte rood-zwart boom Zij bh(x) (black-height) het aantal zwarte knopen op pad onder x (exclusief x)
Hoogte rood-zwart boom Zij bh(x) (black-height) het aantal zwarte knopen op pad onder x (exclusief x) Subboom met als wortel x heeft minstens 2 bh(x) 1 knopen
Hoogte rood-zwart boom Zij bh(x) (black-height) het aantal zwarte knopen op pad onder x (exclusief x) Subboom met als wortel x heeft minstens 2 bh(x) 1 knopen Bewijs met inductie op grootte boom
Hoogte rood-zwart boom Zij bh(x) (black-height) het aantal zwarte knopen op pad onder x (exclusief x) Subboom met als wortel x heeft minstens 2 bh(x) 1 knopen Bewijs met inductie op grootte boom Basisgeval: x is blad, dan 2 bh(x) 1 = 2 0 1 = 1 1 = 0
Hoogte rood-zwart boom Zij bh(x) (black-height) het aantal zwarte knopen op pad onder x (exclusief x) Subboom met als wortel x heeft minstens 2 bh(x) 1 knopen Bewijs met inductie op grootte boom Basisgeval: x is blad, dan 2 bh(x) 1 = 2 0 1 = 1 1 = 0 Inductiestap: beide kinderen hebben bh(x) of bh(x) 1, dus subboom x heeft minstens (2 bh(x) 1 1) + (2 bh(x) 1 1) + 1 = 2 bh(x) 1 knopen
Hoogte rood-zwart boom Zij bh(x) (black-height) het aantal zwarte knopen op pad onder x (exclusief x) Subboom met als wortel x heeft minstens 2 bh(x) 1 knopen Bewijs met inductie op grootte boom Basisgeval: x is blad, dan 2 bh(x) 1 = 2 0 1 = 1 1 = 0 Inductiestap: beide kinderen hebben bh(x) of bh(x) 1, dus subboom x heeft minstens (2 bh(x) 1 1) + (2 bh(x) 1 1) + 1 = 2 bh(x) 1 knopen Op pad van wortel naar blad minstens h/2 zwarte knopen, dus n 2 h/2 1
Hoogte rood-zwart boom Zij bh(x) (black-height) het aantal zwarte knopen op pad onder x (exclusief x) Subboom met als wortel x heeft minstens 2 bh(x) 1 knopen Bewijs met inductie op grootte boom Basisgeval: x is blad, dan 2 bh(x) 1 = 2 0 1 = 1 1 = 0 Inductiestap: beide kinderen hebben bh(x) of bh(x) 1, dus subboom x heeft minstens (2 bh(x) 1 1) + (2 bh(x) 1 1) + 1 = 2 bh(x) 1 knopen Op pad van wortel naar blad minstens h/2 zwarte knopen, dus n 2 h/2 1 Conclusie: h 2 log(n + 1) = O(log n)
Voorbeeld 1
Voorbeeld 1 2
Voorbeeld 2 1 3
Voorbeeld 2 1 3 4
Voorbeeld 2 1 4 3 5
Voorbeeld 2 1 4 3 5 6
Voorbeeld 2 1 4 3 6 5 7
Voorbeeld 4 2 6 1 3 5 7 8
Rotaties
Rotaties Aantal knopen in linker en rechter kind moeten ongeveer gelijk zijn Zo niet: boom in onbalans Oplossing: herbalanceren door middel van rotaties Rotatie is het verschuiven van ouder en kindknoop ten opzichte van elkaar Zoekboom-eigenschappen blijven behouden Hoogte van linker en rechter kind verandert met 1
Rotaties y left-rotate(t, x) x α x β γ right-rotate(t, y) α β y γ
Left-rotate left-rotate(t, x) 1 y = x.right 2 x.right = y.left 3 if y.left nil 4 y.left.p = x 5 y.p = x.p 6 if x.p == T.nil 7 T.root = y 8 elseif x == x.p.left 9 x.p.left = y 10 else x.p.right = y 11 y.left = x 12 x.p = y
Toevoegen
Toevoegen Vergelijkbaar met tree-insert Nieuwe knoop is rood Na invoegen knopen herkleuren en rotaties om rood-zwart-eigenschappen te herstellen O(log n)
Voorbeeld 17 14 41 13 28 47 26 30
Voorbeeld 17 14 41 13 28 47 26 30 27
Voorbeeld 17 14 41 13 28 47 26 30 27
Voorbeeld 17 14 28 13 26 41 27 30 47
Voorbeeld 28 17 41 14 26 30 47 13 27
Toevoegen rb-insert(t, z) 1 y = T.nil; x = T.root 2 while x T.nil 3 y = x 4 if z.key < x.key 5 x = x.left 6 else x = x.right 7 z.p = y 8 if y == T.nil 9 T.root = z 10 elseif z.key < y.key 11 y.left = z 12 else y.right = z 13 z.left = z.right = T.nil 14 z.color = red 15 rb-insert-fixup(t, z)
Rood-zwart eigenschappen herstellen Iteratief proces, maximaal O(log n) stappen z is de knoop onder behandeling (beginnend bij nieuwe knoop) z is altijd rood Als z.p wortel is, dan is z.p zwart De boom verbreekt maximaal 1 rood-zwart eigenschap tegelijk: z en z.p zijn beiden rood, of z is de wortel (en z is rood)
Geval 1: z s oom y is ook rood 11 2 14 1 7 15 5 8 y 4 z
Geval 2: z is een rechter kind 11 2 14 y 1 7 z 15 5 8 4
Geval 3: z is een linker kind 11 7 14 y 2 z 8 15 1 5 4
Rood-zwart eigenschappen hersteld 7 2 z 11 1 5 8 14 4 15
Rood-zwart eigenschappen herstellen rb-insert-fixup(t, z) 1 while z.p.color == red 2 if z.p == z.p.p.left 3 y = z.p.p.right 4 if y.color == red 5 z.p.color = black / Geval 1 6 y.color = black / Geval 1 7 z.p.p.color = red / Geval 1 8 z = z.p.p / Geval 1 9 else if z == z.p.right 10 z = z.p / Geval 2 11 left-rotate(t, z) / Geval 2 12 z.p.color = black / Geval 3 13 z.p.p.color = red / Geval 3 14 right-rotate(t, z.p.p) / Geval 3 15 else / Symmetrisch geval