Datastructuren en Algoritmen

Slides:



Advertisements
Verwante presentaties
Sudoku puzzels: hoe los je ze op en hoe maak je ze?
Advertisements

Algoritmen en Datastructuren (ALDAT)
Hogeschool HZ Zeeland 19 augustus 2003augustus 2003 Data Structuren & Algoritmen Week 1.
Algoritmische problemen Onbeslisbaar / niet-berekenbaar Geen algoritme mogelijk Tegel- of domino-problemen Woordcorrespondentie-probleem Syntactisch equivalentie.
Datastructuren Quicksort
Practica Computerlinguistiek Tekst en uitleg:
1 Hashtabellen Datastructuren. 2 Dit onderwerp Direct-access-tabellen Hashtabellen –Oplossen van botsingen met “ketens” (chaining) –Analyse –Oplossen.
Datastructuren Analyse van Algoritmen en O
Datastructuren Analyse van Algoritmen en O
1 Tentamen 21 januari 2008 uitleg Algemene kennisvragen a)“Wat verstaan we onder de complexiteit van een algoritme?” –Cruciaal: wat gebeurt er met.
Hoofdstuk 6: Controle structuren
1 Datastructuren Sorteren: alleen of niet alleen vergelijkingen College 5.
1 Datastructuren Lijstjes (Stacks & Queues) Onderwerp 7.
Fibonacci & Friends Met dank aan Gerard Tel.
Datastructuren Zoekbomen
1 Datastructuren Heapsort College 4. 2 Vandaag  Kort: ADT vs Datastructuur  Heaps en Heapsort  Tijd over: ondergrenzen voor sorteren; nog sneller sorteren.
1 Datastructuren Zoekbomen II Invoegen en weglaten.
Datastructuren en Algoritmen
Datastructuren en Algoritmen Datastructuren college 1.
1 Datastructuren Sorteren: alleen of niet alleen vergelijkingen (II) College 6.
1 Eerste deeltentamen Datastructuren. Stof Alle stof tot en met Lijsten, Stacks en Queues Inclusief werkcollegeopgaven Vragen kunnen komen over: –O-notatie.
Parallelle Algoritmen String matching. 1 Beter algoritme patroonanalyse Bottleneck in eenvoudig algoritme: WITNESS(j) (j = kandidaat in eerste i-blok)
Inleidend probleem Data structuur (hiërarchie van classes)
1 Datastructuren Quicksort en andere sorteermethoden College 3.
1 Datastructuren Skiplists. 2 Skiplists  Vrij eenvoudige datastructuur  “Makkelijker” dan gebalanceerde bomen  Kunnen hetzelfde als gebalanceerde bomen.
1 Optuigen van datastructuren 2 Dynamische order statistics (2)
Optuigen van datastructuren
Datastructuren Sorteren: bubble, merge, quick
1 Datastructuren Heapsort (2e deel) College 5. 2 Vandaag  Heaps en Heapsort  (eind)  Nog sneller sorteren:  Ondergrenzen  Linair sorteren.
Datastructuren Sorteren, zoeken en tijdsanalyse
Werkverslag. Inhoudsopgave Pag.1 wat hebben we gedaan in deze lessen?
Optuigen van datastructuren Datastructuren Onderwerp 11.
Datastructuren Sorteren, zoeken en tijdsanalyse
1 Datastructuren Een informele inleiding tot Skiplists Onderwerp 13.
Hashtabellen Datastructuren. 2 Dit onderwerp Direct-access-tabellen Hashtabellen –Oplossen van botsingen met “ketens” (chaining) –Analyse –Oplossen van.
Sorteeralgoritmen. Sorteren: aanpak 1 Hoe ga je een rij getallen sorteren met PC? Sorteren door selectie (= selection sort): Zoek de kleinste waarde Sorteer.
Quiz Start.
MET DANK AAN COLLEGA’S IN DEN LANDE ! vee 2012
Algoritme Inhoud: Definitie algoritme Recursieve algoritmes Opgaven
Programmeren met If This Then That (IFTTT)
T U Delft Parallel and Distributed Systems group PGS Fundamentele Informatica in345 Deel 2 College 6 Cees Witteveen.
Vervolg C Hogeschool van Utrecht / Institute for Computer, Communication and Media Technology 1 Onderwerpen voor vandaag top-down decompositie Opdrachten:
1 Datastructuren Quicksort College 3. 2 Vorige keren  O-notaties  Sorteren: insertion sort, bubble sort  Kosten (n 2 ) tijd in het slechtste geval.
1 Hashtabellen Datastructuren. 2 Dit onderwerp Direct-access-tabellen (vorige keer) Hashtabellen –Oplossen van botsingen met “ketens” (chaining) Vorige.
1 Datastructuren Sorteren, zoeken en tijdsanalyse College 2.
1 Datastructuren Analyse van algorithmen (vervolg) Heapsort College 4.
1 PI1 week 9 Complexiteit Sorteren Zoeken. 2 Complexiteit van algoritmen Hoeveel werk kost het uitvoeren van een algoritme (efficiëntie)? –tel het aantal.
Hoorcollege 1: efficiëntie en complexiteitsontwikkeling.
Hoorcollege 1: efficiëntie en complexiteitsontwikkeling.
Les 3 - Operators Workshop Php Basic. ICT Academy Php Basic Content Operators Wiskundig Toewijzing Vergelijking.
Woordjes leren.
Amorized Analysis en Union-Find Algoritmiek. 2 Vandaag Amortized analysis –Technieken voor tijdsanalyse van algoritmen Union-find datastructuur –Datastructuur.
Minimum Opspannende Bomen Algoritmiek. 2 Inhoud Het minimum opspannende bomen probleem Een principe om een minimum opspannende boom te laten groeien Twee.
Algoritmiek 2015 / 2016 Algoritmiek1. Waarom dit vak? Omdat –Mensen ongeduldig zijn … –Het belangrijk is dat antwoorden (van berekeningen door computers)
Doorzoeken van grafen Algoritmiek. Algoritmiek: Divide & Conquer2 Vandaag Methoden om door grafen te wandelen –Depth First Search –Breadth First Search.
Heuristieken en benaderingsalgoritmen Algoritmiek.
Divide & Conquer: Verdeel en Heers vervolg Algoritmiek.
Datastructuren voor grafen Algoritmiek. 2 Grafen Model van o.a.: –Wegennetwerk –Elektrische schakeling –Structuur van een programma –Computernetwerk –…
Gerandomiseerde algoritmes
Doorzoeken van grafen Algoritmiek.
Datastructuren voor graafrepresentatie
Minimum Opspannende Bomen
Amorized Analysis en Union-Find
Wij zijn FLEX Finn Megan Anouk Nina
Zeeslag Bron: csunplugged.org / csunplugged.nl.
Slim tellen.
Tellen met kaarten.
Slim tellen.
Tellen met kaarten.
Python – For loop + strings
Transcript van de presentatie:

