1 Datastructuren Een informele inleiding tot Skiplists Onderwerp 13
2 Skiplists Vrij eenvoudige datastructuur “Makkelijker” dan gebalanceerde bomen Kunnen hetzelfde als gebalanceerde bomen Makkelijkste versie: “verwachtte tijd even snel als gebalanceerde bomen” Hier: een “informele” inleiding Hoe werken ze? Een enkel bewijsje over de tijdgrens
3 Operaties: Zoek-Element Minimum Maximum Volgende Vorige Insert Delete Kunnen allemaal goed gedaan worden met skiplists
4 Eerst maar eens: “een gewone dubbelgelinkte lijst” Alles in O(n) in het slechtste geval…
5 Toevoegen van “snelweg”
6 Zoeken met de snelweg “Loop eerst over de snelweg, totdat je te ver zou gaan, en ga dan door de gewone lijst”
7 Hoeveel stappen maximaal? Aantal stappen in laag 1: maximaal tot eind Aantal stappen in laag 2: maximaal stuk tussen twee afritten Slechtste geval zit tussen: Maximum van geval 1 en geval 2 Twee keer ‘t maximum van geval 1 en geval 2 Als je nu de afritten op afstand n 1/2 zet dan krijg je ‘t best mogelijke (op factor 2 na)
8 Meer dan twee lagen Algoritme om x te zoeken: Begin links in de bovenste laag Herhaal tot gevonden of helemaal rechts- onderaan: Zitten we in x? Ja: klaar Is de volgende in mijn laag < x? Ja: ga een stap verder in deze laag Nee: ga naar dezelfde key in de laag eronder (dit geval nemen we ook als er geen volgende in mijn laag is)
9 Hoe grote stappen per laag? Als je k lagen hebt, en elke laag r stappen doet voordat je naar de volgende laag gaat: Maximaal iets van kr stappen Totaal kan je zo ongeveer k r knopen hebben op de onderste laag n k r dus r log n / log k Als je k = log n neemt en r=2 heb je een “verstopte gebalanceerde binaire boom”: ‘t kost ook O(log n) tijd
10 Hoe in te voegen en weg te laten? We maken een versie die “met grote kans” snel werkt Weglaten is simpel: gewoon weglaten en overal waar je voorkomt je buren verbinden Tijd: zoeken + O(aantal lagen waar ie in voorkomt) Invoegen: In elk geval invoegen in de onderste laag Tijd: zoeken + O(aantal lagen waar ie in voorkomt) Maar … in hoeveel lagen daarboven?
11 Kansen Stop met bepaalde kans (bijvoorbeeld ½) de knoop in de laag erboven Herhaal totdat “munt” Gooi een munt op. Is ‘t kop, stop dan de knoop in nog een laagje meer “Gemiddeld” heb je O(log n) lagen “Gemiddeld” zitten er steeds twee knopen tussen elke afrit
12 Kinestetische leerervaring? Voorbeeldje uitproberen
13 Opmerkingen Slechtste geval van algoritme: oneindig! Gemiddeld: prima Je kan ook bewijzen dat de kans dat “alles” in O(log n) gaat heel groot is (naar 1 gaat voor n naar oneindig) “Variatie”: in plaats van kans ½ misschien 1/3 of … Constantes kunnen verschillen…
14 Een bewijsje Met hoge waarschijnlijkheid zijn er O(log n) lagen Pr[x is in meer dan c log n lagen] = ½ c log n = 1/ n c Kans dat er minstens 1 element is die in meer dan c log n lagen is: Hooguit de som van de kansen per element Dus hooguit n * 1/ n c = 1/n c-1 De rest … zonder bewijs
15 Skip lists Worden soms gebruikt in plaats van binaire bomen Wat makkelijker Operaties als minimum, maximum, successor, predecessor: snel Successor: O(?) In eerste instantie O(log n), maar de tweede successor O(1) Gemiddeld: O(1)
16 Tenslotte Volgende week: Gerard Tel over string matching! Bedankt voor de aandacht