De doorsnede van twee verzamelingen vinden
|
|
- Casper van der Zee
- 8 jaren geleden
- Aantal bezoeken:
Transcriptie
1 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 rij kunnen elementen meerdere keren voorkomen; we spreken in plaats van sets over bags of multisets de Nederlandse term is me niet bekend die zonder extra moeite verwerkt kunnen worden. I. Naïef: exhaustive search Zet beide verzamelingen in twee rijen (arrays of lists). Loop elk element van verzameling B af om te zien of het eerste element van A daarin voorkomt, doe hetzelfde met het tweede element van A, etc. De meeste besproken algoritmen werken ook voor rijen getallen waarin elementen meer dan eens kunnen voorkomen. Het probleem wordt opgelost in O(n^2) stappen. Vanwege de eenvoud gebruiken we deze methode soms voor kleine verzamelingen. II. Vectoren van bits In de programmeertaal Pascal is het berekenen van de doorsnede of vereniging van twee verzamelingen een ingebouwde bewerking. Deelverzamelingen van een domein worden gerepresenteerd door vectoren van bits: als het i e bit hoog is dan bevat de verzameling dat element. Sorteren is hiermee niet nodig. Voor deelverzamelingen van grote domeinen kost deze methode veel tijd en geheugen, namelijk O(#D), waarin #D de grootte van het domein is. Als we overstappen op vectoren van gehele van gehele getallen dan kunnen we daarmee een eenvoudig sorteeralgoritme vormen. Initialiseer een array A ter grootte van #D met nullen en lees de getallen in: als je een waarde i vindt, dan hoog je A[i] op. Daarna loop je het array af en als A[i] == c dan druk je c keer het getal i af. De rekentijd is in de orde van O(#D + n) stappen, het benodigde geheugen kan onpraktisch zijn als D bijvoorbeeld uit de 32 bits egers bestaat. III. Sorteren Het probleem is gemakkelijker op te lossen wanneer beide verzamelingen gesorteerd zijn; als dat niet het geval is, kunnen we het quicksort sorteeralgoritme aanpassen zodat de doorsnede al tijdens het sorteren wordt gevonden. De programmacode in C is te vinden als listing 1 in de bijlagen. Het belangrijkste onderdeel is de functie partition(), die een deelerval van rij A van index s tot en met m verdeelt in drie delen: van s t/m j komen getallen die kleiner zijn dan de pivot, tussen j en i staan waarden gelijk aan de pivot en van i t/m m waarden groter dan de pivot, waarvoor we een willekeurig element van rij A kiezen.
2 begin i = s j = m eind s Figuur 1 < pivot = pivot j i > pivot m De functie werkt door eerst de delen van het array links van index i en rechts van j af te zoeken naar getallen groter of gelijk aan de pivot en omgekeerd en telkens paren getallen te verwisselen. Daarna worden de linker en rechter delen nog eens afgezocht naar waarden die gelijk zijn aan de pivot. De functie retourneert de grenzen i en j; de gevonden segmenten kunnen leeg zijn. De hoofdfunctie ersect() kiest het midden van rij A als pivot en roept de functie partition() aan voor rij A en B, tenzij de te sorteren deelrij slechts één element lang is. Daarna roept de functie zich recursief aan op de deelrijen kleiner dan respectievelijk groter dan de pivot. De functies report() en report2() drukken de gevonden waarden af. Dit lost het probleem op in O(n.log(n)) stappen; een goede keus als de invoergegevens ongesorteerd zijn. Een nadeel van de aanpassing is dat de rijen na afloop niet volledig gesorteerd zijn, maar daarvoor besparen we iets tijd door af en toe getallen over te slaan. IV. Hashing en radix sort Hashing kan sneller zijn dan sorteren. Daarvoor kiezen het aantal hash buckets bijvoorbeeld op de wortel van #B (als #A > #B) en verdelen de rij A daarover en verdelen de rij B over een even grote hash tabel. Daarna moet je de doorsneden bepalen tussen de inhoud van corresponderende paren buckets, bijvoorbeeld met algoritme III. Als tenminste één van de buckets leeg is, kun je die overslaan. Dit algoritme zal Ω(n) rekenstappen nodig hebben, maar de output is ongesorteerd. Een verwante techniek heet radix sort. Hierin begin je met de invoer te verdelen over een (zes)tiental buckets aan hand van het meest significante (hexadecimale) cijfer. De buckets verdeel je dan één voor één over kleinere buckets aan hand van het tweede cijfer. Na het laatste cijfer houd je groepen over waarin alle getallen gelijk zijn. Hiermee kun je gehele getallen sorteren in O(#D + n) rekentijd. Om doorsneden van twee verzamelingen te vinden, verdelen we ze simultaan over de buckets. Als een bucket A i leeg is, dan kunnen we de bucket B i overslaan. Aan het eind hoeven we alleen van de aantallen getallen in corresponderende buckets telkens de kleinste te nemen. Hiermee is de output netjes gesorteerd. V. Klassiek: twee rijen mergen Als de rijen A en B al gesorteerd zijn, dan kan de doorsnede eenvoudig worden gevonden door telkens de kleinste elementen van beide rijen te vergelijken: als ze gelijk zijn rapporteer je het getal en verwijdert beide elementen, anders verwijder je het kleinste en vergelijkt weer de twee kleinste, enzovoorts. Dit lost het probleem eenvoudig op in O(n) stappen. Voor multisets kan het algoritme iets worden versneld met een array waarin per positie de waarde van het element plus het aantal malen dat ze voorkomt worden opgeslagen. VI. Binaire zoekbomen De representatie met vectoren van bits verspilt geheugen wanneer het domein groot is en de verzamelingen kleiner; in zo'n geval zijn gelinkte lijsten beter, maar binaire bomen zijn sneller
3 te doorzoeken. Omdat het domein bekend is, is het niet nodig om de zoeksleutels expliciet op te slaan; een waarde correspondeert met een vaste positie in de boom. Daardoor zijn wel extra erne knopen benodigd voor getallen die niet in de verzameling voorkomen. In plaats van een bit, gebruiken we een eger veld om te tellen hoe vaak een getal in de verzameling voorkomt. De broncode is te vinden in listing 2. Stelling I. De functie ersect() drukt alle elementen van de doorsnede van boom A en boom B éénmaal af in stijgende volgorde. We geven een synopsis van het bewijs. De functie ersect() bestaat uit niets meer dan een aanroep van ersect_r( tree_a, tree_b, 0, M 1) voor het domein [0..M 1]. A. Als één (deel)verzameling leeg is, dan is de doorsnede van A en B ook leeg. Het if statement zorgt in dat geval dat de functie geen uitvoer produceert. if( node1 == NULL node2 == NULL) B. De bomen zijn zo opgezet dat knopen steeds corresponderen met dezelfde zoeksleutel. De node1 en node2 parameters verwijzen bij de eerste aanroep naar de beide wortels, bij de eerste recursieve aanroep naar diens linker zoon, de tweede recursieve aanroep naar diens rechter zoon. Dus verwijzen de parameters altijd naar de zelfde positie in de bomen. C. Als de doorsnede van de deelbomen, waarvan node1 en node2 de wortels zijn, niet leeg is, dan zorgt het for statement dat de functie de juiste uitvoer produceert als het om twee bladen gaat en geen uitvoer als een erne knoop bij is. for( i = 0; i < min( node1 >count, node2 >count); i++) prf( "Gevonden: \t%05d \n", node_key); D. De ersect_r() functie vergelijkt eerst de linker zonen, dan de knopen node1 en node2 zelf en vervolgens de rechter zonen. ersect_r( node1 >left, node2 >left, lo, node_key 1); for( i = 0; i < min( node1 >count, node2 >count); i++) prf( "Gevonden: \t%05d \n", node_key); ersect_r( node1 >right, node2 >right, node_key + 1, hi E. De ersect_r() functie drukt eerst de doorsnede van de linker deelbomen af, dan van de wortels van de deelbomen en vervolgens van de rechter deelbomen. Dit volgt met structurele inductie op bewering D, samen met de beweringen A, B, en C, die ervoor zorgen dat elk element van de doorsnede precies één keer wordt afgedrukt. F. De ersect_r() functie drukt elementen van de doorsnede op volgorde af. De parameters lo en hi zijn de onder en bovengrenzen van de deelbomen en de wortel deelt dat erval in drie delen, waarvan eerst het erval [0..node_key 1] wordt verwerkt, dan node_key zelf, gevolgd door [node_key+1, hi]. Dit volgt uit de code onder bewering D. node_key = min(max(hi / 2 + lo / 2 + 1, lo), hi); G. Het domein [0..M] wordt zodanig onderverdeeld dat elk element correspondeert met precies één knoop in de zoekboom. Voor erval [0..0] is de sleutel 0 en wordt ersect_r() aangeroepen op de delen [0.. 1] en [2..0]. Dat zijn ongeldige waarden en de NULL test zal die afvangen. Voor erval [0..1] is de sleutel 1 en wordt ersect_r() aangeroepen op de delen [0..0] en [2..0]. Het laatste is ongeldig en wordt door de NULL test afgevangen. Voor erval [0..2] is de sleutel 2 en wordt ersect_r() aangeroepen op de delen [0..1] en [3..2]. Het laatste is ongeldig en wordt door de NULL test afgevangen.
4 Voor erval [3..3] is de sleutel 3 en wordt ersect_r() aangeroepen op de delen [3..2] en [4..3]. Die zijn ongeldig en worden door de NULL test afgevangen. Voor erval [0..3] is de sleutel 2 en wordt ersect_r() aangeroepen op de delen [0..1] en [3..3]. De bewering G klopt dus voor M = 0, 1, 2 en 3; inductie bewijst ze voor alle waarden van M. Stelling II. Een deelverzameling van domein D met e elementen kan worden gerepresenteerd door een binaire boom met ten hoogste 2 e knopen. Als er e bladen zijn en e is een macht van 2, dan heeft de zoekboom e/2 = e 1 erne knopen nodig. In ons geval kunnen erne knopen eveneens elementen van de verzameling representeren. Voor multisets worden alle elementen met dezelfde waarde in 1 knoop opgeslagen en in één rekenstap verwerkt. Stelling III. Algoritme VIII bepaalt de doorsnede van twee verzamelingen in O(A B) rekentijd. Voor stelling I hebben we laten zien dat elk blad en elke erne knoop die nodig is voor een binaire boom van het resultaat één keer verwerkt wordt en in stelling II dat er minder erne knopen dan bladen nodig zijn. Voor elk blad in het resultaat zal ersect_r() tweemaal worden aangeroepen met een NULL parameter. De kosten van de if test vergroten de tijd voor de verwerking van het blad maar weinig, dus is de stelling geldig. Het opbouwen van de zoekboom kost in O(n.log(n)) stappen, maar als de invoer gesorteerd is reduceert dat tot O(n). Eventueel is het mogelijk om het sorteren en opbouwen te combineren. VII. Gesorteerde rijen Hierboven gebruikten we een boom waarin de getalswaarden impliciet uit de locatie volgen, als we daarentegen de locatie van de elementen vastleggen, krijgen we een array; als beide impliciet zijn, komen we uit op de bit vectoren van paragraaf I. De broncode is te vinden in listing 3. Dit algoritme is generieker dan het vorige. De zoeksleutels zijn niet van te voren vastgelegd, zodat geen geheugenruimte aan lege knopen verspild wordt. Het voornaamste verschil met algoritme V is dat de rij niet sequentieel wordt doorlopen, maar telkens wordt opgedeeld in twee delen van gelijke lengte. Als de zoeksleutel voor rij A kleiner is dan die voor rij B, dan kunnen we kleinere waarden dan a key vinden in de linker deelbomen van A en B, maar voor grotere waarden moeten we de rechter deelboom van A vergelijken met de gehele boom B; alleen als beide sleutels aan elkaar gelijk zijn kunnen beide bomen worden opgesplitst. De parameters xmin en xmax worden gebruikt om de zoektocht op tijd te beëindigen. De manier waarop dit erval recursief wordt gesplitst garandeert dat elke sleutelwaarde één keer wordt verwerkt; aanroepen van ersect() met overlappende array indices worden afgevangen door de if statements aan het begin. Die zorgen er tevens voor dat een deelboom van A niet verder wordt afgelopen als de deelboom van B al leeg is en omgekeerd, zodat de rekentijd van dit algoritme eveneens lineair toeneemt met de grootte van de uitvoer. We kunnen beredeneren dat wanneer de sleutels homogeen verdeeld zijn over het domein, de kans dat een deelboom geen deel uitmaakt van de doorsnede wordt gegeven door p g = m n! m n g! 1 m g
5 Hierin is g het aantal sleutels in de deelboom, ongeveer gelijk aan 2 h waarin in h de hoogte is; een blad bevindt zich op hoogte 0, m = #D is de grootte van het sleutel domein en n de grootte van de verzameling. Voor bladen is de kans om te worden overgeslagen groot, maar hoger in de boom wordt ze al snel verwaarloosbaar. Tests met algoritme VI geven aan dat het aantal recursieve aanroepen ongeveer 150 % van de grootte van de verzameling bedraagt, tegen 500 % voor algoritme VII, terwijl ze ongeveer evenveel rekentijd kosten. Een oorzaak ligt in de malloc() functie om geheugen voor de boom te reserveren. Conclusies Met de algoritmen VI en VII uit dit artikel is het mogelijk is het mogelijk om de doorsnede van twee verzamelingen te bepalen zonder alle elementen te testen. Als we zowel het domein als de cardinaliteit van de verzamelingen laten toenemen, neemt de rekentijd recht evenredig toe: de overgeslagen elementen vormen een constante fractie van het totaal. Voor non uniform verdeelde zoeksleutels zal het iets sneller gaan. Bovengenoemde methoden vereisen dat de invoer gesorteerd is; als dat niet het geval is zorgen de algoritmen III en IV en passant voor die sortering. Veel hogere snelheden zijn mogelijk door de algoritmen VI en VII zodanig aan te passen dat de twee recursieve functieaanroepen parallel worden uitgevoerd; door de resultaten tijdelijk op te slaan kunnen ze zonder weer te sorteren op volgorde worden afgedrukt.
6 Bijlagen Listing 1. Rij sorteren en doorsnede bepalen #include <stdio.h> #include <stdlib.h> #include <time.h> #define N 40 #define M 60 #define min(a,b) (((a) < (b))? (a) : (b)) #define max(a,b) (((a) > (b))? (a) : (b)) a[ N]; b[ N]; /* vul rij met willekeurige waarden */ fill_arrays( void) i; srand( time( 0)); a[i] = rand() % M; srand( time( 0) + 1); b[i] = rand() % M; /* druk de rijen af */ pr_arrays() i; for( i = 0; i <= N 1; i++) prf( "\t%05d\t%05d\n", a[i], b[i]); prf( "\n"); /* druk gemeenschappelijke elementen af */ report( pivot, amin, amax, bmin, bmax) i; for( i = 0; i <= min( amax amin, bmax bmin); i++) prf( "%05d\n", pivot); /* tel gemeenschappelijke elementen */ report2( pivot, amin, amax, bmin, bmax) ac = 0; bc = 0; i; for( i = amin; i <= amax; i++) if( a[i] == pivot) ac++; for( i = bmin; i <= bmax; i++) if( b[i] == pivot) bc++; report( pivot, 1, ac, 1, bc);
7 /* verwissel twee getallen */ swap( *a, *b) c; c = *a; *a = *b; *b = c; /* rangschik de waarden tussen s en m door de waarde te vergelijken met pivot*/ partition( *a, pivot, s, m, *i, *j) g; /* eerst verwisselen we elementen groter en kleiner dan of gelijk aan de pivot */ *i = s; *j = m; while( *i < *j) for( ; *i <= m; (*i)++) if( a[*i] >= pivot) break; *i = min( *i, m); for( ; *j >= s; (*j) ) if( a[*j] <= pivot) break; *j = max( *j, s); if( *i < *j) swap( a + *i, a + *j); (*i)++; (*j) ; swap( i, j); while( *j >= *i && a[*j] >= pivot) (*j) ; while( *i <= *j && a[*i] <= pivot) (*i)++; /* daarna zoeken we elementen gelijk aan de pivot */ for( g = *j; g >= s; g ) if( a[g] == pivot) swap( a + g, a + *j); (*j) ; for( g = *i; g <= m; g++) if( a[g] == pivot) swap( a + g, a + *i); (*i)++; /* corrigeer de grenzen nog eens, bijv. voor lege ervallen */ while( *j >= s && a[*j] >= pivot) (*j) ; while( *i <= m && a[*i] <= pivot) (*i)++; /* Bepaal de doorsnede van deelrijen A en B tussen Amin en Amax, Bmin en Bmax */ ersect( *a, amin, amax, *b, bmin, bmax) f, ai, aj, bi, bj; pivot; /* test of de deelrijen nul of een elementen bevatten */ if (amin > amax bmin > bmax) if (amin == amax) report2( a[amin], amin, amax, bmin, bmax); else
8 if( bmin == bmax) report2( b[bmin], amin, amax, bmin, bmax); /* bepaal de pivot en partitioneer de arrays */ f = (amin + amax) / 2; pivot = a[f]; if( amin < amax) partition( a, pivot, amin, amax, &ai, &aj); else ai = aj = amin; if( bmin < bmax) partition( b, pivot, bmin, bmax, &bi, &bj); else bi = bj = bmin; /* druk gevonden waarden af en doorzoek deelrijen kleiner en groter dan pivot */ ersect( a, amin, aj, b, bmin, bj); report( pivot, aj+1, ai 1, bj+1, bi 1); ersect( a, ai, amax, b, bi, bmax); main( argc, char **argv) fill_arrays(); pr_arrays(); ersect( a, 0, N 1, b, 0, N 1); exit( 0); Listing 2. Doorsnede van twee binaire bomen #include <stdio.h> #include <stdlib.h> #include <std.h> #include <time.h> #define min(a,b) (((a) < (b))? (a) : (b)) #define max(a,b) (((a) > (b))? (a) : (b)) #define N 30 /* aantal elementen in verzameling */ #define M 100 /* maximum waarde van een element */ a[ N]; /* tijdelijke opslag voor getalswaarden */ b[ N]; typedef struct node count; /* hoevaak de waarde voorkomt */ struct node *left; /* wijzer naar kleinere elementen */ struct node *right; /* wijzer naar grotere elementen */ NODE, *NODE_P; /* maak een nieuw element voor in de boom */ static NODE_P create_node( void) NODE_P result; if((result = (NODE_P) malloc( sizeof( NODE))) == NULL) fprf( stderr, "Malloc() failed \n"); exit( 1); else result > count = 0; result >left = result >right = NULL; return result; /* recursief deel van opbouwfunctie */
9 build_tree_r( NODE_P *node_p, *keys, *i, lo, hi) node_key = min(max(hi / 2 + lo / 2 + 1, lo), hi); if( *i >= N keys[*i] < lo keys[*i] > hi) /* test om recursie te termineren */ if( *node_p == NULL) *node_p = create_node(); /* voeg nieuwe knoop toe aan boom */ if( keys[*i] == node_key) (*node_p) >count++; /* tel het element mee */ ++*i; if( keys[*i] < node_key) /* getal te klein; zoek verder */ build_tree_r( &(*node_p) >left, keys, i, lo, node_key 1); else if( keys[*i] > node_key) /* getal te groot; zoek verder */ build_tree_r( &(*node_p) >right, keys, i, node_key + 1, hi); build_tree_r( node_p, keys, i, lo, hi); /* ga verder met volgende getal */ /* Bouw een zoekboom van de elementen van een gesorteerde rij */ void build_tree( NODE_P *root, *keys) i = 0; build_tree_r( root, keys, &i, 0, M 1); /* Recursief deel van de bepaling van de doorsnede */ ersect_r( NODE_P node1, NODE_P node2, lo, hi) node_key = min(max(hi / 2 + lo / 2 + 1, lo), hi); i; if( node1 == NULL node2 == NULL) /* controleer of we al klaar zijn */ ersect_r( node1 >left, node2 >left, lo, node_key 1); /* het kleinste aantal malen dat element voorkomt bepaalt de doorsnede */ for( i = 0; i < min( node1 >count, node2 >count); i++) prf( "Gevonden: \t%05d \n", node_key); ersect_r( node1 >right, node2 >right, node_key + 1, hi); /* Druk de gemeenschappelijke elementen in twee bomen af */ void ersect( NODE_P tree1, NODE_P tree2) prf( "\nde doorsnede bestaat uit: \n"); ersect_r( tree1, tree2, 0, M 1); /* Vul rijen met willekeurige getallen */ fill_arrays( void) i; srand( time( 0)); a[i] = rand() % M; srand( time( 0) + 1); b[i] = rand() % M; /* een hulpfunctie voor quicksort */ static compare( const void *a, const void *b) return *( *)a *( *)b;
10 /* het hoofdprogramma */ main( argc, char **argv) NODE_P tree_a = NULL; NODE_P tree_b = NULL; fill_arrays(); /* vul geheugen met de getallen */ qsort( a, N, sizeof( ), compare); qsort( b, N, sizeof( ), compare); /* sorteer de waarden eerst */ build_tree( &tree_a, a); /* om de bomen snel op te bouwen */ build_tree( &tree_b, b); ersect( tree_a, tree_b); /* bepaal de doorsnede */ return 0; Listing 3. Doorsnede van twee rijen #include <stdio.h> #include <stdlib.h> #include <std.h> #include <time.h> #define N 30 #define M 60 #define min(a,b) (((a) < (b))? (a) : (b)) #define max(a,b) (((a) > (b))? (a) : (b)) a[ N]; b[ N]; /* there a standard sign functionsignum sgn in c c */ sgn( val) return (val > 0) (val < 0); /* vul rijen met willekeurige getallen */ void fill_arrays( void) i; srand( time( 0)); a[i] = rand() % M; srand( time( 0) + 1); b[i] = rand() % M; /* hulpfunctie voor sorteren */ static compare( const void *a, const void *b) return *( *)a *( *)b; void pr_arrays( void) i; prf( "%d:\t%05d\t%05d\n", i, a[i], b[i]); prf( "\n"); /* druk resultaat af */ void found( x) if( x >= 0) prf( "Found value\t%05d \n", x);
11 /* bepaal de doorsnede van twee (deel)rijen A en B */ ersect( a[], amin, amax, b[], bmin, bmax, xmin, xmax) ai = min(max(amin / 2 + amax / 2 + 1, amin), amax); bi = min(max(bmin / 2 + bmax / 2 + 1, bmin), bmax); aj = ai; bj = bi; akey = a[ai]; /* de zoeksleutels */ bkey = b[bi]; i; /* controleer of de deelrijen leeg zijn */ if((amin > amax) (bmin > bmax)) /* controleer of de waarden binnen de grenzen vallen */ if((a[amin] > xmax) (a[amax] < xmin) (b[bmin] > xmax) (b[bmax] < xmin)) /* zoek getallen gelijk aan de sleutels */ while((ai > amin) && (a[ai 1] == akey)) ai ; while((aj < amax) && (a[aj+1] == akey)) aj++; while((bi > bmin) && (b[bi 1] == bkey)) bi ; while((bj < bmax) && (b[bj+1] == bkey)) bj++; /* pas het algoritme recursief toe op de rest van het array */ switch( sgn( akey bkey)) case 1: ersect( a, amin, aj, b, bmin, bi 1, xmin, akey); ersect( a, aj+1, amax, b, bmin, bmax, akey+1, xmax); break; case 1: ersect( a, amin, ai 1, b, bmin, bj, xmin, bkey); ersect( a, amin, amax, b, bj+1, bmax, bkey+1, xmax); break; case 0: ersect( a, amin, ai 1, b, bmin, bi 1, xmin, akey 1); for( i = 0; i <= min( aj ai, bj bi); i++) found( akey); ersect( a, aj+1, amax, b, bj+1, bmax, akey+1, xmax); break; main( argc, char **argv) fill_arrays(); qsort( a, N, sizeof( ), compare); /* standaard quicksort functie */ qsort( b, N, sizeof( ), compare); pr_arrays(); ersect(a, 0, N 1, b, 0, N 1, max(a[0],b[0]), min(a[n 1],b[N 1])); exit( 0);
De doorsnede van twee verzamelingen vinden
De doorsnede van twee verzamelingen vinden Inleiding Daniel von Asmuth 12 februari 2015 Dit artikel vergelijkt enkele algoritmen om de doorsnede van twee verzamelingen of rijen van getallen te vinden.
Nadere informatieEen 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 informatieLineaire 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 informatieZevende 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 informatieZevende 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 informatieZevende 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 informatieZevende 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 informatieDatastructuren: 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 informatieZevende 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 informatieAchtste 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 informatieUitgebreide 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 informatieProgrammeermethoden. 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 informatieVierde 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 informatieTentamen 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 informatieUitgebreide 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 informatieTweede 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 informatieZesde 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 informatieOpgaven 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 informatieVierde 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 informatieTentamen 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 informatieDivide & 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 informatieHutscodering. De techniek: illustratie. een tabel met 7 plaatsen, genummerd van 0 tot en met 6.
Hutscodering die leeg kunnen zijn, tabel T: abstract stockage middel met plaatsen elementen vd. vorm (K, I) K is de sleutel (of key) en I bijhorende informatie creatie van een lege tabel; een nieuw element
Nadere informatieAlgoritmiek. 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 informatieAchtste 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 informatieDerde 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 informatieVierde 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 informatieUitwerking tentamen Algoritmiek 10 juni :00 13:00
Uitwerking tentamen Algoritmiek 10 juni 2014 10:00 13:00 1. Dominono s a. Toestanden: n x n bord met in elk hokje een O, een X of een -. Hierbij is het aantal X gelijk aan het aantal O of hooguit één hoger.
Nadere informatieProgrammeermethoden. 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 informatieOpgaven 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 informatieTweede 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 informatieRecursion. 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 informatieIndexen.
Indexen joost.vennekens@kuleuven.be Probleem Snel gegevens terugvinden Gegevens moeten netjes geordend zijn Manier waarop hangt af van gebruik Sequentieel Gesorteerde gegevens, die in volgorde overlopen
Nadere informatieUitwerking 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 informatieHoofdstuk 3. Week 5: Sorteren. 3.1 Inleiding
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
Nadere informatieExamen Datastructuren en Algoritmen II
Tweede bachelor Informatica Academiejaar 2012 2013, tweede zittijd Examen Datastructuren en Algoritmen II Naam :.............................................................................. Lees de hele
Nadere informatieElfde 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 informatierecursie 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 informatieEE1400: Programmeren in C BSc. EE, 1e jaar, , 3e college
EE1400: Programmeren in C BSc. EE, 1e jaar, 2012-201, e college Arjan van Genderen, Computer Engineering 4-12-2012 Delft University of Technology Challenge the future Hoorcollege Arrays, Pointers en Strings
Nadere informatieTijd 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 informatieExamen 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 informatieALGORITMIEK: antwoorden werkcollege 5
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
Nadere informatieTree 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 informatieRecursie: definitie. De som van de kwadraten van de getallen tussen m en n kan als volgt gedefinieerd worden:
Recursie: definitie Een object wordt recursief genoemd wanneer het partieel bestaat uit of partieel gedefinieerd is in termen van zichzelf. Recursie wordt gebruikt bij wiskundige definities, bijvoorbeeld:
Nadere informatieUitgebreide uitwerking tentamen Algoritmiek Dinsdag 5 juni 2007, uur
Uitgebreide uitwerking tentamen Algoritmiek Dinsdag juni 00, 0.00.00 uur Opgave. a. Een toestand bestaat hier uit een aantal stapels, met op elk van die stapels een aantal munten (hooguit n per stapel).
Nadere informatieDatastructuren 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 informatieUitwerking 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 informatieDatastructuren en algoritmen voor CKI
Datastructuren en algoritmen voor CKI Jeroen Bransen 1 9 oktober 2015 1 met dank aan Hans Bodlaender en Gerard Tel Zoekbomen Binaire boom Bestaat uit knopen Beginknoop is de wortel (root) Elke knoop heeft
Nadere informatie10 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 informatieInleiding 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 informatieGegevens 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 informatie2 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 informatieDynamisch geheugen beheer
Dynamisch geheugen beheer + Normaal wordt laats in het werkgeheugen gereserveerd tijdens de comilatie aan de hand van de declaraties van de variabelen. + Deze geheugenreservering is statisch: in het bronbestand
Nadere informatieUitwerking 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 informatieVijfde 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 informatieExamen Datastructuren en Algoritmen II
Tweede bachelor Informatica Academiejaar 2014 2015, eerste zittijd Examen Datastructuren en Algoritmen II Naam :.............................................................................. Lees de hele
Nadere informatieInformatica: 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 informatieDatastructuren: 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 informatieDatastructuren Uitwerking jan
Datastructuren Uitwerking jan 2015 1 1a. Een abstracte datastructuur is een beschrijving van een datastructuur, met de specificatie van wat er opgeslagen wordt (de data en hun structuur) en welke operaties
Nadere informatieGetallensystemen, verzamelingen en relaties
Hoofdstuk 1 Getallensystemen, verzamelingen en relaties 1.1 Getallensystemen 1.1.1 De natuurlijke getallen N = {0, 1, 2, 3,...} N 0 = {1, 2, 3,...} 1.1.2 De gehele getallen Z = {..., 4, 3, 2, 1, 0, 1,
Nadere informatieextra oefening algoritmiek - antwoorden
extra oefening algoritmiek - antwoorden opgave "Formule 1" Maak een programma dat de gebruiker drie getal A, B en C in laat voeren. De gebruiker zorgt ervoor dat er positieve gehele getallen worden ingevoerd.
Nadere informatiepublic 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 informatieInleiding 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 informatieElke 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 informatieCombinatorische Algoritmen: Binary Decision Diagrams, Deel III
Combinatorische Algoritmen: Binary Decision Diagrams, Deel III Sjoerd van Egmond LIACS, Leiden University, The Netherlands svegmond@liacs.nl 2 juni 2010 Samenvatting Deze notitie beschrijft een nederlandse
Nadere informatieDatastructuren 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 informatie9 Meer over datatypen
9 Meer over datatypen We hebben al gezien dat het gebruik van symbolische constanten de leesbaarheid van een programma kan verbeteren. Door een geschikte naam (identifier) voor een constante te definiëren,
Nadere informatieAls 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 informatieOpgaven 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 informatieVierde college algoritmiek. 23/24 februari Complexiteit en Brute Force
Algoritmiek 2017/Complexiteit Vierde college algoritmiek 23/24 februari 2017 Complexiteit en Brute Force 1 Algoritmiek 2017/Complexiteit Tijdcomplexiteit Complexiteit (= tijdcomplexiteit) van een algoritme:
Nadere informatieRecapitulatie: Ongeïnformeerd zoeken. Zoekalgoritmen ( ) College 2: Ongeïnformeerd zoeken. Dynamische breadth-first search
Recapitulatie: Ongeïnformeerd zoeken Zoekalgoritmen (009 00) College : Ongeïnformeerd zoeken Peter de Waal, Tekst: Linda van der Gaag een algoritme voor ongeïnformeerd zoeken doorzoekt de zoekruimte van
Nadere informatieUitgebreide uitwerking tentamen Algoritmiek Dinsdag 2 juni 2009, uur
Uitgebreide uitwerking tentamen Algoritmiek Dinsdag 2 juni 2009, 10.00 13.00 uur Opgave 1. a. Een toestand wordt bepaald door: het aantal lucifers op tafel, het aantal lucifers in het bezit van Romeo,
Nadere informatieExamen Datastructuren en Algoritmen II
Tweede bachelor Informatica Academiejaar 2016 2017, eerste zittijd Examen Datastructuren en Algoritmen II Naam :.............................................................................. Lees de hele
Nadere informatie1 Rekenen in eindige precisie
Rekenen in eindige precisie Een computer rekent per definitie met een eindige deelverzameling van getallen. In dit hoofdstuk bekijken we hoe dit binnen een computer is ingericht, en wat daarvan de gevolgen
Nadere informatie4EE11 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 informatiePROS1E1 Gestructureerd programmeren in C Dd/Kf/Bd
Inhoudsopgave 1 Inleiding... 1 2 Toekenning- en herhalingsopdrachten (for loop)... 2 2.1 De wet van Ohm... 3 2.2 De spaarrekening... 3 2.3 De transformator... 3 3 Keuze- en herhalingsopdrachten (if, switch,
Nadere informatieTwaalfde 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 informatieOver binaire beslissingsdiagrammen naar Donald E. Knuth s The Art of Computer Programming, Volume 4
Over binaire beslissingsdiagrammen naar Donald E. Knuth s The Art of Computer Programming, Volume 4 Jonathan K. Vis 1 Inleiding (blz. 70 72) In dit essay behandelen we bladzijden 70 75 van Donald E. Knuth
Nadere informatieOnafhankelijke verzamelingen en Gewogen Oplossingen, door Donald E. Knuth, The Art of Computer Programming, Volume 4, Combinatorial Algorithms
Onafhankelijke verzamelingen en Gewogen Oplossingen, door Donald E. Knuth, The Art of Computer Programming, Volume 4, Combinatorial Algorithms Giso Dal (0752975) Pagina s 5 7 1 Deelverzameling Representatie
Nadere informatieGrafen. 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 informatieJava 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 informatieTree 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 informatieModelleren en Programmeren
Modelleren en Programmeren Deeltoets 2. Proefopgaven Het tentamen bestaat uit tien vragen, elk goed voor drie punten. minimaal 16.5 uit 30 punten haalt. Je bent geslaagd als je Opgave 1 Neem de volgende
Nadere informatieOpgaven 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 informatieProgrammeren 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 informatieUitgebreide uitwerking Tentamen Complexiteit, juni 2018
Uitgebreide uitwerking Tentamen Complexiteit, juni 018 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 informatieHoofdstuk 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 informatieTentamen Discrete Wiskunde
Discrete Wiskunde (WB011C) 22 januari 2016 Tentamen Discrete Wiskunde Schrijf op ieder ingeleverd blad duidelijk leesbaar je naam en studentnummer. De opgaven 1 t/m 6 tellen alle even zwaar. Je hoeft slechts
Nadere informatie9. Strategieën en oplossingsmethoden
9. Strategieën en oplossingsmethoden In dit hoofdstuk wordt nog even terug gekeken naar alle voorgaande hoofdstukken. We herhalen globaal de structuren en geven enkele richtlijnen voor het ontwerpen van
Nadere informatieTweede Toets Datastructuren 28 juni 2017, , Educ-β.
Tweede Toets Datastructuren 28 juni 2017, 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 informatieDoorzoeken van grafen. Algoritmiek
Doorzoeken van grafen Algoritmiek Vandaag Methoden om door grafen te wandelen Depth First Search Breadth First Search Gerichte Acyclische Grafen en topologische sorteringen 2 Doolhof start eind 3 Depth
Nadere informatieTweede Toets Datastructuren 26 juni 2019, , Educ-β.
Tweede Toets Datastructuren 26 juni 2019, 17.00 19.00, 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 informatieDiscrete Wiskunde, College 12. Han Hoogeveen, Utrecht University
Discrete Wiskunde, College 12 Han Hoogeveen, Utrecht University Dynamische programmering Het basisidee is dat je het probleem stap voor stap oplost Het probleem moet voldoen aan het optimaliteitsprincipe
Nadere informatieDiscrete Structuren. Piter Dykstra Opleidingsinstituut Informatica en Cognitie
Discrete Structuren Piter Dykstra Opleidingsinstituut Informatica en Cognitie www.math.rug.nl/~piter piter@math.rug.nl 22 februari 2009 INDUCTIE & RECURSIE Paragrafen 4.3-4.6 Discrete Structuren Week 3:
Nadere informatieMinimum 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 informatieProgrammeermethoden NA. Week 6: Lijsten
Programmeermethoden NA Week 6: Lijsten Kristian Rietveld http://liacs.leidenuniv.nl/~rietveldkfd/courses/prna2016/ Getal opbouwen Stel je leest losse karakters (waaronder cijfers) en je moet daar een getal
Nadere informatieModelleren 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 informatie3. Structuren in de taal
3. Structuren in de taal In dit hoofdstuk behandelen we de belangrijkst econtrolestructuren die in de algoritmiek gebruikt worden. Dit zijn o.a. de opeenvolging, selectie en lussen (herhaling). Vóór we
Nadere informatieExamen Datastructuren en Algoritmen II
Tweede bachelor Informatica Academiejaar 2012 2013, eerste zittijd Examen Datastructuren en Algoritmen II Naam :.............................................................................. Lees de hele
Nadere informatieElementary 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 informatie17 Operaties op bits. 17.1 Bitoperatoren en bitexpressies
17 Operaties op bits In hoofdstuk 1 is gezegd dat C oorspronkelijk bedoeld was als systeemprogrammeertaal om het besturingssysteem UNIX te implementeren. Bij dit soort toepassingen komt het voor dat afzonderlijke
Nadere informatie