Datastructuren en Algoritmen Datastructuren college 1

Vandaag Organisatie vak Wat en waarom: datastructuren en algoritmen Voorbeelden van datastructuren en algoritmen Binary search Analyse van algoritmen 1 Datastructuren

Docent Hans Bodlaender Hoofddocent, vakgebied: Algoritmiek – netwerken en grafen Kamer 5.03, BBL 030-2534409 hansb @cs.uu.nl Spreekuren: Maandagochtend Donderdagmiddag Datastructuren

Onderdelen College: zeer belangrijk (powerpoints komen op website) Werkcollege: onmisbaar 1e deeltentamen: ongeveer helft stof, 35% eindcijfer 2e deeltentamen: andere helft stof, 40% eindcijfer Practicum: zeven programmeeropgaven: domjudge systeem; elk telt even zwaar, moet voldoende zijn Eindcijfer: 35% eerste deeltentamen, 40% tweede deeltentamen, 25% practicum Practicum moet voldoende zijn (4 uit 7 gehaald) Werkcollege: semi-verplicht Geen herkansing/aanvullende toets als je meer dan drie keer afwezig was Datastructuren

Werkcollege ONMISBAAR! Verplicht: nodig voor recht op aanvullende toest Maar nog veel nodiger voor het beheersen van dit vak! Actieve deelname wordt genoteerd Vijf groepen Start hierna Indeling: zoek zelf een zaal Print zelf je opdrachten (er zijn een paar papieren exemplaren aanwezig)

