Datastructuren en algoritmen voor CKI Jeroen Bransen 1 2 september 2015 1 met dank aan Hans Bodlaender en Gerard Tel
Organisatie
Website Vakwebsite: http://www.cs.uu.nl/docs/vakken/ki2v12009/ Bevat alle slides, opgaven, planning, nieuws, etc. Blackboard: belangrijke aankondigingen (via e-mail), cijfers
Docent Jeroen Bransen
Docent Jeroen Bransen Datastructuren, algoritmen, programmeertalen
Docent Jeroen Bransen Datastructuren, algoritmen, programmeertalen Softwaretechnologie, attributengrammatica s, compilers, functioneel programmeren
Assistenten Geertièn de Vries Jordi Vermeulen
Hoorcollege Woensdag 13.15-15.00 in Ruppert 134 (Science Park) Vrijdag 9.00-10.45 in Drift 25 002 (Binnenstad)
Hoorcollege Woensdag 13.15-15.00 in Ruppert 134 (Science Park) Vrijdag 9.00-10.45 in Drift 25 002 (Binnenstad) Slides komen online, maar college geeft veel meer informatie dan alleen de slides!
Boek Introduction to Algorithms, Third Edition. Thomas H. Cormen, Charles E. Leiserson, Ronald L. Rivest, Clifford Stein. The MIT Press / McGrawHill Book Company, 2009.
Werkcollege Woensdag 15.15-17.00 in Ruppert 134 (Groep 1) Woensdag 17.15-19.00 in Ruppert 134 (Groep 2?) Uitzondering: Woensdag 7 oktober 2015: DDW 1.05 Opgaven maken op papier Zeer goede tentamenvoorbereiding 4 inleveropgaven, mag alleen of in tweetallen (beoordeling G, V of O)
Practicum Vrijdag 11.00-12.45 in KNG80 102 (Groep 1) Vrijdag 13.15-15.00 in KNG80 102 (Groep 2) Programmeeropdrachten zijn individueel Inleveren via DOMjudge (later daarover meer) 7,5 wanneer correct, 2,5 punt voor stijl We gebruiken Java, maar C mag ook
Inspanningsverplichting Minstens 2 van de 4 inleveropgaven voldoende Voor herkansing: Minstens een 4 voor het practicum Minstens een 4 voor het tentamen
Cijferregeling p = (p1 + p2 + p3 + p4 + p5) / 5 bonus = if aantal(g, {h1,h2,h3,h4}) == 4 then 0.5 else if aantal(g, {h1,h2,h3,h4}) == 3 then 0.25 else 0 tt = t + bonus eindcijfer = if p >= 5.5 && tt >= 5.5 then p * 0.6 + tt * 0.4 else minimum(p, tt)
Fraude / plagiaat Wetenschappelijke misleiding, bijvoorbeeld door inleveren van andermans werk op eigen naam
Fraude / plagiaat Wetenschappelijke misleiding, bijvoorbeeld door inleveren van andermans werk op eigen naam Bij vermoeden van fraude of plagiaat eerst gesprek
Fraude / plagiaat Wetenschappelijke misleiding, bijvoorbeeld door inleveren van andermans werk op eigen naam Bij vermoeden van fraude of plagiaat eerst gesprek Wanneer gesprek het vermoeden niet wegneemt: melding aan examencommissie
Fraude / plagiaat Wetenschappelijke misleiding, bijvoorbeeld door inleveren van andermans werk op eigen naam Bij vermoeden van fraude of plagiaat eerst gesprek Wanneer gesprek het vermoeden niet wegneemt: melding aan examencommissie Als examencommissie beslist dat het om fraude of plagiaat gaat:
Fraude / plagiaat Wetenschappelijke misleiding, bijvoorbeeld door inleveren van andermans werk op eigen naam Bij vermoeden van fraude of plagiaat eerst gesprek Wanneer gesprek het vermoeden niet wegneemt: melding aan examencommissie Als examencommissie beslist dat het om fraude of plagiaat gaat: 0 voor de opgave, mogelijk uitsluiting voor het vak
Fraude / plagiaat Wetenschappelijke misleiding, bijvoorbeeld door inleveren van andermans werk op eigen naam Bij vermoeden van fraude of plagiaat eerst gesprek Wanneer gesprek het vermoeden niet wegneemt: melding aan examencommissie Als examencommissie beslist dat het om fraude of plagiaat gaat: 0 voor de opgave, mogelijk uitsluiting voor het vak een berisping
Fraude / plagiaat Wetenschappelijke misleiding, bijvoorbeeld door inleveren van andermans werk op eigen naam Bij vermoeden van fraude of plagiaat eerst gesprek Wanneer gesprek het vermoeden niet wegneemt: melding aan examencommissie Als examencommissie beslist dat het om fraude of plagiaat gaat: 0 voor de opgave, mogelijk uitsluiting voor het vak een berisping bij 2e berisping: jaar schorsing van de UU
Wat mag wel? Overleg zonder code te bekijken: Welke datastructuur zouden we het beste kunnen gebruiken? Ik denk een linked-list! Hmm, ik ga het met een stack proberen. (maar: alles helemaal zelf uitzoeken is leerzamer) (pseudo)code uit boek gebruiken...
Wat mag niet? Code van anderen bekijken Je eigen code aan andere studenten geven/laten zien Code van iemand anders insturen op je eigen account...
Afronding organisatorisch deel Verdere organisatorische vragen?
Algoritmen en datastructuren
Waarom? We zijn ongeduldig
Waarom? We zijn ongeduldig We willen dat onze routeplanner op tijd vertelt dat we af moeten slaan
Waarom? We zijn ongeduldig We willen dat onze routeplanner op tijd vertelt dat we af moeten slaan We verwachten vloeiende beelden bij het afspelen van een video
Waarom? We zijn ongeduldig We willen dat onze routeplanner op tijd vertelt dat we af moeten slaan We verwachten vloeiende beelden bij het afspelen van een video We willen geen dagen/maanden/jaren wachten op het resultaat van een berekening
Waarom? We zijn ongeduldig We willen dat onze routeplanner op tijd vertelt dat we af moeten slaan We verwachten vloeiende beelden bij het afspelen van een video We willen geen dagen/maanden/jaren wachten op het resultaat van een berekening Datastructuren en algoritmen helpen om dingen snel uit te rekenen
Wat? Eerst maar eens Googlen...
Algoritme Methode om iets uit te rekenen (soort van recept) Naam komt van Al-Chwarizmi Schreef in 820 boek over algebra Niet hetzelfde als implementatie
Datastructuur Slimme manier om gegevens op te slaan Helpt om algoritme sneller te maken Datastructuren voor opslaan van verschillende soorten gegevens
Algoritmische vragen Sorteren van rij getallen
Algoritmische vragen Sorteren van rij getallen Oplossen wiskundig vraagstuk
Algoritmische vragen Sorteren van rij getallen Oplossen wiskundig vraagstuk Berekenen van kortste route
Algoritmische vragen Sorteren van rij getallen Oplossen wiskundig vraagstuk Berekenen van kortste route Compileren van een Java-programma
Algoritmische vragen Sorteren van rij getallen Oplossen wiskundig vraagstuk Berekenen van kortste route Compileren van een Java-programma Uitrekenen van ontleedboom voor gegeven grammatica en invoer
Algoritmische vragen Sorteren van rij getallen Oplossen wiskundig vraagstuk Berekenen van kortste route Compileren van een Java-programma Uitrekenen van ontleedboom voor gegeven grammatica en invoer etc.
Analyse van algoritmen Is het correct?
Analyse van algoritmen Is het correct? Hoe lang duurt het
Analyse van algoritmen Is het correct? Hoe lang duurt het Gemeten in stappen
Analyse van algoritmen Is het correct? Hoe lang duurt het Gemeten in stappen Veelgebruikte O-notatie
Analyse van algoritmen Is het correct? Hoe lang duurt het Gemeten in stappen Veelgebruikte O-notatie In het begin wat saai...
Pseudocode Niet echt een programmeertaal, maar lijkt er wel op Onbelangrijke implementatiedetails van programmeertaal zijn verborgen Wel precies genoeg om makkelijk implementatie te maken Imperatieve structuur, maar soms makkelijk naar functionele taal om te zetten
Algoritmisch wedstrijdje Twee vrijwilligers nodig
Zoeken in een rij
Probleem We hebben een rij van n getallen Deze noemen we A 1 tot A n. Vraag: zit getal x in de rij, en zo ja waar? Anders gezegd: is er een i zodat A i = x?
Oplossing 1 zoek-in-rij(x, A) 1 i = 1 2 while i A.length 3 if x == A[i] 4 return i 5 else 6 i = i + 1 7 return 0
Hoe lang duurt het Als het getal er niet in zit n vergelijkingen Slechtste geval: n vergelijkingen Beste geval: 1 vergelijking Gemiddeld: n/2 vergelijkingen Kan beter!
Binair zoeken Aanname: A is gesorteerd Binair zoeken (binary search) zoekt sneller
Idee Bekijk middelste element Als x kleiner is: gooi rechterhelft weg Als x groter is: gooi linkerhelft weg Grootte van de lijst wordt telkens gehalveerd (ongeveer)
Oplossing 2 binair-zoeken(x, A) // Aanname: A oplopend gesorteerd 1 laag = 1 2 hoog = A.length 3 while laag < hoog 4 mid = (laag + hoog)/2 5 if A[mid] < x 6 laag = mid + 1 7 else 8 hoog = mid 9 if A[laag] == x 10 return laag 11 else 12 return 0
Sorteren
Sorteren Invoer: Een rij dingen a 1,..., a n Uitvoer: Een permutatie a 1,..., a n van die rij zodanig dat: a 1 a 2... a n
Insertion sort insertion-sort(a) 1 for j = 2 to A.length 2 key = A[j] 3 / Voeg A[j] aan de gesorteerde rij A[1.. j 1] toe 4 i = j 1 5 while i > 0 and A[i] > key 6 A[i + 1] = A[i] 7 i = i 1 8 A[i + 1] = key
Loop invariant 1. Initialization: Aan het begin waar? 2. Maintenance: Als het klopt aan het begin van een iteratie, is het dan ook waar aan het begin van volgende iteratie? 3. Termination: Als de invariant aan het einde waar is, helpt het ons om correctheid (of andere eigenschap) aan te tonen.
Correctheid insertion-sort(a) 1 for j = 2 to A.length // Invariant: A[1.. j 1] is gesorteerd 2 key = A[j] // en bevat nog dezelfde elementen 3 i = j 1 4 while i > 0 and A[i] > key 5 A[i + 1] = A[i] 6 i = i 1 7 A[i + 1] = key
Correctheid insertion-sort(a) 1 for j = 2 to A.length // Invariant: A[1.. j 1] is gesorteerd 2 key = A[j] // en bevat nog dezelfde elementen 3 i = j 1 4 while i > 0 and A[i] > key 5 A[i + 1] = A[i] 6 i = i 1 7 A[i + 1] = key Initialization: Waar aan het begin want A[1.. 1] is gesorteerd
Correctheid insertion-sort(a) 1 for j = 2 to A.length // Invariant: A[1.. j 1] is gesorteerd 2 key = A[j] // en bevat nog dezelfde elementen 3 i = j 1 4 while i > 0 and A[i] > key 5 A[i + 1] = A[i] 6 i = i 1 7 A[i + 1] = key Maintenance: Als we A[j] toevoegen aan A[1.. j 1] op de goede plek blijft de sortering intact
Correctheid insertion-sort(a) 1 for j = 2 to A.length // Invariant: A[1.. j 1] is gesorteerd 2 key = A[j] // en bevat nog dezelfde elementen 3 i = j 1 4 while i > 0 and A[i] > key 5 A[i + 1] = A[i] 6 i = i 1 7 A[i + 1] = key Termination: De loop stopt wanneer j A.length + 1, dus dan zegt de invariant dat A[1.. A.length] gesorteerd is. Precies wat we wilden!
Tijdsanalyse
Tijdsanalyse Hoe lang duurt het? Berekeningstijd hangt af van vele factoren, aantal stappen niet We tellen basisoperaties als 1 stap Kijken naar orde van grootte van slechtste (of gemiddelde of heel soms beste) geval
Basisoperaties Rekenkundige operaties Variabeletoekenning Velden van een object uit het geheugen ophalen Element uit array lezen Parameters aan functies meegeven...
Analyse Meestal meer stappen bij grotere invoer We drukken berekeningstijd (runtime) uit in termen van invoergrootte Bijvoorbeeld: sorteren heeft als invoer een lijst van lengte n Maar: twee lijsten van lengte n kunnen nog heel verschillend zijn
Optimisten en pessimisten Slechtste geval Pessimisten Meest gebruikelijk Hoeveel stappen doet het algoritme maximaal bij invoer van grootte n?
Optimisten en pessimisten Slechtste geval Pessimisten Meest gebruikelijk Hoeveel stappen doet het algoritme maximaal bij invoer van grootte n? Gemiddeld geval Lastig uit te rekenen: hoe vaak komt elke invoer voor? Kansrekening nodig Soms gebruikt
Optimisten en pessimisten Slechtste geval Pessimisten Meest gebruikelijk Hoeveel stappen doet het algoritme maximaal bij invoer van grootte n? Gemiddeld geval Lastig uit te rekenen: hoe vaak komt elke invoer voor? Kansrekening nodig Soms gebruikt Beste geval Optimisten Niet zo interessant
Aantal stappen Tel aantal basisoperaties In een loop: vermenigvuldig met aantal loopiteraties Werk bij loops van binnen naar buiten Bij recursie: recurrente betrekkingen oplossen (later)
Slechtste geval zoek-in-rij zoek-in-rij(x, A) 1 i = 1 2 while i A.length 3 if x == A[i] 4 return i 5 else 6 i = i + 1 7 return 0
Slechtste geval zoek-in-rij zoek-in-rij(x, A) 1 i = 1 // A met lengte n 2 while i A.length 3 if x == A[i] 4 return i 5 else 6 i = i + 1 7 return 0
Slechtste geval zoek-in-rij zoek-in-rij(x, A) 1 i = 1 // A met lengte n 2 while i A.length // n keer 3 if x == A[i] 4 return i 5 else 6 i = i + 1 7 return 0
Slechtste geval zoek-in-rij zoek-in-rij(x, A) 1 i = 1 // A met lengte n 2 while i A.length // n keer 3 if x == A[i] // 6 stappen in loop 4 return i 5 else 6 i = i + 1 7 return 0
Slechtste geval zoek-in-rij zoek-in-rij(x, A) 1 i = 1 // A met lengte n 2 while i A.length // n keer 3 if x == A[i] // 6 stappen in loop 4 return i 5 else 6 i = i + 1 7 return 0 // 2 operaties buiten de loop
Slechtste geval zoek-in-rij zoek-in-rij(x, A) 1 i = 1 // A met lengte n 2 while i A.length // n keer 3 if x == A[i] // 6 stappen in loop 4 return i 5 else 6 i = i + 1 7 return 0 // 2 operaties buiten de loop Totaal: 6n + 2 stappen, is O(n)
Slechtste geval insertion sort insertion-sort(a) 1 for j = 2 to A.length 2 key = A[j] 3 i = j 1 4 while i > 0 and A[i] > key 5 A[i + 1] = A[i] 6 i = i 1 7 A[i + 1] = key
Slechtste geval insertion sort insertion-sort(a) 1 for j = 2 to A.length // j is 2.. n 2 key = A[j] 3 i = j 1 4 while i > 0 and A[i] > key 5 A[i + 1] = A[i] 6 i = i 1 7 A[i + 1] = key
Slechtste geval insertion sort insertion-sort(a) 1 for j = 2 to A.length // j is 2.. n 2 key = A[j] 3 i = j 1 4 while i > 0 and A[i] > key // j keer 5 A[i + 1] = A[i] 6 i = i 1 7 A[i + 1] = key
Slechtste geval insertion sort insertion-sort(a) 1 for j = 2 to A.length // j is 2.. n 2 key = A[j] 3 i = j 1 4 while i > 0 and A[i] > key // j keer 5 A[i + 1] = A[i] // 8 stappen in loop 6 i = i 1 7 A[i + 1] = key
Slechtste geval insertion sort insertion-sort(a) 1 for j = 2 to A.length // j is 2.. n 2 key = A[j] 3 i = j 1 4 while i > 0 and A[i] > key // j keer 5 A[i + 1] = A[i] // 8 stappen in loop 6 i = i 1 7 A[i + 1] = key // 6 stappen buiten while
Slechtste geval insertion sort insertion-sort(a) 1 for j = 2 to A.length // j is 2.. n 2 key = A[j] 3 i = j 1 4 while i > 0 and A[i] > key // j keer 5 A[i + 1] = A[i] // 8 stappen in loop 6 i = i 1 7 A[i + 1] = key // 6 stappen buiten while Totaal: n 8j + 6 = 4n 2 + 10n 14 = O(n 2 ) j=2
DOMjudge
DOMjudge DOMjudge test automatisch of een ingestuurd programma correct compileert de juiste uitvoer geeft snel genoeg is
Gebruik van DOMjudge insturen kan tot de deadline zo vaak je wilt (nou ja, binnen het redelijke) laatste inzending telt DOMjudge test werking, wij kijken code na op netheid/leesbaarheid
Mogelijke antwoorden correct: de code werkt correct! (maar: correcte code is niet altijd goede code)
Mogelijke antwoorden correct: de code werkt correct! (maar: correcte code is niet altijd goede code) compiler-error: de code compileert niet. De compileruitvoer is te bekijken.
Mogelijke antwoorden correct: de code werkt correct! (maar: correcte code is niet altijd goede code) compiler-error: de code compileert niet. De compileruitvoer is te bekijken. wrong-answer: de code gaf de verkeerde uitvoer, maar DOMjudge vertelt niet wat (hint: denk goed na over randgevallen)
Mogelijke antwoorden correct: de code werkt correct! (maar: correcte code is niet altijd goede code) compiler-error: de code compileert niet. De compileruitvoer is te bekijken. wrong-answer: de code gaf de verkeerde uitvoer, maar DOMjudge vertelt niet wat (hint: denk goed na over randgevallen) run-error: het programma is gecrasht (hint: misschien een IndexOutOfBoundsError?)
Mogelijke antwoorden correct: de code werkt correct! (maar: correcte code is niet altijd goede code) compiler-error: de code compileert niet. De compileruitvoer is te bekijken. wrong-answer: de code gaf de verkeerde uitvoer, maar DOMjudge vertelt niet wat (hint: denk goed na over randgevallen) run-error: het programma is gecrasht (hint: misschien een IndexOutOfBoundsError?) timelimit: het programma deed er te lang over (hint: meestal veel te lang, denk over complexiteit)
Cijferregeling practicum Als DOMjudge zegt correct: 7,5 punt Stijl/netheid: nog maximaal 2,5 punt erbij Niet correct in DOMjudge is dus 0 punten Niet voldaan aan eisen van opgave is ook 0 punten!
In- en uitvoer DOMjudge geeft het programma invoer (zoals beschreven in de opgave) het programma produceert de uitvoer horend bij die invoer DOMjudge controleert of de uitvoer is zoals verwacht
Voorbeeld De eerste regel van de invoer bevat een getal n. Daarna volgen n regels met op elke regel een getal x. Print voor elke x een regel uitvoer met 0 als x 0, of anders x 1. Invoer: 3 7 0 42 Uitvoer: 6 0 41