Hoofdstuk 3. Week 5: Sorteren. 3.1 Inleiding

Maat: px
Weergave met pagina beginnen:

Download "Hoofdstuk 3. Week 5: Sorteren. 3.1 Inleiding"

Transcriptie

1 Hoofdstuk 3 Week 5: Sorteren 3.1 Inleiding Zoals al bleek in college 1 kunnen zoekalgoritmen veel sneller worden uitgevoerd, indien we weten dat de elementen in de lijst, waarin wordt gezocht, geordend voorkomen. Niet voor niets zijn telefoongidsen, adresbestanden, woordenboeken en dergelijke alfabetisch geordend. Zelfs voor relatief kleine bestanden loont het vaak al de moeite de gegevens in zekere geordende volgorde beschikbaar te hebben, zeker, als zo n bestand vaak doorzocht moet worden. Helaas worden gegevens slechts zelden geordend aangeleverd. (Een student zal zijn studiegenoten niet in alfabetische volgorde tegenkomen en dus ook niet in alfabetische volgorde in zijn agenda hun adressen kunnen noteren). We zullen dus op de één of andere manier de ongeordende gegevens moeten ordenen. 1 ) Het op volgorde zetten van gegevens wordt wel sorteren genoemd. In algemene vorm komt het bij sorteeralgoritmen neer op: Gegeven: een zekere list alsmede een ordenings relatie. De ordeningsrelatie geeft aan in welke volgorde de elementen van de lijst moeten voorkomen. Gevraagd: een algoritme, dat list sorteert volgens de gegeven ordening We zullen in dit hoofdstuk aannemen, dat de lijst een array van Comparable, zodat iedere Class die de interface Comparable implementeerd door deze methods kan worden gesorteerd. De interface Comparable definieert de ordeningsrelatie, met de method compareto: public int compareto(object o) 1 ) Een andere mogelijkheid is, elk nieuw gegeven direkt op de goede plaats (volgens de ordening) tussen te voegen. Deze methode zullen we hier niet bespreken. 1

2 De waarde van a.compareto(b) is kleiner dan nul als a < b volgens de ordeningsrelatie, a.compareto(b) == 0 als a = b volgens de ordeningsrelatie, en a.compareto(b) > 0 als a > b volgens de ordeningsrelatie. We zullen de gewenste eindtoestand realiseren, uitsluitend door gebruik te maken van verwisseling van elementen in de lijst list (zogenaamd sorteren in situ). Daarvoor zullen we onderstaande method gebruiken: private static void swapitems ( Comparable list[], int i, int j ) // pre: list[i] = X en list[j] = Y // post: list[i] = Y en list[j] = X Comparable hulp = list[i]; list[i] = list[j]; list[j] = hulp; 3.2 Selection sort Het algoritme voor Selection Sort is eenvoudig. Zoek het kleinste element uit de lijst en plaats het voorop de lijst. Zoek vervolgens het kleinste element in het resterende deel van de lijst en plaatst dat op de volgende plaats in de lijst en herhaal dit totdat alle elementen op de juiste plaats staan. Het algoritme heeft dan de vorm: private static int smallestitem ( Comparable list [], int left, int right ) // returns index of smallest item in list between // left and right-1 inclusive int index, result = left; for ( index = left + 1; index < right; index ++ ) if (list[index].compareto(list[result]) < 0) 2

3 result = index; return result; public static void selectionsort ( Comparable list [], int length ) // Sorts list int index; for ( index = 0 ; index < length - 1 ; index ++ ) swapitems( list, index, smallestitem( list, index, length ) ); 3.3 Insertion sort Bij insertion sort geldt dat het stuk list[b..index-1] al gesorteerd is, maar in het resterende deel kunnen nog kleinere waarden voorkomen. Bij iedere stap wordt het gesorteerde stuk list[b..index-1] met één element uitgebreid tot list[b..index]. Daarvoor moet het element list[index] op de juiste plaats tussengevoegd worden. Hiervoor wordt een nieuwe variabele next geïntroduceerd met als waarde index. De elementen list[next] en list[next-1] worden met elkaar vergeleken en zo nodig met Swap verwisseld. We herhalen deze stap voor next:=next-1 totdat er niet meer verwisseld hoeft te worden. Zo zakt bij wijze van spreken het element list[index] in de lijst list[0..index-1] af totdat de juiste plaats is gevonden. We kunnen de binnenste lus implementeren met: next = index; // Voeg element[index] toe aan de gesorteerde lijst while (( next > 0 ) &&!(list[next].compareto( list[next-1]) > 0)) swapitems( list, next, next-1 ); 3

4 next = next - 1; Dit houdt dit in, dat we net zolang het element list[next] met zijn voorganger verwisselen, tot het op de juiste plaats staat. De method ziet er als volgt uit: public static void insertionsort ( Comparable list [], int length ) // Sorts list int index, next; for (index = 1; index < length; index ++ ) // Invariant: list[0]..element[index-1] zijn // gesorteerd next = index; // Voeg list[index] toe aan de gesorteerde lijst while (( next > 0 ) &&!(list[next].compareto( list[next-1] ) > 0)) swapitems( list, next, next-1 ); next--; 3.4 Heapsort Heapsort is een efficiënte sorteer methode, zowel in geheugengebruik als in rekentijd. Net als de vorige twee methoden is het een in situ methode die niet of nauwelijks extra geheugen nodig heeft. Daarnaast is het een methode die gegarandeerd O n 2 log n efficiëntie heeft wat betreft rekentijd, tegen O n 2 voor de voorgaande methoden zie 3.7. Heapsort gebruikt een datastructuur die heap of priority-queue wordt genoemd. Een 4

5 heap kan worden beschouwd als een boom, waarin het root-element de hoogste waarde (of prioriteit) heeft. Verder geldt dat voor iedere knoop in de boom, beide kinderen geen hogere waarde hebben dan de knoop zelf. Dit wordt de heap conditie genoemd. Op een heap kunnen we drie acties uitvoeren: (i) initialisatie van een lege heap, (ii) invoegen van een element met willekeurige waarde, en (iii) verwijderen van het root element. Heapsort neemt nu de volgende stappen: Initialiseer de lege heap Voeg één voor één alle elementen van list aan de heap toe Verwijder één voor één alle elementen uit de heap (waarbij de grootste als eerste komt!!), en vul hiermee list van achter naar voor. Willen we deze acties kunnen uitvoeren onder handhaving van de heap conditie, dan is het nodig om van een willekeurig element zowel de ouder als de kinderen kunnen bepalen. In de bomen die we tot nu toe hebben gehad kon dit niet. We zouden iedere knoop van een boom natuurlijk uit kunnen voeren met een extra verwijzing naar de ouder, maar dit kost geheugen. De eenvoudig oplossing is de boom op te slaan in een array. We weten immers hoe groot de boom maximaal wordt: net zo groot als de te sorteren array (= n elementen)! Maar hoe zit het dan met de claim dat heapsort niet veel geheugen nodig heeft? De truc die we gebruiken is de volgende. We gebruiken het oorspronkelijke array als heap. Dit is zo te organiseren dat er als k elementen in de heap zitten, deze de eerste k elementen in list in beslag nemen, terwijl de overige n k elementen het achterste deel van list in beslag nemen. De manier waarop we ouders en kinderen bijhouden is ook simpel. De ouder van node i is node i/2 (waarbij we integerdeling bedoelen), en de kinderen van node i zijn i 2 en i Daarbij moeten we wel checken of ze bestaan! dit doen we niet door te checken of de kinderen null zijn, maar door te checken of de index waarde i 2 of i kleiner is dan het huidig aantal elementen in de heap. Let op: De telling van index waarden begint bij een heap bij 1 niet 0, zoals bij een array. Als 0 de root-node index zou zijn, zou een kind van de root ook index 0 hebben. Dit kan dus niet! De implementatie van heap is de volgende: public class Heap public Comparable list []; public int maxsize, size; public Heap( Comparable thelist [], int length ) list = thelist; maxsize = length; 5

