ALGORITMIEK: antwoorden werkcollege 5

Vergelijkbare documenten
ALGORITMIEK: antwoorden werkcollege 5

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

Vijfde college algoritmiek. 2/3 maart Exhaustive search

Vijfde college algoritmiek. 17 maart Exhaustive search Graafwandelingen Backtracking

Uitwerking tentamen Analyse van Algoritmen, 29 januari

Doorzoeken van grafen. Algoritmiek

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

Achtste college algoritmiek. 12 april Verdeel en Heers. Dynamisch Programmeren

Zevende college Algoritmiek. 6 april Verdeel en Heers

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

Uitwerking tentamen Algoritmiek 9 juni :00 17:00

Uitgebreide uitwerking Tentamen Complexiteit, juni 2017

Zevende college algoritmiek. 23/24 maart Verdeel en Heers

Tweede college algoritmiek. 12 februari Grafen en bomen

Tiende college algoritmiek. 26 april Gretige algoritmen

Zevende college algoritmiek. 24 maart Verdeel en Heers

Uitwerking tentamen Algoritmiek 9 juli :00 13:00

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

Datastructuren college 10

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

Uitgebreide uitwerking tentamen Algoritmiek Dinsdag 5 juni 2007, uur

Derde college algoritmiek. 22 februari Complexiteit Toestand-actie-ruimte

Zesde college algoritmiek. 22 maart Backtracking

Grafen en netwerken I Datastructuren en doorzoeken. Algoritmiek

Tiende college algoritmiek. 4 mei Gretige Algoritmen Algoritme van Dijkstra

Algoritmiek. 15 februari Grafen en bomen

Algoritmiek. 2 februari Introductie

Zesde college algoritmiek. 23 maart Backtracking. Verdeel en Heers

Vierde college complexiteit. 14 februari Beslissingsbomen

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.

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

public boolean equaldates() post: returns true iff there if the list contains at least two BirthDay objects with the same daynumber

Achtste college algoritmiek. 8 april Dynamisch Programmeren

Vierde college complexiteit. 16 februari Beslissingsbomen en selectie

Negende college algoritmiek. 15 april Dynamisch Programmeren

Uitwerking tentamen Algoritmiek 10 juni :00 13:00

Uitgebreide uitwerking tentamen Algoritmiek Dinsdag 2 juni 2009, uur

Eerste college algoritmiek. 5 februari Introductie

Tree traversal. Bomen zijn overal. Ferd van Odenhoven. 15 november 2011

Discrete Structuren. Piter Dykstra Sietse Achterop Opleidingsinstituut Informatica en Cognitie

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

Uitgebreide uitwerking Tentamen Complexiteit, juni 2018

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

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

Discrete Structuren. Piter Dykstra Opleidingsinstituut Informatica en Cognitie

Derde college complexiteit. 7 februari Zoeken

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.

Elfde college algoritmiek. 21 april Dijkstra en Branch & Bound

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

Uitgebreide uitwerking tentamen Algoritmiek Dinsdag 3 juni 2008, uur

Derde college algoritmiek. 23 februari Complexiteit Toestand-actie-ruimte

Elfde college algoritmiek. 29 april Algoritme van Dijkstra, Branch & Bound

Uitwerkingen opgaven Kunstmatige intelligentie

Algoritmen, Datastructuren en Complexiteit (214020/5)

Tree traversal. Ferd van Odenhoven. 15 november Fontys Hogeschool voor Techniek en Logistiek Venlo Software Engineering. Doorlopen van bomen

8C080 deel BioModeling en bioinformatica

Verslag Opdracht 4: Magische Vierkanten

Algoritmen, Datastructuren en Complexiteit ( en ) Uitwerkingen

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

Twaalfde college complexiteit. 11 mei Overzicht, MST

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

Programmeermethoden NA. Week 6: Lijsten

extra oefening algoritmiek - antwoorden

Twaalfde college algoritmiek. 12 mei Branch & Bound

Divide & Conquer: Verdeel en Heers vervolg. Algoritmiek

Datastructuren: stapels, rijen en binaire bomen

Programmeermethoden NA

Vierde college algoritmiek. 1 maart Toestand-actie-ruimte Brute Force

Tiende college algoritmiek. 3 mei Dynamisch programmeren Gretige Algoritmen Algoritme van Dijkstra

Amorized Analysis en Union-Find Algoritmiek

REEKS I. Zaterdag 6 november 2010, 9u

Derde college algoritmiek. 18 februari Toestand-actie-ruimte

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

Vijfde college complexiteit. 21 februari Selectie Toernooimethode Adversary argument

Twaalfde college algoritmiek. 17 mei Branch & Bound

SPOJ oplossingen Gilles Callebaut 7 augustus 2015

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

Twaalfde college algoritmiek. 11/12 mei Branch & Bound

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

Negende college algoritmiek. 6/7 april Dynamisch Programmeren

