160 likes | 288 Views
Datastructuren Een informele inleiding tot Skiplists. Onderwerp 13. Skiplists. Vrij eenvoudige datastructuur “Makkelijker” dan gebalanceerde bomen Kunnen hetzelfde als gebalanceerde bomen Makkelijkste versie: “verwachtte tijd even snel als gebalanceerde bomen”
E N D
DatastructurenEen informele inleiding tot Skiplists Onderwerp 13
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
Operaties: • Zoek-Element • Minimum • Maximum • Volgende • Vorige • Insert • Delete • Kunnen allemaal goed gedaan worden met skiplists
Eerst maar eens:“een gewone dubbelgelinkte lijst” 2 3 5 7 11 13 Alles in O(n) in het slechtste geval…
Toevoegen van “snelweg” 2 7 13 23 2 3 5 7 11 13 17 23
Zoeken met de snelweg • “Loop eerst over de snelweg, totdat je te ver zou gaan, en ga dan door de gewone lijst”
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 n1/2zet dan krijg je ‘t best mogelijke (op factor 2 na)
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)
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 krknopen hebben op de onderste laag • n £ kr 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
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?
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
Kinestetische leerervaring? • Voorbeeldje uitproberen
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…
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/ nc • Kans dat er minstens 1 element is die in meer dan c log nlagen is: • Hooguit de som van de kansen per element • Dus hooguit n * 1/ nc = 1/nc-1 • De rest … zonder bewijs
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)
Tenslotte • Volgende week: Gerard Tel over string matching! • Bedankt voor de aandacht