6 size = 0; public Comparable itematheapindex( int i ) return list[i-1];... Er zijn dus drie data velden: de array list: een verwijzing naar je origineel), maxsize: de maximum grootte, en size: de huidige grootte. De constructor neemt de originele array, en laat list ernaar verwijzen. De maximum grootte wordt gelijk gesteld aan de lengte van list, en size wordt nul, wat aangeeft dat de heap leeg is. De method itematheapindex geeft het element op heap index i terug, wat overeenkomt met array index i-1. In de code zetten we deze omrekening rechtstreeks neer: element child komt overeen met list[child-1]. Het invoegen en verwijderen heeft telkens de volgende structuur: schendt de heap conditie, en repareer die daarna. We beginnen met insertinheap. In deze method wordt eerst gecontroleerd dat de maximum capaciteit niet wordt overschreden, verhoogt dan size, en plaatst het nieuwe element achter aan de heap array. Dit element staat dus in een van de bladeren van de boom. Tenzij het een element met de kleinst mogelijke waarde in het pad via de voorouders naar de root is, staat het niet op zijn plaats, en is de heap conditie geschonden. Dit wordt gerepareerd door upheap. De method ziet er als volgt uit: public void insertinheap( Comparable item) if ( size <= maxsize ) size ++; list[size-1] = item; upheap( size ); Method upheap rekent de ouder van de te verschuiven node child uit, en copieert 6

7 het betreffende array element naar temp. Er wordt nu iteratief gezocht naar de eerste voorouder die een waarde groter dan die van temp heeft, of dat de root-node bereikt is. Iedere keer dat een voorouder te klein is, wordt hij naar de betreffende kind positie door geschoven. Als de while-lus klaar is, wordt het kind op zijn plek gezet. De method zet er als volgt uit. Merk op dat dit zoekprocess maximaal 2 log n stappen vergt, size=n child. Immers, de parent wordt bij iedere herhaling gedeeld door twee. De lus stopt als parent == 0 in ieder geval, en dus na niet meer dan 2 log n stappen. void upheap( int child ) int parent = child / 2; Comparable temp = list[child-1]; boolean found = false; while ((parent > 0) &&!found) if ( list[parent-1].compareto(temp) < 0 ) list[child - 1] = list[parent - 1]; child = parent; parent = child / 2; else found = true; list[child - 1] = temp; Method removefirst haalt, als de heap niet leeg is, het element list[0] weg (oftewel de root). Het laatste element, op array index size - 1 wordt dan in de root geplaatst, size wordt 1 kleiner gemaakt, en de heap wordt gerepareerd met downheap. Tot slot wordt het oude root element terug gegeven met een return statement. public Comparable removefirst() if (size > 0) Comparable temp = list[0]; list[0] = list[size - 1]; size --; downheap(1); 7

8 return temp; else return null; Method downheap is het spiegelbeeld van upheap. Van een node met heap index parent wordt van de data een kopie gemaakt. Daarna wordt van de twee kinderen (als ze bestaan) de grootste gezocht. Als de parent kleiner is dan het grootste kind neemt het kind de positie van de parent, zo niet of als er geen kinderen zijn, dan staat parent op de juiste plaats. Net als upheap, heeft downheap een complexiteit van O 2 log n. Dit keer wordt child iedere keer verdubbeld, en na hooguit 2 log n stappen wordt child groter dan size, en stopt de lus. De methode kan als volgt worden geimplementeerd. void downheap ( int parent ) int child; Comparable temp = list[parent-1]; boolean found = false; while ((parent <= size / 2) &&!found) child = parent * 2; if ( child < size ) if ( list[child-1].compareto(list[child]) < 0 ) child ++; if ( temp.compareto(list[child-1]) < 0 ) list[parent - 1] = list[child - 1]; parent = child; else found = true; list[parent - 1] = temp; Heapsort is nu simpel: 8

9 static void heapsort ( Comparable list[], int length ) Heap heap = new Heap(list,length); int i; // Zorg eerst dat heap aan de heap conditie gaat voldoen for ( i = 1; i<= length; i++ ) heap.insertinheap( list[i-1] ); // heap is nu gebouwd size = length for ( i = length ; i > 1 ; i -- ) list[i-1] = heap.removefirst( ); Na initialisatie van de heap worden de elementen van de array in de heap geplaatst, waarna ze in de tweede for-lus eruit worden gehaald, en de array list van achter naar voren wordt gevuld. 3.5 Partition sort Tot slot van dit hoofdstuk willen we recursie gebruiken om een sorteer probleem op te lossen. We beschouwen een sorteer probleem, waarvan voor het hier te geven algoritme het aantal operaties (onder niet te extreme omstandigheden) evenredig is met n 2 log n als het een sortering van n objecten betreft. Veronderstel het bestaan van een method splitlist van de volgende vorm: private static int splitlist ( Comparable list [], int b, int e ) die de waarden van list[ b..e ] permuteert (verwisselt) en als functieresultaat een 9

10 waarde s berekent, zodanig dat (1) b s e (2) list[b..s-1] list[s] (3) list[s] list[s+1..e] (3.1) In een plaatje: b V V V s-1 s s+1 e Het (recursieve) sorteer-method is nu voor de hand liggend: public static void quicksort ( Comparable list [], int b, int e ) if ( b < e ) int pivot = splitlist( list, b, e ); quicksort( list, b, pivot - 1 ); quicksort( list, pivot + 1, e ); De eenvoud van een recursieve method wordt veelal als misleidend ervaren, omdat men zich het mechanisme tracht voor te stellen. We stellen echter met nadruk dat de gegeven tekst een getrouwe afspiegeling is van de begripsmatige eenvoud. Moeilijker is de method splitlist. Er zijn vele versies van soortgelijke method in omloop. Het erop gebaseerde sorteer algoritme is in de literatuur bekend onder de naam quicksort. Het algoritme is gebaseerd op de keuze van één van de array-elementen als vergelijkingswaarde, zeg V, die uiteindelijk op indexpositie s zal belanden. Array-elementen V worden links in het array verzameld, array-elementen V worden rechts in het array verzameld. Om er zeker van te zijn dat een permutatie van het oorspronkelijke array ontstaat, en dat er dus geen waarden verdwijnen, zullen we als enige operatie op het array de onderlinge verwisseling van twee waarden toestaan. De index s zullen we opsporen door gebruik te maken van twee wijzers (een linkerwijzer b en een rechterwijzer e) waarbij b van links naar rechts door list zal lopen en e van rechts naar links. We zullen ervoor 10