Werkcollegegroepen Maandag en donderdag zaal BBL 069 Maandag zaal BBL 165 Donderdag zaal BBL 169 Maandag zaal BBL 023 Donderdag zaal BBL 205 Maandag zaal BBL 061 Donderdag zaal BBL 083

Practicum Begin op tijd Maak het werk alleen. Fraude wordt gemeld aan de examencommissie  Opgaven staan op website van vak Inleveren via domjudge systeem Java of C# Zeven opdrachten Latere opdrachten zijn wat lastiger dan eerdere Ieder telt even zwaar Opdracht is: Gehaald (10) of Niet Gehaald (0). Datastructuren

Becijfering practicum Meestal zal een ingeleverd programma dat door domjudge geaccepteerd wordt een 10 opleveren voor dat programma Er is echter nog een laatste inspectie, waarbij gekeken wordt of aan de opdracht is voldaan Je kan echter zelf wel “aanvoelen” of er een probleem is Voorbeelden waarin een gehaald in een niet gehaald kan veranderen: Opgave 2 vraagt om randomized quicksort, maar je gebruikt mergesort: Je gebruikt een java-library voor sorteren, terwijl gebruik van zo’n library niet is toegestaan Het is goed te doen om een 10 te halen voor het practicum

Practicum Systeem weigert inzendingen die: Niet compileren Op geheime testinvoeren foute uitvoer geven Op geheime testinvoeren te langzaam zijn Niet in Java of C# geschreven zijn En vertelt welk van deze redenen voor je programma geldt Als geweigerd: verbeter je programma en probeer opnieuw tot het werkt! Je leert ook belangrijke algoritmen en datastructuren: helpt (bij je latere carrière en bij het tentamen) Extra uitleg straks om 10.30 door Rob Franken Vragen: Rob of Steven

Belangrijk Merk op: je moet het practicum alleen doen!!!! Dus niet in groepjes van 2 personen Fraude en plagiaat wordt streng bestraft EN gemeld aan de examencommissie Vragen over practicum: Inhoudelijk: op werkcollege Organisatie: Steven Woudenberg en Rob Franken

Programmeerwedstrijd Georganiseerd door A-Es2 Leuk! Spannend! Leerzaam! Bonuspunten (tot 0.6 als voldoende, tot 0.2 voor recht op herkansing) Je kan wat winnen! Dinsdagmiddag 21 juni 1 – 5 uur

Herkansingsregelingen Toets: Herkansing midden in de zomer (vanwege BSA) Alleen als je niet te vaak afwezig was op werkcollege EN Minstens een 4 hebt gehaald voor gewogen gemiddeld tentamen Practicum gehaald Practicum: Verzwaarde achtste opdracht Alleen als je niet te vaak afwezig was op werkcollege EN Een voldoende hebt EN Precies 3 opdrachten gehaald hebt van practicum 

Data 1e deeltentamen: 30 mei 2e deeltentamen: 7 juli (!) Programmeermiddag A-Es2 : 21 juni 13-17 uur Aanvullende toets (“hertentamen”): 15 augustus (zo vroeg vanwege BSA) Practicum: bijna wekelijkse deadlines, meestal op woensdag 23.59 uur 1e deadline (“binary search”: levelzoeker): woensdag 11 mei, 23.59 uur

Diagnostische toetsen In sommige werkcolleges wordt een diagnostische toets gehouden Soort minitentamen, wat je zelf nakijkt, aan de hand van wat de werkcollegeleiding op bord voordoet Telt niet mee voor cijfer, maar laat jezelf zien hoeveel van de stof je snapt/kan

Of tijdens het werkcollege Vragen stellen In het college In de pauze en na afloop Docent Ja Buurman Nee Of tijdens het werkcollege Datastructuren

Vragen Over de stof: Gedurende het college (domme vragen bestaan niet) aan docent In de pauze of na afloop van het college Aan werkcollegeleiders of studentassistenten in het werkcollege Over het practicum Per email aan de practicumleider (Steven Woudenberg) In het werkcollege aan de practicumleider of werkcollegeleiders Over de werkcollegeopgaven In het werkcollege Over de tentamens en cijfers Aan docent: pauze, na afloop college, email, telefoon Datastructuren

