Datastructuren en algoritmen voor CKI

Vergelijkbare documenten
Datastructuren en algoritmen voor CKI

Opgaven Hash Tabellen Datastructuren, 15 juni 2018, Werkgroep.

Datastructuren en algoritmen voor CKI

29 november 2012 Hashing. Een tijd-ruimte afweging Hashfuncties

Datastructuren en Algoritmen

Datastructuren en algoritmen voor CKI

O(1) ZOEKMETHODEN: HASH TECHNIEKEN. Dr. D.P. Huijsmans College 7 16 okt 2013 Universiteit Leiden LIACS

Hoofdstuk 9. Hashing

O(1) ZOEKMETHODEN: HASH TECHNIEKEN. Dr. D.P. Huijsmans 24 okt 2012 Universiteit Leiden LIACS

Hutscodering. De techniek: illustratie. een tabel met 7 plaatsen, genummerd van 0 tot en met 6.

Examen Datastructuren en Algoritmen II

Inleiding Programmeren 2

Tweede Toets Datastructuren 27 juni 2018, , Olympos Hal 2.

Examen Datastructuren en Algoritmen II

Inleiding Programmeren 2

Tweede Toets Datastructuren 29 juni 2016, , Educ-Γ.

Examen Datastructuren en Algoritmen II

Examen Datastructuren en Algoritmen II

Datastructuren en algoritmen voor CKI

Tweede Toets Datastructuren 26 juni 2019, , Educ-β.

Datastructuren Uitwerking jan

Datastructuren en algoritmen voor CKI

Examen Algoritmen en Datastructuren III

Stacks and queues. Hoofdstuk 6

Examen Programmeren 2e Bachelor Elektrotechniek en Computerwetenschappen Faculteit Ingenieurswetenschappen Academiejaar juni 2011

Groepen, ringen en velden

Datastructures. Opdracht 3

Elfde college algoritmiek. 18 mei Algoritme van Dijkstra, Heap, Heapify & Heapsort

String Matching. Algoritmiek

Indexen.

Examen Programmeren 2e Bachelor Elektrotechniek en Computerwetenschappen Faculteit Ingenieurswetenschappen Academiejaar juni, 2010

Stacks and queues. Introductie 45. Leerkern 45. Terugkoppeling 49. Uitwerking van de opgaven 49

Opgaven Abstracte Datastructuren Datastructuren, Werkgroep, 31 mei 2017.

Tweede Toets Datastructuren 28 juni 2017, , Educ-β.

4EE11 Project Programmeren voor W. College 3, , Blok D Tom Verhoeff, Software Engineering & Technology, TU/e

Examen Algoritmen en Datastructuren III

Modelleren en Programmeren

Minimum Opspannende Bomen. Algoritmiek

Bouwstenen voor PSE. Datatypes en Datastructuren

Recursion. Introductie 37. Leerkern 37. Terugkoppeling 40. Uitwerking van de opgaven 40

String Matching. Algoritmiek

SQL datadefinitietaal

Hoofdstuk 5: Functies voor getallen en teksten

Datastructuren en Algoritmen voor CKI

Vierde college algoritmiek. 23/24 februari Complexiteit en Brute Force

De volgende opgave gaat over de B-bomen van het college, waar sleutels zowel in de bladeren als ook in de interne knopen opgeslagen worden.

DATASTRUCTUREN LIJSTEN. Dr. D.P. Huijsmans 12 sept 2012 Universiteit Leiden, LIACS

De wiskunde achter de Bitcoin

Tweede Toets Security 9 november 2016, , Educ-α.

Programmeermethoden NA. Week 6: Lijsten

DATASTRUCTUREN LIJSTEN. Dr. D.P. Huijsmans 2e college Leiden 11 sept 2013 Universiteit Leiden, LIACS

Uitwerking tentamen Analyse van Algoritmen, 29 januari

Modelleren en Programmeren

Elfde college algoritmiek. 10 mei Algoritme van Dijkstra, Gretige Algoritmen

Divide & Conquer: Verdeel en Heers vervolg. Algoritmiek

1 Rekenen met gehele getallen

Examen Datastructuren en Algoritmen II

Elementary Data Structures 3

Het Eindfeest. Algoritmiek Opgave 6, Voorjaar

Elliptische krommen en digitale handtekeningen in Bitcoin

Programmeren met Arduino-software

Zoek- en sorteeralgoritmen en hashing

Programmeermethoden NA

Inleiding Programmeren 2

Examen Datastructuren en Algoritmen II