11 zorgen dat ten allen tijden alle elementen links van de linkerwijzer voldoen aan V en alle elementen rechts van de rechterwijzer aan V. Indien nu b=e hebben we ons doel bereikt. Alvorens de body van splitlist te geven nog enige analyse. We introduceren grootheden B en E hetgeen nodig is om in de specificatie nog iets over de beginwaarden van b en e te zeggen. We kiezen nu als hoofdinvariant: list[b..b 1] V list[e + 1..E] (3.2) (de permutatie-eis zullen we niet steeds opnieuw noemen). In een plaatje: V?? V B b e E Als we nu ervoor zorgen dat uiteindelijk: b = e V = list[b] (3.3) dan is b = e de gezochte waarde s. We zullen uiteindelijk list[b] = V bewerkstelligen door ervoor te zorgen dat altijd geldt: list[l] = V list[r] = V (3.4) Dit betekent dat we iedere keer als we de lus uitvoeren ervoor moeten zorgen dat de waarde van V in list[b] of in list[e] blijft staan. Als de waarde van V in list[b] staat, dan mogen we e veranderen zonder dat de waarde van list[b] verloren gaat. Hetzelfde geldt als de waarde van V in list[e] staat, dan mogen we b veranderen. In het eerste geval rechtvaardigt dit het naar links schuiven van e en in het tweede geval het naar rechts schuiven van b. We kunnen de body nu afmaken: private static int splitlist ( Comparable list [], int b, int e ) boolean vtoleft = true; // Invariant: list[b..b-1 ] <= V <= list[ e+1..e ] while ( b < e ) if ( list[b].compareto( list[e] ) > 0 ) 11

12 swapitems( list, b, e ); vtoleft =!vtoleft; if (vtoleft) // V == list[b] e --; else // V == list[e] b ++; return b; 3.6 Mergesort Als laatste sorteeralgoritme bestuderen we mergesort. Technisch zit mergesort iets anders in elkaar, zodat dit algoritme niet goed past in het voorgaande kader. Mergesort werkt niet met het verwisselen van elementen maar met het copieren van lijsten. Daarom heeft mergesort een andere interface dan we tot nog toe gewend waren. public static void mergesort ( Comparable list [], Comparable temp [], int l, int r ) int i,j,k, middle; if ( r-l > 0) middle = (r + l) / 2; mergesort(list, temp, l, middle); mergesort(list, temp, middle+1, r); for (i = l ; i <= middle ; i ++ ) temp[i] = list[i]; for (i = middle + 1 ; i <= r ; i ++ ) temp[r + middle i] = list[i]; 12

13 i = l; j = r; for ( k = l ; k <= r ; k ++ ) if ( temp[i].compareto(temp[j]) < 0 ) list[k] = temp[i]; i ++; else list[k] = temp[j]; j--; Mergesort bewerkt een array. Het algoritme is heel simpel. Deel het te bewerken array in twee ongeveer gelijke delen. Sorteer het eerste en tweede deel met mergesort en voeg deze twee resultaten samen (merge). Deze recursieve methode eindigt als het te sorteren array slechts één element bevat. Het samenvoegen van twee gesorteerde lijsten is heel simpel. Vergelijk de twee eerste elementen en plaats de kleinste in het resulterende array en ga verder met het volgende element. Om een in situ algoritme te schrijven hebben we een hulp array temp nodig. Het is veel natuurlijker om mergesort voor echte lijsten en niet voor lijsten opgeslagen in array s te schrijven. We vragen jullie om tijdens het practicum mergesort voor lijsten te implementeren. 3.7 Iets over efficiëntie Bij vergelijking van een aantal algoritmen met het zelfde einddoel speelt het begrip efficientie een belangrijke rol. Een algoritme is efficiënter, naarmate deze sneller tot resultaat komt en/of daarbij minder geheugenruimte nodig heeft. Bij de meeste besproken algoritmen is het geheugengebruik (ruimte nodig voor hulpvariabelen bijvoorbeeld) ongeveer vergelijkbaar. 2 ) De uitzondering is merge sort, die een hulp array nodig heeft ter grootte n. We zullen ons hier verder beperken tot de snelheid. Een mate voor de snelheid kan (in dit geval) zijn het aantal vergelijkingen en het aantal verwisselingen van array-elementen in het algoritme. Zowel voor insertion sort als voor selection sort is het aantal vergelijkingen evenredig met het kwadraat van het aantal elementen van de lijst list. We spreken dan van O n 2 (orde grootte n 2 ). Dit houdt in, dat vier keer zoveel elementen in een lijst 16 keer zoveel 2 ) Dat is niet helemaal waar. De recursieve aanroepen vergen ook extra geheugenruimte. 13

14 vergelijkingen tot gevolg zal hebben. Partition sort is echter nog veel beter. In de method splitlist is het aantal vergelijkingen en het aantal verwisselingen O n (alle elementen uit het betreffende interval worden eenmaal beschouwd en zijn in principe kandidaat om verwisseld te worden). Indien elke partitie het interval middendoor deelt, zijn log n opdelingen nodig (dan is elk interval één element groot). In totaal komen we zo voor zowel het aantal verwisselingen als het aantal vergelijkingen in dit gunstige geval uit op O n log n, hetgeen beter is dan selection sort en insertion sort. Een partitie kan ook steeds slecht uitvallen en het interval opdelen in een interval ter grootte van één element en een interval ter grootte alles-min-één. In dat geval loop de efficientie terug tot O n 2. We spreken dan van een worst case-gedrag. Meestal is partition sort dus behoorlijk snel en wordt daarom ook wel quicksort genoemd. Heapsort heeft ook een O n log n complexiteit, omdat upheap en downheap een O log n complexiteit hebben en deze ieder n keer worden aangeroepen. Heapsort is gemiddeld langzamer dan quicksort, maar worst case is heapsort nog steeds O n log n, terwijl quicksort O n 2 kan worden. Ook heeft heapsort minder geheugen nodig. Het verschil komt door de heap structuur, die gegarandeerd een gebalanceerde boom is. Ook mergesort is efficiënt doordat we het array hier iedere keer in twee ongeveer gelijke stukken delen, wat ook neerkomt op een gebalanceerde boomstructuur, als we de recursieve opsplitsing bekijken. De diepte van de recursie is dus beperkt tot 2 log n. Bij iedere aanroep is het de complexiteit in de orde van het aantal elementen in het segment dat gesorteerd moet worden door die aanroep. Alle aanroepen op een bepaalde diepte van de recursie bij elkaar doen dus O n werk, de recursie heeft een maximum diepte van O 2 log n, dus de totale complexiteit is O n log n. De keuze voor één van de laatste drie methoden moet eerder op basis van geheugen gebruik, en toepassing worden gezocht, dan dat er één duidelijk de beste is. Mergesort heeft als voordeel dat ook files, of linked lists ermee gesorteerd kunnen worden. Sorteren van data in files is nodig als de data niet in het geheugen passen. Heapsort is een goede alrounder: niet zo snel als quicksort, maar zuiniger met geheugen, en gegarandeerd O n log n. 14

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

Tijd is geen goede maatstaf, want is afhankelijk van computer waarop algoritme wordt gedraaid. Complexiteit of efficiëntie van algoritmen Hoe meet je deze? Tijd is geen goede maatstaf, want is afhankelijk van computer waarop algoritme wordt gedraaid. Een betere maatstaf is het aantal berekeningsstappen

Nadere informatie

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

public boolean equaldates() post: returns true iff there if the list contains at least two BirthDay objects with the same daynumber Tentamen TI1310 Datastructuren en Algoritmen, 15 april 2011, 9.00-12.00 TU Delft, Faculteit EWI, Basiseenheid Software Engineering Bij het tentamen mag alleen de boeken van Goodrich en Tamassia worden