Rondvraag? Vragen over de organisatie? Collegeresponsgroep?

Algoritmen en datastructuren: waarom? Iedereen is ongeduldig, want we willen Dat onze routeplanner snel vertelt welke kant we opmoeten (en niet pas nà het kruispunt) Vloeiende beelden in het computerspel Niet een eeuw (of een week) wachten op de planning voor morgen … Dus: de computer moet alles snel uitrekenen Hoe doet ie dat? Met een goed algoritme en een goede datastructuur! Datastructuren

Algoritme Methode om iets uit te rekenen – vgl. recept uit kookboek Naam komt van Muḥammad ibn Mūsā Abū Ǧa’far al-Ḫawārazmī Of: Al-Khwarizmi Schreef boek in 820 over oplossen van lineaire en kwadratische vergelijkingen (“Algebra”) Misvatting van vertaler die titel en auteur door elkaar haalde Datastructuren

Datastructuur Manier om gegevens op te slaan (in computer) Helpt om algoritmen sneller te maken In dit college zullen we allerlei belangrijke datastructuren bekijken Hoe zitten ze in elkaar? Hoe werken algoritmen op/met deze datastructuren? Hoe snel gaat dit? Datastructuren

Algoritmisch Wedstrijdje Wat is de missende kaart? Twee vrijwilligers gezocht! Datastructuren

Voorbeelden van algoritmische vragen Sorteren van rij getallen Uitrekenen van oplossing wiskundig probleem Berekenen van kortste route in netwerk Zoeken van relevante webpagina’s bij een zoekterm (zoekmachine) Compileren van C++-programma Tonen van 2d-afbeelding aan de hand van 3d-model In dit vak maken we een begin met de theorie. Veel van deze vragen komen in andere/vervolgvakken aan de orde! Datastructuren

Onderwerpen uit dit vak Analyse van algoritmen Gelinkte lijsten; stacks & queues Sorteren (op allerlei manieren) Bomen: zoeken, doorlopen; binaire bomen; snelle zoekbomen Dictionaries; Maps Hashing Priority queues Tries … Datastructuren

Analyse van algoritmen (en datastructuren) Twee vragen: Is het correct? Hoeveel tijd gebruikt het? Meten we in stappen O-notatie wordt veel gebruikt Als ‘t vandaag wat vaag is: we moeten beginnen met wat (saaie) theorie; de leuke* algoritmen en datastructuren komen straks *= vind ik Datastructuren

Beschrijven van algoritmen met Pseudocode Pseudocode: niet echt een programmeertaal Lijkt wat op code in een imperatieve taal Waarom pseudocode: Echte programmeertaal: veel extra commando’s die begrip verduisteren Natuurlijke taal: niet precies genoeg Niet zo moeilijk om te zetten naar code in Java, C++, C#, Pascal, … Imperatief versus functioneel: Sommige behandelde algoritmen/datastructuren makkelijk om te vormen naar functionele taal; soms is dat lastiger Datastructuren

Probleem 1: Zoeken in een rij Ook nuttig voor practicumopgave 1 Gegeven: array A[1 … n] met n getallen, een waarde x Gevraagd: Zit x in het array en zo ja, op welke positie?

Voorbeeld Pseudocode: zoek een element in een array ZOEK-ELEMENT(x,A) {Input: Een element x en een array A (A loopt van 1 tot lengte(A))} {Output: Een index i zodat A[i] = x of 0 als geen element in A gelijk is aan x} i = 1; while i £ lengte(A) do if (x = = A[i]) then return i else i = i + 1; endif enddo; return 0 Datastructuren

Over dit algoritme Als het element er niet in zit moet je n vergelijkingen doen Als het element er wel in zit: In het slechtste geval: n vergelijking In het beste geval: 1 vergelijking Gemiddeld ongeveer n/2 vergelijkingen Kan beter door gebruik te maken van sortering: binary search

Binary search Als de rij getallen gesorteerd is kan het sneller met een simpel maar belangrijk principe: binary search Dus: neem aan: A[1] £ A[2] £ A[3] £ … £ A[n-1] £ A[n]

Binary search Idee: houdt twee variabelen bij onder en boven, zodat x, als x in A zit, “tussen” onder en boven zit Invariant: als er een i is met A[i] == x, dan onder £ i £ boven

