Uitwerking tentamen Analyse van Algoritmen, 29 januari

Vergelijkbare documenten
Uitgebreide uitwerking Tentamen Complexiteit, mei 2007

Uitgebreide uitwerking Tentamen Complexiteit, juni 2017

Uitgebreide uitwerking Tentamen Complexiteit, juni 2018

ALGORITMIEK: antwoorden werkcollege 5

ALGORITMIEK: antwoorden werkcollege 5

Tiende college algoritmiek. 13/21 april Gretige Algoritmen Algoritme van Dijkstra

Tiende college algoritmiek. 26 april Gretige algoritmen

ALGORITMIEK: antwoorden werkcollege 5

1 Complexiteit. of benadering en snel

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

Vierde college complexiteit. 26 februari Beslissingsbomen en selectie Toernooimethode Adversary argument

Tiende college algoritmiek. 4 mei Gretige Algoritmen Algoritme van Dijkstra

(On)Doenlijke problemen

Benaderingsalgoritmen

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

Vierde college complexiteit. 14 februari Beslissingsbomen

Tiende college algoritmiek. 14 april Gretige algoritmen

Tiende college algoritmiek. 2 mei Gretige algoritmen, Dijkstra

Achtste college complexiteit. 2 april Polynoomevaluatie Matrixvermenigvuldiging Euler- en Hamiltonkringen

Grafen. Indien de uitgraad van ieder punt 1 is, dan bevat de graaf een cykel. Indien de ingraad van ieder punt 1 is, dan bevat de graaf een cykel.

Heuristieken en benaderingsalgoritmen. Algoritmiek

Vierde college complexiteit. 16 februari Beslissingsbomen en selectie

Minimum Opspannende Bomen. Algoritmiek

Discrete Structuren. Piter Dykstra Sietse Achterop Opleidingsinstituut Informatica en Cognitie

Derde college complexiteit. 7 februari Zoeken

TW2020 Optimalisering

Elfde college complexiteit. 23 april NP-volledigheid III

Discrete Structuren. Piter Dykstra Opleidingsinstituut Informatica en Cognitie

Vijfde college algoritmiek. 2/3 maart Exhaustive search

Geldwisselprobleem van Frobenius

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.

Programmeren A. Genetisch Programma voor het Partitie Probleem. begeleiding:

Vijfde college complexiteit. 21 februari Selectie Toernooimethode Adversary argument

Zevende college Algoritmiek. 6 april Verdeel en Heers

Zevende college complexiteit. 7 maart Mergesort, Ondergrens sorteren (Quicksort)

Transport-, Routing- en Schedulingproblemen. Wi4062TU / Wi487TU / a86g. Uitwerkingen

Tentamen combinatorische optimalisatie Tijd:

Kortste Paden. Algoritmiek

OPDRACHT Opdracht 2.1 Beschrijf in eigen woorden wat het bovenstaande PSD doet.

Hoofdstuk 8: Algoritmen en Complexiteit

Twaalfde college algoritmiek. 23 mei Branch & Bound, Heapsort

Zevende college algoritmiek. 23/24 maart Verdeel en Heers

Controle structuren. Keuze. Herhaling. Het if statement. even1.c : testen of getal even of oneven is. statement1 statement2

Zevende college algoritmiek. 24 maart Verdeel en Heers

Zevende college complexiteit. 17 maart Ondergrens sorteren, Quicksort

Java Les 3 Theorie Herhaal structuren

Tentamen Discrete Wiskunde 1 10 april 2012, 14:00 17:00 uur

Uitwerking tentamen Algoritmiek 9 juni :00 17:00

ALGORITMIEK. Keuzemodule Wiskunde B/D. Mark de Berg TU Eindhoven

NP-volledigheid. Algoritmiek

Tentamen IN3105. Complexiteitstheorie. 16 april 2012, uur

TW2020 Optimalisering

Zesde college complexiteit. 19 maart Mergesort, Ondergrens sorteren Quicksort, Shellsort

Tiende college algoritmiek. 14 april Dynamisch Programmeren, Gretige Algoritmen, Kortste Pad met BFS

Negende college complexiteit. 9 april NP-volledigheid I: introductie

TW2020 Optimalisering

Twaalfde college algoritmiek. 13 mei Branch & Bound Heap, Heapsort & Heapify

TW2020 Optimalisering