Nadere informatie

Zevende college complexiteit. 17 maart Ondergrens sorteren, Quicksort

Zevende college complexiteit. 17 maart Ondergrens sorteren, Quicksort College 7 Zevende college complexiteit 17 maart 2008 Ondergrens sorteren, Quicksort 1 Sorteren We bekijken sorteeralgoritmen gebaseerd op het doen van vergelijkingen van de vorm A[i] < A[j]. Aannames:

Nadere informatie

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

Datastructuren. Analyse van algoritmen. José Lagerberg. FNWI, UvA. José Lagerberg (FNWI, UvA) Datastructuren 1 / 46 Datastructuren Analyse van algoritmen José Lagerberg FNWI, UvA José Lagerberg (FNWI, UvA) Datastructuren 1 / 46 Datastructuren en Algoritmen Datastructuren, 6 ECTS eerstejaars Bachelor INF Datastructuren,

Nadere informatie

Zevende college algoritmiek. 23/24 maart Verdeel en Heers

Zevende college algoritmiek. 23/24 maart Verdeel en Heers Zevende college algoritmiek 23/24 maart 2017 Verdeel en Heers 1 Algoritmiek 2017/Backtracking Tweede Programmeeropdracht 0 1 2 3 0 1 2 3 4 1 2 3 4 5 2 Algoritmiek 2017/Backtracking Tweede Programmeeropdracht

Nadere informatie

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

Elfde college algoritmiek. 18 mei Algoritme van Dijkstra, Heap, Heapify & Heapsort Algoritmiek 018/Algoritme van Dijkstra Elfde college algoritmiek 18 mei 018 Algoritme van Dijkstra, Heap, Heapify & Heapsort 1 Algoritmiek 018/Algoritme van Dijkstra Uit college 10: Voorb. -1- A B C D

Nadere informatie

Java Programma structuur

Java Programma structuur Java Programma structuur public class Bla // div. statements public static void main(string argv[]) // meer spul Voortgezet Prog. voor KI, week 4:11 november 2002 1 Lijsten Voorbeelden 2, 3, 5, 7, 13 Jan,

Nadere informatie

Datastructuren en algoritmen voor CKI

Datastructuren en algoritmen voor CKI Datastructuren en algoritmen voor CKI Jeroen Bransen 1 11 september 2015 1 met dank aan Hans Bodlaender en Gerard Tel Heaps en heapsort Heap 1 2 3 4 5 6 7 8 9 10 16 14 10 8 7 9 3 2 4 1 16 14 10 8 7 9 3

Nadere informatie

Zevende college Algoritmiek. 6 april Verdeel en Heers

Zevende college Algoritmiek. 6 april Verdeel en Heers Zevende college Algoritmiek 6 april 2018 Verdeel en Heers 1 Algoritmiek 2018/Backtracking Programmeeropdracht 2 Puzzel 2: D O N A L D G E R A L D + R O B E R T Elke letter stelt een cijfer voor (0,1,...,9)

Nadere informatie

Zevende college algoritmiek. 24 maart Verdeel en Heers

Zevende college algoritmiek. 24 maart Verdeel en Heers Zevende college algoritmiek 24 maart 2016 Verdeel en Heers 1 Verdeel en heers 1 Divide and Conquer 1. Verdeel een instantie van het probleem in twee (of meer) kleinere instanties 2. Los de kleinere instanties

Nadere informatie

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

Zevende college complexiteit. 7 maart Mergesort, Ondergrens sorteren (Quicksort) College 7 Zevende college complexiteit 7 maart 2017 Mergesort, Ondergrens sorteren (Quicksort) 1 Inversies Definitie: een inversie van de permutatie A[1],A[2],...,A[n] is een paar (A[i],A[j]) waarvoor

Nadere informatie

Elementary Data Structures 3

Elementary Data Structures 3 Elementary Data Structures 3 Ferd van Odenhoven Fontys Hogeschool voor Techniek en Logistiek Venlo Software Engineering 29 september 2014 ODE/FHTBM Elementary Data Structures 3 29 september 2014 1/14 Meer

Nadere informatie

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

Programmeermethoden. Recursie. Walter Kosters. week 11: november kosterswa/pm/ Programmeermethoden Recursie Walter Kosters week 11: 20 24 november 2017 www.liacs.leidenuniv.nl/ kosterswa/pm/ 1 Vierde programmeeropgave 1 De Grote getallen programmeren we als volgt: week 1: pointerpracticum,

Nadere informatie

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

Programmeermethoden. Recursie. week 11: november kosterswa/pm/ Programmeermethoden Recursie week 11: 21 25 november 2016 www.liacs.leidenuniv.nl/ kosterswa/pm/ 1 Pointers Derde programmeeropgave 1 Het spel Gomoku programmeren we als volgt: week 1: pointerpracticum,

Nadere informatie

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

Zesde college complexiteit. 19 maart Mergesort, Ondergrens sorteren Quicksort, Shellsort College 6 Zesde college complexiteit 19 maart 2019 Mergesort, Ondergrens sorteren Quicksort, Shellsort 1 Vorige keer Voor sorteeralgoritmen gebaseerd op arrayvergelijkingen, waarbij per arrayvergelijking

Nadere informatie

Opgaven QuickSort 3 mei 2019, Werkgroep, Datastructuren.

Opgaven QuickSort 3 mei 2019, Werkgroep, Datastructuren. Opgaven QuickSort 3 mei 2019, Werkgroep, Datastructuren. Als je klaar bent, maak dan de opgaven van vorige keer af. Cijfer: Op een toets krijg je meestal zes tot acht opgaven. 1. Doe QuickSort: Voer QuickSort

Nadere informatie

Modelleren en Programmeren

Modelleren en Programmeren Modelleren en Programmeren Jeroen Bransen 6 december 2013 Terugblik Programma en geheugen Opdrachten Variabelen Methoden Objecten Klasse Programma en geheugen Opdrachten Variabelen zijn gegroepeerd in

Nadere informatie

Datastructuren: stapels, rijen en binaire bomen

Datastructuren: stapels, rijen en binaire bomen Programmeermethoden Datastructuren: stapels, rijen en binaire bomen week 12: 23 27 november 2015 www.liacs.leidenuniv.nl/ kosterswa/pm/ 1 Inleiding In de informatica worden Abstracte DataTypen (ADT s)

Nadere informatie

Hoofdstuk 2. Week 4: Datastructuren. 2.1 Leesopdracht. 2.2 Bomen. 2.3 Definitie

Hoofdstuk 2. Week 4: Datastructuren. 2.1 Leesopdracht. 2.2 Bomen. 2.3 Definitie Hoofdstuk 2 Week 4: Datastructuren 2.1 Leesopdracht In het hoorcollege komen lijsten en bomen aan de orde. De eerste datastructuur komt in het boek in bladzijden 317-333 aan de orde. In dit dictaat komt

Nadere informatie

Modelleren en Programmeren

Modelleren en Programmeren Modelleren en Programmeren Jeroen Bransen 9 december 2015 Foreach String arrays Boomstructuren Interfaces Ingebouwde datastructuren Quiz Foreach Foreach Speciale versie van for om iets voor alle elementen

Nadere informatie

Modelleren en Programmeren