Tijd van binary search Iedere keer wordt het stuk waar je kijkt ongeveer half zo lang Je kan log n (grondtal 2) keer doormidden delen en dan heb je een stuk van lengte 1 Dus O(log n) stappen Nette wiskundige analyse komt later

Pseudocode {Input: Gesorteerde array A[1 … n] , element x} {Output: index i met A[i] == x, and 0 als zo’n i niet bestaat} onder = 1; boven = n; while (onder < boven) do mid = ë (onder+boven)/2 û ; if (A[mid] < x) then onder = mid+1 else boven = mid if (A[onder] == x) then return onder else return 0 (zit er niet in)

Sorteren Gegeven: een rij van n getallen (a1, … , an) Gevraagd: een permutatie van de input (a’1, … , a’n) zodat a’1 £ a’2 £ … £ a’n Kan natuurlijk ook met andersoortige geordende objecten (bijv. verzameling woorden die gealfabetiseerd moeten worden). Datastructuren

Insertion sort Sorteeralgoritme, met volgende idee: Voeg steeds één element toe op de goede plek We hebben een steeds groter goedgesorteerd deel Array A loopt van 1 t/m lengte(A) INSERTION-SORT(A) for j = 2 to lengte(A) do key = A[j] {voeg A[j] op de goede plek in} i = j – 1; while i > 0 and A[i] > key do A[i+1] = A[i] {schuif eentje op} i = i – 1; A[i+1] = key Datastructuren

Idee van Insertion Sort INSERTION-SORT(A) for j = 2 to lengte(A) do key = A[j] {voeg A[j] op de goede plek in} i = j – 1; while i > 0 and A[i] > key do A[i+1] = A[i] {schuif eentje op} i = i – 1; A[i+1] = key Eerst is rijtje met alleen eerste element goed gesorteerd: (A[1]) Loop doet: van 2 tot eind: stop A[j] op de goede plek Zo: bewaar A[j]; van j naar voren, schuif steeds element eentje naar achter tot we op de plek komen waar A[i] moet staan Datastructuren

Correctheid van Insertion Sort 1 INSERTION-SORT(A) for j = 2 to lengte(A) do (*) key = A[j] {voeg A[j] op de goede plek in} i = j – 1; while i > 0 and A[i] > key do A[i+1] = A[i] {schuif eentje op} i = i – 1; A[i+1] = key Bewijs correctheid met loop-invariant: Als we bij (*) zijn, dan heeft het deelarray A[1 … j – 1] dezelfde elementen als oorspronkelijk in A[1 … j – 1], maar in gesorteerde volgorde Stap 1 van het bewijs: de loopinvariant geldt initieel Datastructuren

Correctheid van Insertion Sort 2 INSERTION-SORT(A) for j = 2 to lengte(A) do (*) key = A[j] {voeg A[j] op de goede plek in} i = j – 1; while i > 0 and A[i] > key do A[i+1] = A[i] {schuif eentje op} i = i – 1; A[i+1] = key (**) Als we bij (*) zijn, dan heeft het deelarray A[1 … j – 1] dezelfde elementen als oorspronkelijk in A[1 … j – 1], maar in gesorteerde volgorde Stap 2 van het bewijs: als de loopinvariant geldt voordat we de loop ingaan, dan geldt als we bij (**) zijn: Het deelarray A[1 … j] bevat dezelfde elementen als oorspronkelijk in A[1 … j], maar in gesorteerde volgorde Dus blijft invariant geldig Datastructuren

Correctheid van Insertion Sort 3 INSERTION-SORT(A) for j = 2 to lengte(A) do (*) key = A[j] {voeg A[j] op de goede plek in} i = j – 1; while i > 0 and A[i] > key do A[i+1] = A[i] {schuif eentje op} i = i – 1; A[i+1] = key (**) Stap 3 van het bewijs: nu geldt invariant voor j = lengte(A)+1, dwz.: Het deelarray A[1 … lengte(A)] bevat dezelfde elementen als oorspronkelijk in A[1 … lengte(A)], maar in gesorteerde volgorde Algoritme doet wat we willen Datastructuren