Discrete Structuren. Piter Dykstra Opleidingsinstituut Informatica en Cognitie

Gödels theorem An Incomplete Guide to Its Use and Abuse, Hoofdstuk 3

Small Basic Programmeren Text Console 2

D-dag 2014 Vrijeschool Zutphen VO. D -DAG 13 februari 2014: 1+ 1 = 2. (en hoe nu verder?) 1 = 2en hoe nu verder?

NP-Volledigheid. Wil zo snel mogelijke algoritmes om problemen op te lossen. De looptijd is polynomiaal: O n k - dat is heel erg mooi

Combinatorische Algoritmen: Binary Decision Diagrams, Deel III

HOOFDSTUK 3. Imperatief programmeren. 3.1 Stapsgewijs programmeren. 3.2 If Then Else. Module 4 Programmeren

Minimum Spanning Tree

Algoritmiek. 2 februari Introductie

V = {a, b, c, d, e} Computernetwerken: de knopen zijn machines in het netwerk, de kanten zijn communicatiekanalen.

Datastructuren en Algoritmen

Vijfde college algoritmiek. 9 maart Brute Force. Exhaustive search

TW2020 Optimalisering

Eerste Toets Datastructuren 22 mei 2019, , Educ-β en Megaron.

l e x e voor alle e E

Examen Datastructuren en Algoritmen II

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

Tentamen Programmeren in C (EE1400)

Onafhankelijke verzamelingen en Gewogen Oplossingen, door Donald E. Knuth, The Art of Computer Programming, Volume 4, Combinatorial Algorithms

Elfde college algoritmiek. 16 mei Dijkstra, Gretige algoritmen en Branch & Bound

Uitwerking tentamen Algoritmiek 9 juli :00 13:00

Uitwerking tentamen Algoritmiek 10 juni :00 13:00

Het minimale aantal sleutels op niveau h is derhalve

Negende college algoritmiek. 15 april Dynamisch Programmeren

dan verdwijnt een deel van het rijm, maar ook de raadselachtigheid van de tekst.

Oefententamen in2505-i Algoritmiek

Amorized Analysis en Union-Find Algoritmiek

Examen Datastructuren en Algoritmen II

Uitwerking Puzzel 93-1, Doelloos

Modeluitwerking Tentamen Computationele Intelligentie Universiteit Leiden Informatica Vrijdag 11 Januari 2013

Info-books. Toegepaste Informatica. Deel 20 : Algoritmen en programmeren in Access en Excel (Basis) AL20. Jos Gils Erik Goossens

Algoritmes in ons dagelijks leven. Leve de Wiskunde! 7 April 2017 Jacobien Carstens

VBA voor doe het Zelvers deel 22. Handleiding van Helpmij.nl. Auteur: leofact

8. Complexiteit van algoritmen:

Tijd is geen goede maatstaf, want is afhankelijk van computer waarop algoritme wordt gedraaid.

Vierde college algoritmiek. 2 maart Toestand-actie-ruimte Exhaustive Search

Een eenvoudig algoritme om permutaties te genereren

Opgaven Kunstmatige Intelligentie 1 maart 2017

Programmeermethoden. Recursie. Walter Kosters. week 11: november kosterswa/pm/

extra oefening algoritmiek - antwoorden

Examen Datastructuren en Algoritmen II

TW2020 Optimalisering

Transcriptie:

Uitwerking tentamen Analyse van Algoritmen, 29 januari 2007. (a) De buitenste for-lus kent N = 5 iteraties. Na iedere iteratie ziet de rij getallen er als volgt uit: i rij na i e iteratie 2 5 4 6 2 2 4 5 6 2 4 5 6 4 2 4 5 6 5 2 4 5 6 (hetzelfde dus) (b) Na de eerste iteratie van de buitenste for-lus is het grootste getal naar achteren geborreld. Na de tweede iteratie van de buitenste for-lus zijn (in ieder geval) de grootste twee getallen naar achteren geborreld. In het algemeen zijn na de i e iteratie van de buitenste for-lus de grootste i getallen naar achter geborreld, en ze staan daar in de juiste volgorde. Dit zijn dus de getallen op posities N i+,...,n (inderdaad, dit zijn i posities). De getallen op posities,...,n i zijn allemaal kleiner dan of gelijk aan A[N-i+]. De derde bewering is dus een invariant voor de buitenste for-lus op positie (*). (c) In de buitenste for-lus loopt de variabele i van tot en met N. In de laatste iteratie is dus i = N. Aan het eind van die iteratie is de invariant geldig. Als we in de invariant de waarde i = N invullen, krijgen we: A[N (N ) +...N] = A[2...N] is van klein naar groot gesorteerd en A[...N (N i)] = A[...] = A[] is hoogstens zo groot als A[N (N )+] = A[2]. Dit betekent dat A[...N], ofwel het hele array A, van klein naar groot gesorteerd is. (d) In de i e iteratie van de buitenste for-lus loopt de variabele j in de binnenste for-lus van tot en met N i. Dit zijn dus N i iteraties. (e) In de eerste iteratie van de buitenste for-lus is i = en kent de binnenste for-lus volgens het vorige onderdeel N iteraties. In de tweede iteratie van de buitenste for-lus is i = 2 en kent de binnenste for-lus N 2 iteraties. In de derde iteratie van de buitenste for-lus is i = en kent de binnenste for-lus N iteraties. Enzovoort, tot en met de (N ) e = laatste iteratie van de buitenste for-lus, waarin i = N en de binnenste for-lus nog N i = N (N ) = iteratie kent. Het totaal aantal iteraties van de binnenste for-lus is dus (N )+(N 2)+(N )+ +. Dit zijn N termen met als gemiddelde waarde (N )+ 2 = N 2. De som is dus gelijk aan (N ) N 2 iteraties. Voor iedere iteratie van de binnenste for-lus is (hoogstens) een constante hoeveelheid tijd nodig. Verder gebeurt er niets spannends in het algoritme. De tijdscomplexiteit wordt dus volledig bepaald door het aantal iteraties van de binnenste for-lus. Dit is (N ) N 2 = 2 N2 2 N De achterste term 2 N valt voor grote N weg tegen de voorste term 2 N2. De constante 2 van de voorste term is niet van belang voor de complexiteit. De complexiteit van het algoritme is dus O(N 2 ). (f) Nee, want voor iedere rij getallen doorloopt de buitenste for-lus N iteraties. En in de i e iteratie van de buitenste for-lus doorloopt de binnenste for-lus altijd N i iteraties. Dit is onafhankelijk van de waardes die we tegenkomen. P.S.: je kunt het algoritme wel slimmer maken door uit de buitenste for-lus te springen als het array al helemaal gesorteerd blijkt te zijn, maar dat gebeurt dus niet standaard.

2 Uitwerking tentamen Analyse van Algoritmen, 29 januari 2007 2. (a) We passen het algoritme uit het boek (het algoritme van Prim) toe. We beginnen met de tak met het kleinste gewicht. Iedere volgende stap breiden we de huidige boom uit met een aangrenzende tak, die geen kring vormt met de eerder gekozen takken, en die een zo klein mogelijk gewicht heeft. Hierbij krijgen we achtereenvolgens de volgende bomen: 7 7 2 7 (a) (b) (c) 2 7 (d) 4 2 7 7 7 (g) 2 7 7 (e) 4 2 7 7 (f) Het eindresultaat is een minimale opspannende boom. In de tweede stap konden we kiezen uit twee takken met hetzelfde (kleinste) gewicht 2. In dat geval hebben we willekeurig de tak 5 7 gekozen. In de volgende stap kozen we alsnog de tak 6 8. (b) Ja, zo n Hamilton pad bestaat, bijvoorbeeld het pad 4 2 5 7 8 6 9 0. (c) Een kortste route voor de handelsreiziger is 2 7 5 4 8 0 9 6. Deze route heeft lengte 57. (d) Een niet-deterministisch polynomiaal algoritme voor de beslissingsvariant van het handelsreizigersprobleem is: i. Genereer een willekeurige permutatie van de getallen,...,n. ii. Bereken het totale gewicht van de route die de knopen afloopt in de volgorde van de permutatie, en aan het eind weer terugkeert van de laatste knoop naar de eerste knoop.