Modelleren en Programmeren Modelleren en Programmeren Jeroen Bransen 13 december 2013 Terugblik Fibonacci public class Fibonacci { public static void main(string[] args) { // Print het vijfde Fibonaccigetal System.out.println(fib(5));

Nadere informatie

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

Stacks and queues. Introductie 45. Leerkern 45. Terugkoppeling 49. Uitwerking van de opgaven 49 Stacks and queues Introductie 45 Leerkern 45 6.1 Stacks 45 6.2 Queues 47 6.3 Double-ended queues 48 Terugkoppeling 49 Uitwerking van de opgaven 49 Bijlage: Diagrammen belangrijkste interfaces en klassen

Nadere informatie

Voortgezet Prog. voor KI

Voortgezet Prog. voor KI Voortgezet Prog. voor KI Docent: Michael Wilkinson IWI 142 tel. 050-3638140 (secr. 3633939) Frank Brokken RC 352 tel. 050-3633688 Voorkennis: Inleiding Programmeren voor KI (nieuwe stijl) Stof: Practicum

Nadere informatie

Uitgebreide uitwerking Tentamen Complexiteit, juni 2017

Uitgebreide uitwerking Tentamen Complexiteit, juni 2017 Uitgebreide uitwerking Tentamen Complexiteit, juni 017 Opgave 1. a. Een pad van de wortel naar een blad stelt de serie achtereenvolgende arrayvergelijkingen voor die het algoritme doet op zekere invoer.

Nadere informatie

Datastructuren en algoritmen voor CKI

Datastructuren en algoritmen voor CKI Datastructuren en algoritmen voor CKI Jeroen Bransen 1 30 september 2015 1 met dank aan Hans Bodlaender en Gerard Tel Dynamische verzamelingen Stack implementaties Array met maximale grootte Linked List

Nadere informatie

Algoritmiek. 15 februari Grafen en bomen

Algoritmiek. 15 februari Grafen en bomen Algoritmiek 15 februari 2019 Grafen en bomen 1 Grafen (herhaling) Een graaf G wordt gedefinieerd als een paar (V,E), waarbij V een eindige verzameling is van knopen (vertices) en E een verzameling van

Nadere informatie

Lineaire data structuren. Doorlopen van een lijst

Lineaire data structuren. Doorlopen van een lijst Lineaire data structuren array: vast aantal data items die aaneensluitend gestockeerd zijn de elementen zijn bereikbaar via een index lijst: een aantal individuele elementen die met elkaar gelinkt zijn

Nadere informatie

Small Basic Programmeren Text Console 2

Small Basic Programmeren Text Console 2 Oefening 1: Hoogste getal Je leest een reeks positieve gehele getallen in totdat je het getal 0 (nul) invoert. Daarna stopt de invoer en druk je een regel af met het hoogste getal uit de reeks. Voorbeeld:

Nadere informatie

Stacks and queues. Hoofdstuk 6

Stacks and queues. Hoofdstuk 6 Hoofdstuk 6 Stacks and queues I N T R O D U C T I E In dit hoofdstuk worden drie datastructuren stack, queue en deque behandeld. Om deze datastructuren te implementeren, worden onder andere arrays en linked

Nadere informatie

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

Tree traversal. Bomen zijn overal. Ferd van Odenhoven. 15 november 2011 15 november 2011 Tree traversal Ferd van Odenhoven Fontys Hogeschool voor Techniek en Logistiek Venlo Software Engineering 15 november 2011 ODE/FHTBM Tree traversal 15 november 2011 1/22 1 ODE/FHTBM Tree

Nadere informatie

TENTAMEN Programmeren 1 VOORBEELDUITWERKING

TENTAMEN Programmeren 1 VOORBEELDUITWERKING TENTAMEN Programmeren 1 vakcode: 213500 datum: 10 juli 2004 tijd: 9:00-12:30 uur VOORBEELDUITWERKING Algemeen Bij dit tentamen mag gebruik worden gemaakt van het boek van Niño/Hosch, en van de handleiding

Nadere informatie

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

Vierde college complexiteit. 26 februari Beslissingsbomen en selectie Toernooimethode Adversary argument Complexiteit 2019/04 College 4 Vierde college complexiteit 26 februari 2019 Beslissingsbomen en selectie Toernooimethode Adversary argument 1 Complexiteit 2019/04 Zoeken: samengevat Ongeordend lineair

Nadere informatie

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

Recursion. Introductie 37. Leerkern 37. Terugkoppeling 40. Uitwerking van de opgaven 40 Recursion Introductie 37 Leerkern 37 5.1 Foundations of recursion 37 5.2 Recursive analysis 37 5.3 Applications of recursion 38 Terugkoppeling 40 Uitwerking van de opgaven 40 Hoofdstuk 5 Recursion I N

Nadere informatie

Uitwerking tentamen Algoritmiek 9 juli :00 13:00

Uitwerking tentamen Algoritmiek 9 juli :00 13:00 Uitwerking tentamen Algoritmiek 9 juli 0 0:00 :00. (N,M)-game a. Toestanden: Een geheel getal g, waarvoor geldt g N én wie er aan de beurt is (Tristan of Isolde) b. c. Acties: Het noemen van een geheel

Nadere informatie

Programmeren in C++ Efficiënte zoekfunctie in een boek

Programmeren in C++ Efficiënte zoekfunctie in een boek Examen Software Ontwikkeling I 2e Bachelor Informatica Faculteit Wetenschappen Academiejaar 2010-2011 21 januari, 2011 **BELANGRIJK** 1. Lees eerst de volledige opgave (inclusief de hints/opmerkingen)!

Nadere informatie

Minimum Opspannende Bomen. Algoritmiek

Minimum Opspannende Bomen. Algoritmiek Minimum Opspannende Bomen Inhoud Het minimum opspannende bomen probleem Een principe om een minimum opspannende boom te laten groeien Twee greedy algoritmen + tijd en datastructuren: Het algoritme van

Nadere informatie

Een eenvoudig algoritme om permutaties te genereren

Een eenvoudig algoritme om permutaties te genereren Een eenvoudig algoritme om permutaties te genereren Daniel von Asmuth Inleiding Er zijn in de vakliteratuur verschillende manieren beschreven om alle permutaties van een verzameling te generen. De methoden

Nadere informatie

public boolean egualdates() post: returns true i f f there i f the l i s t contains at least two BirthDay objects with the same daynumber

public boolean egualdates() post: returns true i f f there i f the l i s t contains at least two BirthDay objects with the same daynumber Tentamen TI1310 Datastructuren en Algoritmen, 15 april 2011, 9.00-12.00 TU Delft, Faculteit EWI, Basiseenheid Software Engineering Bij het tentamen mag alleen de boeken van Goodrich en Tamassia worden

Nadere informatie

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

4EE11 Project Programmeren voor W. College 3, 2008 2009, Blok D Tom Verhoeff, Software Engineering & Technology, TU/e 4EE11 Project Programmeren voor W College 3, 2008 2009, Blok D Tom Verhoeff, Software Engineering & Technology, TU/e 1 Onderwerpen Grotere programma s ontwerpen/maken Datastructuren en algoritmes 2 Evolutie,

Nadere informatie

Tentamen Programmeren in C (EE1400)

Tentamen Programmeren in C (EE1400) TU Delft Tentamen Programmeren in C (EE1400) 5 april 2012, 9.00 12.00 Faculteit EWI - Zet op elk antwoordblad je naam en studienummer. - Beantwoord alle vragen zo nauwkeurig mogelijk. - Wanneer C code

Nadere informatie

Tweede college algoritmiek. 12 februari Grafen en bomen

Tweede college algoritmiek. 12 februari Grafen en bomen College 2 Tweede college algoritmiek 12 februari 2016 Grafen en bomen 1 Grafen (herhaling) Een graaf G wordt gedefinieerd als een paar (V,E), waarbij V een eindige verzameling is van knopen (vertices)

Nadere informatie

Uitgebreide uitwerking Tentamen Complexiteit, mei 2007

Uitgebreide uitwerking Tentamen Complexiteit, mei 2007 Uitgebreide uitwerking Tentamen Complexiteit, mei 007 Opgave. a. Een beslissingsboom beschrijft de werking van het betreffende algoritme (gebaseerd op arrayvergelijkingen) op elke mogelijke invoer. In

Nadere informatie

Uitwerking tentamen Algoritmiek 9 juni :00 17:00

Uitwerking tentamen Algoritmiek 9 juni :00 17:00 Uitwerking tentamen Algoritmiek 9 juni 2015 14:00 17:00 1. Clobber a. Toestanden: m x n bord met in elk hokje een O, een X of een -. Hierbij is het aantal O gelijk aan het aantal X of er is hooguit één

Nadere informatie

Tentamen Objectgeorienteerd Programmeren TI februari Afdeling ST Faculteit EWI TU Delft

Tentamen Objectgeorienteerd Programmeren TI februari Afdeling ST Faculteit EWI TU Delft I ' Tentamen Objectgeorienteerd Programmeren TI 1200 1 februari 2012 9.00-12.00 Afdeling ST Faculteit EWI TU Delft Bij dit tentamen mag je geen gebruik maken van hulpmiddelen zoals boek of slides. Dit

Nadere informatie

Uitwerking tentamen Analyse van Algoritmen, 29 januari

Uitwerking tentamen Analyse van Algoritmen, 29 januari 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

Nadere informatie

Eerste Toets Datastructuren 11 juli 2018, , Educ-α.

Eerste Toets Datastructuren 11 juli 2018, , Educ-α. Eerste Toets Datastructuren 11 juli 2018, 13.30 15.30, Educ-α. Motiveer je antwoorden kort! Stel geen vragen over deze toets; als je een vraag niet duidelijk vindt, schrijf dan op hoe je de vraag interpreteert

Nadere informatie

Hoofdstuk 7: Werken met arrays

Hoofdstuk 7: Werken met arrays Programmeren in Microsoft Visual Basic 6.0, lessenserie voor het voortgezet onderwijs HAVO/VWO David Lans, Emmauscollege, Marnix Gymnasium Rotterdam, januari 2004 Hoofdstuk 7: Werken met arrays 7.0 Leerdoel

Nadere informatie

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

recursie Hoofdstuk 5 Studeeraanwijzingen De studielast van deze leereenheid bedraagt circa 6 uur. Terminologie Hoofdstuk 5 Recursion I N T R O D U C T I E Veel methoden die we op een datastructuur aan kunnen roepen, zullen op een recursieve wijze geïmplementeerd worden. Recursie is een techniek waarbij een vraagstuk

Nadere informatie

Vierde college complexiteit. 16 februari Beslissingsbomen en selectie

Vierde college complexiteit. 16 februari Beslissingsbomen en selectie Complexiteit 2016/04 College 4 Vierde college complexiteit 16 februari 2016 Beslissingsbomen en selectie 1 Complexiteit 2016/04 Zoeken: samengevat Ongeordend lineair zoeken: Θ(n) sleutelvergelijkingen

Nadere informatie

Inleiding Programmeren 2

Inleiding Programmeren 2 Inleiding Programmeren 2 Gertjan van Noord November 28, 2016 Stof week 3 nogmaals Zelle hoofdstuk 8 en recursie Brookshear hoofdstuk 5: Algoritmes Datastructuren: tuples Een geheel andere manier om te

Nadere informatie

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

Achtste college algoritmiek. 12 april Verdeel en Heers. Dynamisch Programmeren Achtste college algoritmiek 12 april 2019 Verdeel en Heers Dynamisch Programmeren 1 Uit college 7: Partitie Partitie Partitie(A[l r]) :: // partitioneert een (sub)array, met A[l] als spil (pivot) p :=

Nadere informatie

Inleiding Programmeren 2

Inleiding Programmeren 2 Inleiding Programmeren 2 Gertjan van Noord November 26, 2018 Stof week 3 nogmaals Zelle hoofdstuk 8 en recursie Brookshear hoofdstuk 5: Algoritmes Datastructuren: tuples Een geheel andere manier om te

Nadere informatie

Javascript oefenblad 1

Javascript oefenblad 1 Leer de basis van Javascript. Javascript oefenblad 1 Niels van Velzen Javascript oefenblad 1 Pagina 2 Inleiding Javascript is niet altijd even makkelijk. Vooral aan het begin is het even wennen hoe de

Nadere informatie

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

Tree traversal. Ferd van Odenhoven. 15 november Fontys Hogeschool voor Techniek en Logistiek Venlo Software Engineering. Doorlopen van bomen Tree traversal Ferd van Odenhoven Fontys Hogeschool voor Techniek en Logistiek Venlo Software Engineering 15 november 2011 ODE/FHTBM Tree traversal 15 november 2011 1/22 1 ODE/FHTBM Tree traversal 15 november

Nadere informatie

Elke groep van 3 leerlingen heeft een 9 setje speelkaarten nodig: 2 t/m 10, bijvoorbeeld alle schoppen, of alle harten kaarten.

Elke groep van 3 leerlingen heeft een 9 setje speelkaarten nodig: 2 t/m 10, bijvoorbeeld alle schoppen, of alle harten kaarten. Versie 16 januari 2017 Sorteren unplugged Sorteren gebeurt heel veel. De namen van alle leerlingen in de klas staan vaak op alfabetische volgorde. De wedstrijden van een volleybal team staan op volgorde

Nadere informatie

Datastructuren: stapels, rijen en binaire bomen

Datastructuren: stapels, rijen en binaire bomen Programmeermethoden : stapels, rijen en binaire bomen Walter Kosters week 12: 26 30 november 2018 www.liacs.leidenuniv.nl/ kosterswa/pm/ 1 en Vierde programmeeropgave Othello programmeren we als volgt:

Nadere informatie

Datastructuren en Algoritmen

Datastructuren en Algoritmen Datastructuren en Algoritmen Tentamen Vrijdag 6 november 2015 13.30-16.30 Toelichting Bij dit tentamen mag je gebruik maken van een spiekbriefje van maximaal 2 kantjes. Verder mogen er geen hulpmiddelen

Nadere informatie

Opgaven Zoekbomen Datastructuren, 20 juni 2018, Werkgroep.

Opgaven Zoekbomen Datastructuren, 20 juni 2018, Werkgroep. Opgaven Zoekbomen Datastructuren, 20 juni 2018, Werkgroep. Gebruik deze opgaven, naast die uit het boek, om de stof te oefenen op het werkcollege. Cijfer: Op een toets krijg je meestal zes tot acht opgaven.

Nadere informatie

Opgaven Zoekbomen Datastructuren, 15 juni 2016, Werkgroep.

Opgaven Zoekbomen Datastructuren, 15 juni 2016, Werkgroep. Opgaven Zoekbomen Datastructuren, 15 juni 2016, Werkgroep. Gebruik deze opgaven, naast die uit het boek, om de stof te oefenen op het werkcollege. Cijfer: Op een toets krijg je meestal zes tot acht opgaven.

Nadere informatie

Universiteit van Amsterdam FNWI. Voorbeeld van tussentoets Inleiding programmeren

Universiteit van Amsterdam FNWI. Voorbeeld van tussentoets Inleiding programmeren Universiteit van Amsterdam FNWI Voorbeeld van tussentoets Inleiding programmeren Opgave 1: Wat is de uitvoer van dit programma? public class Opgave { static int i = 0 ; static int j = 1 ; int i = 1 ; int

Nadere informatie

Informatica: C# WPO 11

Informatica: C# WPO 11 Informatica: C# WPO 11 1. Inhoud Pass by reference (ref, out), recursie, code opdelen in verschillende codebestanden 2. Oefeningen Demo 1: Swapfunctie Demo 2: TryParse(int) Demo 3: Recursion Tree Demo

Nadere informatie

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

Vierde college algoritmiek. 2 maart Toestand-actie-ruimte Exhaustive Search Algoritmiek 2018/Toestand-actie-ruimte Vierde college algoritmiek 2 maart 2018 Toestand-actie-ruimte Exhaustive Search 1 Algoritmiek 2018/Toestand-actie-ruimte Kannen Voorbeeld 4: Kannenprobleem We hebben

Nadere informatie

is eigenlijk overbodig!

is eigenlijk overbodig! Array Declaratie Creatie Opvragen Wijzigen Lengte is eigenlijk overbodig! array: oject dat een rij waarden bevat, met speciale notaties Invoegen Achtervoegen String [ ] a; a = new String[10]; a[5] a[5]

Nadere informatie

REEKS I. Zaterdag 6 november 2010, 9u

REEKS I. Zaterdag 6 november 2010, 9u TEST INFORMATICA 1STE BACHELOR IN DE INGENIEURSWETENSCHAPPEN - ACADEMIEJAAR 2010-2011 REEKS I Zaterdag 6 november 2010, 9u NAAM :... VRAAG 1: MINSTENS [5 PUNTEN] Schrijf een methode minstens(), met twee

Nadere informatie

10 Meer over functies

10 Meer over functies 10 Meer over functies In hoofdstuk 5 hebben we functies uitgebreid bestudeerd. In dit hoofdstuk bekijken we drie andere aspecten van functies: recursieve functies dat wil zeggen, functies die zichzelf

Nadere informatie

Vijfde college complexiteit. 21 februari Selectie Toernooimethode Adversary argument

Vijfde college complexiteit. 21 februari Selectie Toernooimethode Adversary argument Complexiteit 2017/05 College 5 Vijfde college complexiteit 21 februari 2017 Selectie Toernooimethode Adversary argument 1 Complexiteit 2017/05 Opgave 28 Gegeven twee oplopend gesorteerde even lange rijen

Nadere informatie

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

Examen Programmeren 2e Bachelor Elektrotechniek en Computerwetenschappen Faculteit Ingenieurswetenschappen Academiejaar juni, 2010 Examen Programmeren 2e Bachelor Elektrotechniek en Computerwetenschappen Faculteit Ingenieurswetenschappen Academiejaar 2009-2010 16 juni, 2010 **BELANGRIJK** 1. Schrijf je naam onderaan op elk blad. 2.

Nadere informatie

Divide & Conquer: Verdeel en Heers vervolg. Algoritmiek

Divide & Conquer: Verdeel en Heers vervolg. Algoritmiek Divide & Conquer: Verdeel en Heers vervolg Algoritmiek Algoritmische technieken Vorige keer: Divide and conquer techniek Aantal toepassingen van de techniek Analyse met Master theorem en substitutie Vandaag:

Nadere informatie

Voorbeeldtentamen Inleiding programmeren (IN1608WI), Oktober 2003, , Technische Universiteit Delft, Faculteit EWI, Afdeling 2.

Voorbeeldtentamen Inleiding programmeren (IN1608WI), Oktober 2003, , Technische Universiteit Delft, Faculteit EWI, Afdeling 2. Voorbeeldtentamen Inleiding programmeren (IN1608WI), Oktober 2003, 14.00-15.30, Technische Universiteit Delft, Faculteit EWI, Afdeling 2. Dit tentamen bestaat uit twee delen. Deel 1 (14.00-14.45, gesloten

Nadere informatie

Datastructuren Uitwerking jan

Datastructuren Uitwerking jan Datastructuren Uitwerking jan 16 1 1a) Een ADT wordt gekenmerkt door de opgeslagen gegevens en de beschikbare operaties. De Priority Queue bevat en verzameling elementen waarbij elk element en eigen waarde

Nadere informatie

Modelleren en Programmeren

Modelleren en Programmeren Modelleren en Programmeren Jeroen Bransen 11 december 2015 Ingebouwde datastructuren Meer boomstructuren Access specifiers Gebruikersinvoer Codestijl Packages SAT-solver Ingebouwde datastructuren Ingebouwde

Nadere informatie

algoritmiek - antwoorden

algoritmiek - antwoorden 2016 algoritmiek - antwoorden F. Vonk versie 1 28-8-2016 inhoudsopgave eenvoudige algoritmes... - 3 - complexe algoritmes... - 7 - zoeken (vwo)... - 10 - sorteren (vwo)... - 12 - Dit werk is gelicenseerd

Nadere informatie

Opgaven Abstracte Datastructuren Datastructuren, Werkgroep, 31 mei 2017.

Opgaven Abstracte Datastructuren Datastructuren, Werkgroep, 31 mei 2017. Opgaven Abstracte Datastructuren Datastructuren, Werkgroep, 31 mei 2017. Gebruik deze opgaven, naast die uit het boek, om de stof te oefenen op het werkcollege. Cijfer: Op een toets krijg je meestal zes

Nadere informatie

Programmeren in Java les 3

Programmeren in Java les 3 4 september 2015 Deze les korte herhaling vorige week loops methodes Variabelen Soorten variabelen in Java: integer: een geheel getal, bijv. 1,2,3,4 float: een gebroken getal, bijv. 3.1415 double: een

Nadere informatie

Modelleren en Programmeren

Modelleren en Programmeren Modelleren en Programmeren Jeroen Bransen 25 november 2015 Herhaling Meer herhaling Recursie Mutuele recursie Objecten Herhaling Fibonacci class Fibonacci { public static void fibonaccitot(int bovengrens)

Nadere informatie

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

Twaalfde college algoritmiek. 13 mei Branch & Bound Heap, Heapsort & Heapify Algoritmiek 2016/Branch & Bound Twaalfde college algoritmiek 13 mei 2016 Branch & Bound Heap, Heapsort & Heapify 1 Algoritmiek 2016/Branch & Bound TSP met Branch & Bound Mogelijke ondergrenzen voor de

Nadere informatie

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

Tweede Toets Datastructuren 29 juni 2016, , Educ-Γ. Tweede Toets Datastructuren 29 juni 2016, 13.30 15.30, Educ-Γ. Motiveer je antwoorden kort! Zet je mobiel uit. Stel geen vragen over deze toets; als je een vraag niet duidelijk vindt, schrijf dan op hoe

Nadere informatie

Vierde college complexiteit. 14 februari Beslissingsbomen

Vierde college complexiteit. 14 februari Beslissingsbomen College 4 Vierde college complexiteit 14 februari 2017 Restant zoeken Beslissingsbomen 1 Binair zoeken Links := 1; Rechts := n; while Links Rechts do Midden := Links + Rechts 2 ; if X = A[Midden] then

Nadere informatie

De doorsnede van twee verzamelingen vinden

De doorsnede van twee verzamelingen vinden De doorsnede van twee verzamelingen vinden Daniel von Asmuth Inleiding Dit artikel probeert enkele algoritmen te vergelijken om de doorsnede van twee verzamelingen of rijen van getallen te vinden. In een

Nadere informatie

Een gelinkte lijst in C#

Een gelinkte lijst in C# Een gelinkte lijst in C# In deze tutorial ga demonstreren hoe je een gelinkte lijst kan opstellen in C#. We gaan een klasse schrijven, die een gelijkaardige functionaliteit heeft als een ArrayList, namelijk

Nadere informatie

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.

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. Grafen Grafen Een graaf bestaat uit een verzameling punten (ook wel knopen, of in het engels vertices genoemd) en een verzameling kanten (edges) of pijlen (arcs), waarbij de kanten en pijlen tussen twee

Nadere informatie

Datastructuren; (Zoek)bomen

Datastructuren; (Zoek)bomen Datastructuren; (Zoek)bomen Bomen, zoekbomen, gebalanceerde zoekbomen José Lagerberg FNWI, UvA José Lagerberg (FNWI, UvA) Datastructuren; (Zoek)bomen 1 / 50 Bomen Traversal van bomen Datastructuur van

Nadere informatie

Modelleren en Programmeren

Modelleren en Programmeren Modelleren en Programmeren Jeroen Bransen 27 november 2015 Recursie Objecten Constructors Aanpassen variabelen this keyword Recursie Recursie Recursieve functie roept zichzelf (direct of indirect) aan

Nadere informatie

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

Als een PSD selecties bevat, deelt de lijn van het programma zich op met de verschillende antwoorden op het vraagstuk. HOOFDSTUK 3 3.1 Stapsgewijs programmeren In de vorige hoofdstukken zijn programmeertalen beschreven die imperatief zijn. is het stapsgewijs in code omschrijven wat een programma moet doen, net als een

Nadere informatie

Tentamen Imperatief en Object-georiënteerd programmeren in Java voor CKI

Tentamen Imperatief en Object-georiënteerd programmeren in Java voor CKI Tentamen Imperatief en Object-georiënteerd programmeren in Java voor CKI Vrijdag 22 januari 2010 Toelichting Dit is een open boek tentamen. Communicatie en het gebruik van hulpmiddelen zijn niet toegestaan.

Nadere informatie

Opgaven Heaps Datastructuren, 8 juni 2018, Werkgroep.

Opgaven Heaps Datastructuren, 8 juni 2018, Werkgroep. Opgaven Heaps Datastructuren, 8 juni 2018, Werkgroep. Gebruik deze opgaven, naast die uit het boek, om de stof te oefenen op het werkcollege. Cijfer: Op een toets krijg je meestal zes tot acht opgaven.

Nadere informatie

NAAM: Programmeren 1 Examen 29/08/2012

NAAM: Programmeren 1 Examen 29/08/2012 Programmeren 29 augustus 202 Prof. T. Schrijvers Instructies Schrijf al je antwoorden op deze vragenbladen (op de plaats die daarvoor is voorzien). Geef ook je kladbladen af. Bij heel wat vragen moet je

Nadere informatie

Vijfde college algoritmiek. 2/3 maart Exhaustive search

Vijfde college algoritmiek. 2/3 maart Exhaustive search Vijfde college algoritmiek 2/3 maart 2017 Exhaustive search 1 Voor- en nadelen Brute force: Voordelen: - algemeen toepasbaar - eenvoudig - levert voor een aantal belangrijke problemen (zoeken, patroonherkenning)

Nadere informatie

Dynamisch Programmeren. Het Rugzakprobleem

Dynamisch Programmeren. Het Rugzakprobleem INLEIDING Dynamisch Programmeren 1 Dynamisch Programmeren Section Page Inleiding................................................. 1 1 Oplossing................................................ 2 2 Subprobleem.............................................

Nadere informatie

IMP Uitwerking week 13

IMP Uitwerking week 13 IMP Uitwerking week 13 Opgave 1 Nee. Anders moet bijvoorbeeld een venster applicatie een subklasse zijn van zowel Frame en WindowListener. Als de applicatie ook een button of een menu heeft, dan moet het

Nadere informatie

Tentamen Programmeren in C (EE1400)

Tentamen Programmeren in C (EE1400) TU Delft Tentamen Programmeren in C (EE1400) 3 feb. 2012, 9.00 12.00 Faculteit EWI - Zet op elk antwoordblad je naam en studienummer. - Beantwoord alle vragen zo nauwkeurig mogelijk. - Wanneer C code gevraagd

Nadere informatie

Gegevens invullen in HOOFDLETTERS en LEESBAAR, aub. Belgische Olympiades in de Informatica (duur : maximum 1u15 )

Gegevens invullen in HOOFDLETTERS en LEESBAAR, aub. Belgische Olympiades in de Informatica (duur : maximum 1u15 ) OI 2010 Finale 12 Mei 2010 Gegevens invullen in HOOFDLETTERS en LEESBAAR, aub VOORNAAM :....................................................... NAAM :..............................................................

Nadere informatie

Verslag Opdracht 4: Magische Vierkanten

Verslag Opdracht 4: Magische Vierkanten Verslag Opdracht 4: Magische Vierkanten Stefan Schrama, Evert Mouw, Universiteit Leiden 2007-08-14 Inhoudsopgave 1 Inleiding 2 2 Uitleg probleem 2 3 Theorie 2 4 Aanpak 2 5 Implementatie 4 6 Experimenten

Nadere informatie

2 Recurrente betrekkingen

2 Recurrente betrekkingen WIS2 1 2 Recurrente betrekkingen 2.1 Fibonacci De getallen van Fibonacci Fibonacci (= Leonardo van Pisa), 1202: Bereken het aantal paren konijnen na één jaar, als 1. er na 1 maand 1 paar pasgeboren konijnen

Nadere informatie

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

HOOFDSTUK 3. Imperatief programmeren. 3.1 Stapsgewijs programmeren. 3.2 If Then Else. Module 4 Programmeren HOOFDSTUK 3 3.1 Stapsgewijs programmeren De programmeertalen die tot nu toe genoemd zijn, zijn imperatieve of procedurele programmeertalen. is het stapsgewijs in code omschrijven wat een programma moet

Nadere informatie

De symmetrische min-max heap

De symmetrische min-max heap De symmetrische min-max heap Tweede programmeeropdracht Datastructuren, najaar 2006 De symmetrische min-max heap (SMM heap) is een datastructuur waarin getallen (of andere elementen met een lineaire ordening)

Nadere informatie

Achtste college algoritmiek. 8 april Dynamisch Programmeren

Achtste college algoritmiek. 8 april Dynamisch Programmeren Achtste college algoritmiek 8 april 2016 Dynamisch Programmeren 1 Werkcollege-opgave Dutch Flag Problem Gegeven een array gevuld met R, W, en B. Reorganiseer dit array zo dat van links naar rechts eerst

Nadere informatie

Derde college complexiteit. 7 februari Zoeken

Derde college complexiteit. 7 februari Zoeken College 3 Derde college complexiteit 7 februari 2017 Recurrente Betrekkingen Zoeken 1 Recurrente betrekkingen -1- Rij van Fibonacci: 0,1,1,2,3,5,8,13,21,... Vanaf het derde element: som van de voorgaande

Nadere informatie