Tijdsanalyse Tijd van een algoritme: hangt meestal af van: De implementatie (code, taal, compiler, …) De machine En de input Maar meestal kunnen we toch die tijd goed analyseren Langzaam algoritme blijft langzaam op langzame computer … Conventies: O-notatie om wat implementatieaspecten te onderdrukken Tellen van alle basisoperaties als 1 stap Kijken naar slechtste (of: gemiddelde en heel soms beste) geval Datastructuren

Basisoperaties Tijd onafhankelijk van compiler en machine (afhankelijk van programma en van input): Tel de basisoperaties: rekenkundige operatie op integer, Boolean, character; assignatie aan getal, boolean, character,reference (pointer) doorlopen van een reference naar de inhoud ervan indexberekening van een array het pakken van een veld uit een record/structure parameter overdracht bij aanroep function, methode Zo tel je: hoeveel operaties doet algoritme op een bepaalde input Formeel: Random Access Machine model Datastructuren

Optimisten en pessimisten Analyse: Slechtste geval? Beste geval? Gemiddelde geval?

Is algoritmische analyse iets voor pessimisten? Meest gebruikelijke analyse: Stel we hebben een input van lengte n Wat is het maximum aantal operaties dat ons algoritme kan doen? Worst case – slechtste geval Datastructuren

Optimisten en gewone mensen Wat is het gemiddelde aantal operaties dat ons algoritme kan doen over alle mogelijke inputs van lengte n Average case – gemiddelde geval Probleempjes: vaak moeilijk om uit te rekenen; wat is eigenlijk de kansverdeling over de inputs (komen alle inputs even vaak voor als mogelijke input???)? Wat is het minimum aantal operaties dat ons algoritme kan doen op inputs van lengte n? Best case – beste geval (meestal niet zo interessant, behalve voor aartsoptimisten)

Twee technieken voor tijdsanalyse Tel van elke basisoperatie hoe vaak deze wordt uitgevoerd Analyseer de loopstructuur van je algoritme van binnen naar buiten Geavanceerdere technieken bestaan ook Analyse van recursieve algoritmen met recurrente betrekkingen … Datastructuren

Analyse van ZOEK-ELEMENT ZOEK-ELEMENT(x,A) {Input: Een element x en een array A (A loopt van 1 tot lengte(A))} {Output: Een index i zodat A[i] = x of 0 als geen element in A gelijk is aan x} i = 1; while i £ lengte(A) do if (x == A[i]) then return i else i = i + 1; endif enddo; return 0 Elke slag van de while-loop doet 6 basisoperaties (of zo), en dit doen we voor elk van de elementen van de array hooguit 1 keer. Dus op een array met n elementen maximaal 6n+2 stappen Notatie: O(n) (leg ik later uit) Best case: O(1); average case: O(n) Datastructuren

Tijdsanalyse van INSERTION-SORT 1 INSERTION-SORT(A) for j = 2 to lengte(A) do (*) key = A[j] {voeg A[j] op de goede plek in} i = j – 1; while i > 0 and A[i] > key do A[i+1] = A[i] {schuif eentje op} i = i – 1; A[i+1] = key (**) Eerst dit: Hoeveel stappen kost één slag van de loop voor een bepaalde waarde van j ? Weer een loop. Elke doorgang door de loop kost iets van 8 elementaire stappen Deze loop gaan we hooguit j keer rond Nog eens 6 operaties buiten de loop Dus 8 j + 6 operaties voor deze slag Datastructuren

Tijdsanalyse van INSERTION-SORT 2 INSERTION-SORT(A) for j = 2 to lengte(A) do (*) key = A[j] {voeg A[j] op de goede plek in} i = j – 1; while i > 0 and A[i] > key do A[i+1] = A[i] {schuif eentje op} i = i – 1; A[i+1] = key (**) Hoeveel stappen kost één slag van de loop voor een bepaalde waarde van j ? 8 j + 6 of minder We doen dit voor j=2, 3, … , tot lengte(A)=n Totaal: constante keer n2 Schrijven we als O(n2) Datastructuren

Tenslotte O-notatie: hoe zit dat nou precies? Zoeken: binary search Volgende keer: O-notatie: hoe zit dat nou precies? Zoeken: binary search Sorteren Datastructuren