recursie Hoofdstuk 5 Studeeraanwijzingen De studielast van deze leereenheid bedraagt circa 6 uur. Terminologie

Inleiding Programmeren 2

Algoritmiek. 2 februari Introductie

RSA. F.A. Grootjen. 8 maart 2002

OPLOSSINGEN VAN DE OEFENINGEN

Een spoedcursus python

Kortste Paden. Algoritmiek

Datastructuren Uitwerking jan

Opgaven Getaltheorie en Cryptografie (deel 4) Inleverdatum: 13 mei 2002

Cover Page. The handle holds various files of this Leiden University dissertation

Examen Datastructuren en Algoritmen II

Examen Datastructuren en Algoritmen II

Examen Algoritmen en Datastructuren III

De symmetrische min-max heap

Getallenrepresenta*e. Processen en Processoren 7 februari 2012

Derde college complexiteit. 7 februari Zoeken

CS 202 Fundamental Structures of Computer Science II Bilkent University Computer Engineering Department

Schriftelijk tentamen Datastructuren Woe 5 jan uur Met uitwerkingen

Rush Hour. Concurrency Opgave 3, Herfst

De cryptografie achter Bitcoin

Opgaven Zoekbomen Datastructuren, 20 juni 2018, Werkgroep.

REKENTECHNIEKEN - OPLOSSINGEN

Algoritmes en Priemgetallen. Hoe maak je een sleutelpaar voor RSA?

OEFENINGEN PYTHON REEKS 1

Kortste Paden. Algoritmiek

Getaltheorie groep 3: Primitieve wortels

Public Key Cryptography. Wieb Bosma

Als een PSD selecties bevat, deelt de lijn van het programma zich op met de verschillende antwoorden op het vraagstuk.

Het programma ELGAMAL

5 Afronden en afkappen

Datastructuren. Analyse van algoritmen. José Lagerberg. FNWI, UvA. José Lagerberg (FNWI, UvA) Datastructuren 1 / 46

Opgaven Heaps Datastructuren, 8 juni 2018, Werkgroep.

1 Rekenen in eindige precisie

Negende college algoritmiek. 15 april Dynamisch Programmeren

Bijzondere kettingbreuken

Transcriptie:

Datastructuren en algoritmen voor CKI Jeroen Bransen 1 2 oktober 2015 1 met dank aan Hans Bodlaender en Gerard Tel

Priority queue

Priority queue ADT insert(q, x): voeg element x toe aan de queue maximum(q): geeft element met maximum key extract-max(q): haalt element met maximum waarde uit de queue en geeft deze terug increase-key(q, x, k): verhoog de key van element x naar de nieuwe waarde k Efficiente implementatie met heap

Voorbeeldprobleem We lange plank die in stukken gezaagd moet worden De stukken moeten lengte a 1.. a n hebben Totale lengte van plank is precies n i=1 a i Zagerij rekent x euro voor het doorzagen van plank van lengte x (ongeacht waar de zaagsnede zit) Op welke volgorde moeten we onze plankjes laten zagen zodat het zo goedkoop mogelijk is?

Woordenboeken (dictionaries)

Woordenboeken (dictionaries) Dynamische verzameling Mapping van sleutel (key) naar waarde (value) Bijvoorbeeld: cijferlijst is mapping van studentnummer naar cijfer Sleutel en waarde kunnen vanalles zijn In Java heet dit Map, in C heet het Dictionary

Woordenboek ADT x is element met veld x.key insert(t, x): voeg element x toe aan woordenboek delete(t, x): verwijder element x uit woordenboek search(t, k): zoek element met sleutel k op

Directe addressering Stel onze sleutelwaardes zijn integers Dan kunnen we sleutel gebruiken als array-index Array element bevat dan bijbehorende waarde

Directe addressering Introduction to Algorithms, Fig 11.1

Directe addressering direct-address-insert(t, x) 1 T [x.key] = x direct-address-delete(t, x) 1 T [x.key] = nil direct-address-search(t, k) 1 return T [k]

Problemen met directe addressering Wat als keys heel groot kunnen worden? We hebben geen oneindig groot geheugen Veel gevallen maar een klein deel van de keys gebruikt

Hashtabellen

Hashtabel Stel onze sleutels komen uit verzameling U (universe) Hash functie h : U {0, 1,.., m 1} Hashtabel T [0.. m 1] Element met sleutel k slaan we op in T [h(k)]

Hashtabel Stel onze sleutels komen uit verzameling U (universe) Hash functie h : U {0, 1,.., m 1} Hashtabel T [0.. m 1] Element met sleutel k slaan we op in T [h(k)] Voorbeeld hashfunctie: h(k) = k mod m