Uitwerking tentamen Analyse van Algoritmen, 29 januari 2007 (Als een of meer van de takken op deze route niet in de graaf voorkomen, wordt het totale gewicht oneindig.) Als het berekende totale gewicht hoogstens K is, antwoord dan ja. Antwoord anders nee.. Makkelijkst is zoeken van een element in een gesorteerd array. Dat kan in O(log N) tijd (met binair zoeken). Vervolgens komt het bepalen van een minimale opspannende boom in een ongerichte graaf. Dit kan in polynomiale tijd, en die tijd is minstens lineair, dus minstens O(N). Vervolgens komt het handelsreizigersprobleem. Dit probleem is NP-volledig. Dat betekent dat het wel op te lossen is, maar (voor zover we nu weten) niet in polynomiale tijd. Ten slotte komt het correspondentieprobleem. Dat probleem is niet oplosbaar. 4. Stel dat het stopprobleem wel oplosbaar is. Ofwel, stel dat er een programma Q bestaat dat, gegeven een programma R en een invoer X, binnen eindige tijd kan bepalen of programma R zal stoppen voor invoer X. Dan bouwen we met behulp van Q een nieuw programma S, als volgt. S verwacht als invoer een computerprogramma W, en maakt hier een kopie van. De oorspronkelijke invoer noemen we R en de kopie noemen we X. Vervolgens gebruikt S de variabelen R en X (die dus allebei gelijk zijn aan W) als invoer voor het programma Q (waarvan we dus veronderstellen dat het bestaat). We laten nu Q draaien op deze invoer, en Q beantwoordt de vraag of computerprogramma R stopt, wanneer het X als invoer krijgt. Ofwel, Q beantwoordt de vraag of computerprogramma W stopt, wanneer het zichzelf (zijn eigen code) als invoer krijgt. De uitvoer hiervan wordt gebruikt in de volgende stap van het programma S dat we aan het bouwen zijn. Als Q de uitvoer ja geeft (wat betekent dat W stopt met zichzelf als invoer), dan gaat S in een oneindige lus. Als Q de uitvoer nee geeft (wat betekent dat W niet stopt met zichzelf als invoer), dan stopt S. Tot zover de beschrijving van het nieuwe programma S. (Zie Figuur 8.7 op blz. 20 van het boek.) Ervanuitgaande dat Q bestaat, is S een keurig programma. We voeren nu de code van S als invoer aan zichzelf. Dit is legaal, want S verwacht een computer programma als invoer. Wat gebeurt er dan? Er wordt een kopie van S gemaakt, en Q beantwoordt de vraag of S stopt met zichzelf als invoer. Het antwoord van Q is ja of nee. Als het antwoord ja is, gaat S in een oneindige lus, en stopt dus niet. Dat is in tegenspraak met het antwoord van Q. Als het antwoord nee is, stopt S netjes. Ook dat is in tegenspraak met het antwoord van Q. In beide gevallen stuiten we op een tegenspraak. Ergens moet dus iets mis zijn met S. Al onze stappen om S vanuit Q te construeren waren echter legaal: kopiëren van de invoer, draaien van Q, eventueel in een oneindige lus geraken. Er moet dus iets mis zijn met Q. De aanname dat Q bestaat, klopte kennelijk niet. Er bestaat kennelijk geen algoritme dat voor een willekeurig programma R en invoer X bepaalt of R stopt voor X. Het stopprobleem is dus niet oplosbaar.