8C080 deel BioModeling en bioinformatica

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

Opgaven Kunstmatige Intelligentie 1 maart 2017

Datastructuren: stapels, rijen en binaire bomen

Kunstmatige Intelligentie (AI) Hoofdstuk van Russell/Norvig = [RN] Genetische algoritmen. voorjaar 2016 College 11, 3 mei 2016

Derde college algoritmiek. 16/17 februari Toestand-actie-ruimte

algoritmiek - antwoorden

Datastructuren Uitwerking jan

Programmeermethoden. Arrays (vervolg 2) Walter Kosters. week 9: 6 10 november kosterswa/pm/

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

Overzicht. Inleiding. Toepassingen. Verwante problemen. Modellering. Exacte oplosmethode: B&B. Insertie heuristieken. Local Search

5.4.2 a. Neen: dit lukt alléén met 1, 3, 7 enzovoort. b. Ja: dit lukt met elk aantal knopen! Bijvoorbeeld de volgende boom: 1

Het minimale aantal sleutels op niveau h is derhalve

Netwerkstroming. Algoritmiek

Uitwerkingen derde deeltentamen Gameprogrammeren Vrijdag 6 november 2015, uur

Algoritmen, Datastructuren en Complexiteit (214020/5)

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

Transcriptie:

1 ALGORITMIEK: antwoorden werkcollege 5 opgave 1. a. Brute force algoritme, direct afgeleid uit de observatie: loop v.l.n.r. door de tekst; als je een A tegenkomt op plek i (0 i < n 1), loop dan van daaruit naar rechts en tel het aantal B s; deze aantallen voor alle A s sommeren levert het gevraagde aantal substrings. In C ++ : int teller = 0; for ( int i=0; i<n-1; i++ ) { if ( text[i] == A ) { for ( int j=i+1; j<n; j++ ) { if ( text[j] == B ) { teller++; // if B // for j // if A // for i // teller geeft nu het gevraagde aantal substrings In de worst case (dat komt voor als text uit louter A s bestaat), is het aantal karaktervergelijkingen gelijk aan: n+n 1+n 2+ 3+2 = 1 2 n (n+1) 1, dus kwadratisch. b. We kunnen een slimmer algoritme schrijven, dat elk karakter uit de tekst maar één keer leest. We lopen nog staads van links naar rechts door de tekst. Merk op dat op het moment dat we een B tegenkomen, het aantal sustrings beginnend met een A en deze B als eindkarakter, precies het aantal A s is dat links van B staat, en die je dus al gelezen hebt. We houden derhalve een tellertje bij dat het aantal gelezen A s bijhoudt, en zra we een B tegenkomen updaten we de totaalteller met het aantal tot dusver gelezen A s. In C ++ : int totaalteller = 0; int Ateller = 0; for ( int i=0; i<n; i++ ) { if ( text[i] == A ) Ateller++; if ( text[i] == B ) totaalteller+=ateller; // for i // totaalteller geeft nu het gevraagde aantal substrings Dit algoritme doet altijd 2n vergelijkingen, en is dus lineair. opgave 2. Bereken eerst S, de som van de n getallen. Als S oneven is, dan kun je stoppen, want dan heeft het probleem zeker geen oplossing. Als S even is, genereer dan alle deelverzamelingen (dat zijn er maximaal 2 n ) totdat een deelverzameling met som der elementen

2 S wordt gevonden, of totdat alle deelverzamelingen bekeken zijn. In het eerste geval zijn 2 die deelverzameling en de verzameling van de resterende getallen de gevraagde opdeling. In het andere geval is er geen oplossing. Merk op dat je kunt volstaan met het genereren van alleen de deelverzamelingen met niet meer dan n elementen. 2 opgave 3. a. Laat s de som van de getallen in een rij zijn. In het magisch vierkant is de som der elementen van elke rij dan gelijk aan s (evenals de som der elementen van elke kolom, en van de twee hoofddiagonalen). Als we nu alle getallen van alle rijen (dus alle getallen uit het vierkant) optellen krijgen we: s n = 1+2+ n 2 1+n 2 = 1 2 n2 (n 2 +1) Hieruit volgt dat s = 1 2 n(n2 +1). b. Nummer de n 2 posities in een n bij n array van 1 t/m n 2. Genereer een permutatie van de getallen 1 t/m n 2 en zet ze in die volgorde in het array (op de plekken 1 t/m n 2 ). Controleer dan of aan de eisen voor een magisch vierkant is voldaan door rijsommen, kolomsommen en hoofddiagonaalsommen te bepalen en te kijken of die alle gelijk aan s (zie a.) zijn. Zo ja, dan is een magisch vierkant gevonden; zo nee, genereer de volgende permutatie. opgave 4. a 1,7 b 2,3 c 5,6 d 3,2 g 6,5 f e a. 4,1 7,4 b. a 1 d 4... b 2 c 3 e 5...... f 6 g 7 Bij a. Het eerste subscript geeft de volgorde aan waarin de knopen voor de eerste keer worden bereikt, het tweede subscript de volgorde waarin de knopen helemaal zijn afgehandeld. Bij b. Het subscript geeft de volgorde aan waarin de knopen worden bezocht. opgave 5. a. bool ALGORITME DFSAcyclisch (G) // Implementeert DFS wandeling door gegeven graaf, // en controleert of deze acyclisch is // Invoer: Ongerichte graaf G = (V,E) // Uitvoer: // * Graaf G met zijn knopen genummerd in de volgorde // waarin ze bij DFS wandeling voor het eerst worden ontdekt

3 // * true: als graaf acyclisch is // false: als graaf kringen bevat; in dat geval worden de knopen // in de gevonden kringen afgedrukt { for elke knoop v in V do mark[v] = 0; // nog niet bezocht teller = 0; acyclisch = true; for elke knoop v in V do if mark[v] == 0 then dfs (v, null); // v is wortel in DFS boom, dus heeft geen ouder return acyclisch; dfs (v, u) // Bezoekt recursief alle nog onbezochte knopen die via een pad // met v zijn verbonden, en nummert deze in de volgorde waarin // ze worden ontdekt, met globale variabele teller // Wanneer een kring ontdekt wordt, drukt het de knopen in de kring af. { teller ++; mark[v] = teller; ouder[v] = u; // ouder in DFS boom for elke buurknoop w van v do if mark[w] == 0 then dfs (w, v); else // back edge, dus een kring gevonden; druk knopen af acyclisch = false; printpad (w, v); print w; printpad (w, v) // print recursief het pad van w naar v, // zoals dat is opgeslagen in array ouder { if (w!= v) then printpad (w, ouder[v]); print (v); b. Het is voldoende om in ALGORITME BFSAcyclisch de globale variabele acyclisch te initialiseren en te retourneren, net als in DFSAcyclisch, en om in functie bfs de globale variabele acyclisch false te maken als (mark[w]!= 0), bij de else van de if in de functie dus.

4 c. Nee, het is niet zo dat een van de twee algoritmes altijd minstens zo snel een kring ontdekt als de ander. Bij de ene graaf wordt een kring eerder met DFS ontdekt, bijvoorbeeld als de kring diep in de eerste subboom van de wortel in de DFS boom zit. Bij een andere graaf wordt een kring eerder met BFS ontdekt, bijvoorbeeld als de kring vlak bij de wortel in de laatste subboom van de wortel in de BFS boom zit. opgave 6. bool ALGORITME DFSSamenhangend (G) // Implementeert DFS wandeling door gegeven graaf, // en controleert of deze samenhangend is // Invoer: Ongerichte graaf G = (V,E) // Uitvoer: // * Graaf G met zijn knopen genummerd in de volgorde // waarin ze bij DFS wandeling voor het eerst worden ontdekt // * true: als graaf samenhangend is // false: als graaf niet samenhangend is { for elke knoop v in V do mark[v] = 0; // nog niet bezocht teller = 0; component = 0; for elke knoop v in V do if mark[v] == 0 then component ++; dfs (v); if component == 1 then return true; else return false; dfs (v) // Bezoekt recursief alle nog onbezochte knopen die via een pad // met v zijn verbonden, en nummert deze in de volgorde waarin // ze worden ontdekt, met globale variabele teller { teller ++; mark[v] = teller; compon[v] = component; for elke buurknoop w van v do if mark[w] == 0 then dfs (w);

5 opgave 7. a. Wanneer je achtereenvolgens het vakje met S, de buren van het vakje met S, de buren van de buren van het vakje met S (voor zover nog niet bereikt), enz. in de queue stopt, en daarbij steeds de afstand 1 ophoogt, krijg je achtereenvolgens de volgende afstandtabellen: 0-1 -1-1 -1-1 1 1-1 0 1-1 -1-1 -1 1 1 2 0 1 2-1 -1-1 1 1 2 3-1 -1 0 1 2 3-1 -1 3-1 -1-1 -1-1 1 1 2 3 4-1 0 1 2 3 4-1 3 4-1 -1-1 4-1 -1-1 5 5 5 5 6 6 6-1 -1 7 5 5-1 -1 7 6 6 6-1 8 4 5-1 8 7 5 5-1 8 7 6 6 6 9 8 4 5 9 8 7 5 5 9 8 7 6 6 6 b. Je vindt de kortste paden van S naar D achterstevoren, door in de tabel met afstanden terug te lopen van D naar S, waarbij je iedere stap naar een aangrenzend vakje gaat met een lagere afstand vanaf S. Dus van D (met afstand 9) naar een aangrenzend vakje met afstand 8, naar een aangrenzend vakje met afstand 7, enzovoort. Er zijn tien verschillende kortste paden van S naar D.