Hashtabel Introduction to Algorithms, Fig 11.2

Botsingen (collisions) Wat als h(k a ) == h(k b )? We bespreken twee oplossingen: Een keten maken (chaining), met op elke index een linked list Op een andere plek zetten (open addressing)

Hashtabel met ketens (chaining)

Ketens (chaining) Introduction to Algorithms, Fig 11.3

Ketens (chaining) chained-hash-insert(t, x) 1 voeg x toe aan begin van lijst T [h(x.key)] chained-hash-delete(t, x) 1 verwijder x uit lijst T [h(x.key)] chained-hash-search(t, k) 1 zoek element met sleutel k in lijst T [h(k)]

Looptijd chained-hash-insert: O(1) chained-hash-delete en chained-hash-search: O(1 + lengte(t [h(k)]))

Looptijd chained-hash-insert: O(1) chained-hash-delete en chained-hash-search: O(1 + lengte(t [h(k)])) In het slechtste geval zijn alle h(k) gelijk: Θ(n)

Verwachte looptijd met ketens

Aanname We gaan uit van perfecte hashfunctie Kans op elk van de m waardes gelijk Kans dat sleutel k in specifieke waarde uitkomt is dus 1/m

Analyse Hashtabel met m posities waar n elementen in zitten Load factor noemen we α = n/m α geeft dus gemiddeld aantal elementen per positie

Lijstlengtes Lijst op positie i heeft lengte n i n = n 1 + n 2 + n 3 +.. + n m E[n i ] = α

Verwachte looptijd Opzoeken in linked list met n elementen kost O(n) Verwachte tijd voor delete/search in hashtabel is dus O(1 + α)

Hashfuncties

Perfecte hashfunctie Gelijke kans op elk van de m plekken Hangt af van verdeling van alle sleutels Weten we meestal niet Perfecte hashfunctie kunnen we dus bijna nooit maken

Perfecte hashfunctie Gelijke kans op elk van de m plekken Hangt af van verdeling van alle sleutels Weten we meestal niet Perfecte hashfunctie kunnen we dus bijna nooit maken Uitzondering: uniforme verdeling van 0 k < 1 h(k) = mk

Goede hashfuncties Verdeeld sleutels zo goed mogelijk Minimaliseert kans dat sleutels die op elkaar lijken gelijke hash hebben Bijvoorbeeld: variabelenamen uit een programma, zowel pt als pts Hangt niet af van patronen in invoer

Aannames Alle sleutels zijn natuurlijke getallen ({0, 1, 2,..}) Alle data kan worden uitgedrukt als een getal Bijvoorbeeld: de String pt Characters kun je uitdrukken als hun ASCII waarde (p = 112 en t = 116) String is een grondtal-128 getal pt = (112 128) + 116 = 14452

Division method Neem de rest na deling door m (modulo) h(k) = k mod m

Division method Neem de rest na deling door m (modulo) h(k) = k mod m Slechte waardes voor m: m = 2 p (dat geeft laatste p bits van k) m = 2 p 1 bij een String in grondtal 2 p (dan geeft andere volgorde van zelfde karakters zelfde waarde)

Division method Neem de rest na deling door m (modulo) h(k) = k mod m Slechte waardes voor m: m = 2 p (dat geeft laatste p bits van k) m = 2 p 1 bij een String in grondtal 2 p (dan geeft andere volgorde van zelfde karakters zelfde waarde) Goede waardes voor m: Priemgetal niet te dicht bij een 2-macht Bijvoorbeeld n = 2000, met 8-bit Strings m = 701 is goede keus Priemgetal, niet dichtbij 2-macht, en is ongeveer 2000/3 dus gemiddeld 3 stappen Hashfunctie is dan dus h(k) = k mod 701

Multiplication method Neem constante A (0 < A < 1) Vermenigvuldig de key met A Neem daarvan deel achter de komma En vermenigvuldig dat met m en rond naar beneden af

Multiplication method Neem constante A (0 < A < 1) Vermenigvuldig de key met A Neem daarvan deel achter de komma En vermenigvuldig dat met m en rond naar beneden af Dus: h(k) = m(ka mod 1) Waarbij ka mod 1 = ka ka

Multiplication method Voordeel: waarde van m maakt niet uit voor effectiviteit m = 2 p kan handig zijn voor implementatie Niet alle waardes van A werken even goed A ( 5 1)/2 = 0.6180339887.. werkt vaak goed