4 Uitwerking tentamen Analyse van Algoritmen, 29 januari 2007 5. (a) We leggen het woord W eerst onder de eerste M letters van de tekst T. Dan kijken we letter voor letter (van links naar rechts) of W gelijk is aan dat deel van de tekst. Als dat inderdaad het geval is, kunnen we stoppen. Als daarentegen een bepaalde letter van W niet gelijk is aan de corresponderende letter van T, hoeven we de volgende letters van W niet meer te vergelijken. We schuiven W één positie door naar rechts, zodat het onder de 2 e tot en met de (M + ) e letter van T komt te liggen. We gaan dan opnieuw letter voor letter (van links naar rechts) kijken of W gelijk is aan dat deel van de tekst. Zo gaan we door, totdat we uiteindelijk W inderdaad ergens in de tekst vinden, of totdat we W voorbij de laatste letter van de tekst schuiven. In pseudo-code: Tbeginpos = ; Gevonden = false; while (!Gevonden and Tbeginpos<=N-M+) do Wpos = ; Tpos = Tbeginpos; NogOK = true; while (NogOK and Wpos<=M) do if (W[Wpos]==T[Tpos]) then Wpos ++; Tpos ++; else NogOK = false; od od if (NogOK) then Gevonden = true; else Tbeginpos ++; if (Gevonden) then write "woord W komt voor"; else write "woord W komt niet voor"; (b) In het slechtste geval komen alle letters van W steeds overeen met de tekstletters, tót de laatste letter, waar het misgaat. We zullen dan posities,2,...,(n M + ) van de tekst T als beginpositie van het woord W proberen. Gewoon omdat we W alsmaar niet tegenkomen. De buitenste while-lus doorloopt dan N M + iteraties. Verder doorloopt de binnenste while-lus voor iedere beginpositie (ofwel, voor iedere iteratie van de buitenste while-lus) M iteraties: een iteratie voor iedere letter van W. De eerste M letters van W blijken immers steeds gelijk te zijn aan de corresponderende tekstletters. In totaal doorloopt de binnenste while-lus in het slechtste geval dus (N M + ) M = N M M M + M iteraties. Omdat we ervan uit mogen gaan dat M veel kleiner is dan N, is dit O(N M). Het meeste werk vindt plaats in de binnenste while-lus. De hoeveelheid werk per iteratie van de binnenste while-lus is (hoogstens) constant (één vergelijking en twee of één toekenningen). Het totaal aantal iteraties van de binnenste while-lus bepaalt dus de hoeveelheid werk. Zoals we gezien hebben is dit O(N M). Dit is dan ook de tijdscomplexiteit van het algoritme. (c) Een voorbeeld van een slechtste geval dat overeenkomt met de redenering van het vorige onderdeel, is T = AAAAA AAAAA AAAAA (de spaties in T staan hier louter voor de leesbaarheid; ze zitten dus niet in T zelf) en W = AAAAB.

Uitwerking tentamen Analyse van Algoritmen, 29 januari 2007 5 (d) Stel dat we voor een blok G de vingerafdruk willen berekenen, en dat we geen gebruik kunnen maken van de vingerafdruk van het vorige blok. Dan moeten we waarschijnlijk alle M cijfers van G aflopen. Dat kost O(M) tijd. Als we pech hebben, moeten we dat voor alle N M + blokken doen, zodat de tijdscomplexiteit van dit algoritme O(N M) wordt, net als voor het naïeve algoritme. We zouden dus geen tijd besparen. (e) VingerAfdruk(0787) = 0787 mod 0 = (0780 + 7) mod 0 = (0 078 + 7) mod 0 = (0 (6078 60000) + 7) mod 0 = (0 (6078 mod 0) (600000 mod 0) + 7) mod 0 = (0 VingerAfdruk(6078) (600000 mod 0) + 7) mod 0 We moeten dus de vingerafdruk van het vorige blok met 0 vermenigvuldigen, daar 600000 mod 0 vanaf trekken en 7 bij optellen. En vervolgens het resultaat modulo 0 doen. Dit zijn allemaal eenvoudige operaties, die we in constante tijd kunnen uitvoeren. Het is hierbij van belang dat we de waarde 600000 mod 0 niet rechtstreeks hoeven uit te rekenen (wat veel werk zou zijn), maar uit een simpele tabel kunnen halen. Op deze plek in de berekening hebben we namelijk bij ieder blok óf 0 mod 0, óf 00000 mod 0, óf 200000 mod 0,..., óf 900000 mod 0 nodig. Dit zijn 0 waardes die we eenvoudig van tevoren kunnen uitrekenen en in een tabel stoppen. (f) Volgens de denitie is de vingerafdruk van een blok G gelijk aan G mod K. Dit is een waarde uit de het rijtje 0,,2,...,K-. Er zijn dus K verschillende vingerafdrukken. De kans dat een willekeurig blok van lengte M dezelfde vingerafdruk heeft als het woord dat we zoeken is dus op K. In ons voorbeeld is dat 0, wat ongeveer % is. (g) Omdat het dan niet mogelijk is om expres een instantie (een combinatie van T en W) te construeren, waarvoor het algoritme altijd slecht zal werken. Je mag er dus vanuit gaan dat gemiddeld maar op de K blokken in de tekst dezelfde vingerafdruk heeft als W. Alleen voor die blokken moet je controleren of ze echt gelijk zijn aan W, en dat is niet veel werk. Als K niet random gekozen zou worden, zou je bij een woord W een tekst T kunnen construeren die veel blokken bevat met dezelfde vingerafdruk als W. Bij al die blokken zou het algoritme vervolgens moeten controleren of ze echt gelijk zijn aan W, en dat zou veel werk worden.