De volgorde van een linked list omkeren
|
|
- Erik Vos
- 5 jaren geleden
- Aantal bezoeken:
Transcriptie
1 De volgorde van een linked list omkeren Inleiding Daniel von Asmuth 21 januari 2015 Hierin presenteren we een algoritme om de volgorde van de knopen in een linked list om te keren dat wordt versneld door meerdere processoren tegelijk te gebruiken. Wikipedia ( geeft een goede introductie over linked lists. Eenvoudig gezet bestaan ze uit een geordende rij van nul of meer objecten waarin elke knoop de gegevens van een object bevat plus een wijzer naar het volgende element. Anders dan bij Wikipedia staat gebruiken we geen speciale terminator knoop, maar een speciale wijzer (NIL of NULL) om aan te geven dat er geen volgende knoop meer is. I. Implementatie van een linked list Wikipedia stelt dat de enige manier om een linked list te verwerken daaruit bestaat dat je een wijzer gebruikt naar het eerste element van de lijst en van daaruit telkens de wijzer naar het volgende element volgt, totdat er geen volgende element meer is. We kunnen een lege lijst representeren door de wijzer naar de kop de waarde NIL te geven. Voor parallelle verwerking kun je de lijst in de voorgeschreven volgorde aflopen en telkens het adres van een knoop aan een nieuwe thread meegeven, maar voor lange lijsten is dat niet efficient. De meest voor de hand liggende datastructuur is het array (de rij). In theorie kunnen alle elementen daarvan tegelijkertijd worden gelezen of geschreven; in de praktijk laat de hardware dat niet toe, maar het is wel de snelste methode. Het artikel in Wikipedia beschrijft ook alternatieven, genaamd 'dynamic arrays' en 'linked lists using arrays of nodes', maar mist het punt dat die parallelle toegang mogelijk maken. Voor dit artikel is een knoop een object of tupel dat een getal bevat, plus de index van het volgende element; een lijst is dan een object (in C heet dat 'struct') dat een rij van knopen bevat, plus het aantal elementen in de lijst en wijzers naar de eerste en laatste node. De programmacode staat aan het eind van dit artikel. De basisfuncties zijn init() om een lijst leeg te maken, insert() om een element toe te voegen, delete() om een opgegeven element te verwijderen en print() om alle getallen af te drukken. De belangrijkste eigenschap is dat de posities 0 t/m count 1 in gebruik zijn met als gevolg dat je na het wissen van een element de laatste knoop naar de vrije positie moet verplaatsen. Daarom is gekozen voor een dubbel gelinkte lijst. Een andere eigenaardigheid is dat de print() functie de getallen in de omgekeerde volgorde afdrukt als waarin ze zijn ingevoerd. II. Een lijst omkeren Sommige functies zijn niet afhankelijk van de volgorde van de elementen, zoals het vinden van het grootste en kleinste getal of het sorteren van de lijst, en kunnen daarom gemakkelijk parallel worden uitgevoerd. Voor functies die dat wel zijn, hanteren we het verdeel en heers paradigma. In dit geval hoeven we de lijst niet eerst op te delen, maar beginnen we met n deellijsten van elk 1 element; vervolgens moeten we n 1 keer telkens twee deellijsten samenvoegen om uiteindelijk 1 deellijst met alle elementen over te houden.
2 De gewenste functie moet triviaal zijn voor een verzameling met 1 element en de resultaten van twee deelverzamelingen moeten snel gecombineerd worden kunnen worden. Voor ons probleem geldt dat een lijst met 1 element gelijk is aan zijn omgekeerde en twee deellijsten, waarvan de inhoud al is omgekeerd kunnen we samenvoegen door hun volgorde te verwisselen. De kop van een deellijst is telkens de knoop i en het array tails wijst naar de laatste knoop. h p i j1 n1 j2 n2 t Het moeilijke werk gebeurt in functie reverse2, die voor elke knoop i aangeroepen wordt om de deellijst i.. j1 te verplaatsen naar achter de volgende deellijst n1.. j2, waartoe de drie doorgetrokken pijlen worden omgeleid naar volgens de drie gestreepte pijlen onder en bovenaan. De variabele h verwijst hier naar de kop van de lijst, t naar de staart, p naar de knoop voor i, en n2 naar de knoop na j2. De eerste keer is j1 gelijk aan i en j2 aan n1. De wijzers naar de voorafgaande knoop worden eveneens aangepast en tails[n1] verwijst naar de knoop j1. Daarna hoeven enkel de wijzers naar de kop en de staart te worden verwisseld. Als we de inhoud van de lijst voor aanroep van reverse2 weergeven als de preconditie L = H L 1 L 2 T met H = h p, L 1 = i j 1, L 2 = n 1 j 2, T = n 2 t dan worden de twee deellijsten tot verwisseld tot: L' = H L 2 L 1 T na samenvoegen van deellijsten wordt de invariante conditie: L = H D T Als L een lege lijst is wordt de functie niet aangeroepen, dus L 1 is een deellijst met tenminste 1 knoop, terwijl de rest eventueel leeg kan zijn, maar anders zijn het reeksen van deellijsten. De invariant wil zeggen dat de lijst bestaat uit een reeks deellijsten, zodanig dat de knopen van de deellijsten al zijn omgekeerd, maar de volgorde van de deellijsten nog is zoals in de beginsituatie. Aanvankelijk zijn dat n deellijsten met 1 element, uiteindelijk 1 deellijst met n elementen. Die functie zet eerst de lokale variabelen goed: j1 = tails[i]; n1 = list >nodes[j1].next; /* The second sublist */ if( n1 == NIL) return; j2 = tails[n1]; n2 = list >nodes[j2].next; /* Node after second sublist */ Merk op, dat als de tweede deellijst leeg is, de staart is bereikt, zodat de functie niets hoeft te doen. Vervolgens leiden we de wijzers om, zoals in de figuur is getekend. list >nodes[j2].next = i; list >nodes[j1].next = n2; if( preds[i]!= NIL) /* Node before first sublist */ list >nodes[preds[i]].next = n1; Net zo passen we de wijzers naar de voorafgaande knoop aan en voegen de deellijsten samen. list >nodes[n1].prev = p; list >nodes[i].prev = j2; if( n2!= NIL) list >nodes[n2].prev = j1; tails[n1] = j1;
3 III. Parallelle verwerking We lopen de programmacode langs; in de functie main worden de deellijsten geïnitialiseerd. for( i = 0; i < N; i++) tails[i] = NIL; for( i = 0; i < list.count; i++) tails[i] = i; In de functie reverse worden de threads gestart, die alle reverse1 aanroepen, dat de nodige mutexen aanmaakt en reserveert, zodat voor alle waarden van i tussen 0 en n 1, reverse2(i) aangeroepen wordt. Terug in reverse worden de wijzers naar de kop en staart verwisseld. i = list >head; /* swap head & tail pointers */ list >head = list >tail; list >tail = i; We merken op dat na uitvoering van reverse2(i) telkens de deellijst i afgewerkt is en dat de conditie n1 == NIL alleen optreedt als deellijst i de laatste in de lijst is. Samen met de invariant volgt dat aan het eind nog 1 deellijst over is met de knopen van de oorspronkelijke lijst in omgekeerde volgorde. De functie reverse2 vergt ten hoogste een constant aantal rekenstappen, wat we noteren als t = O(1). Als we ze sequentieel uitvoeren dan kost dat O(n) rekentijd. Vergeleken met een pure linked list implementatie is het waarschijnlijk iets langzamer omdat de index berekening van de arrays een optelling vereist, maar het blijft O(n). De clou van dit algoritme is dat het correct werkt ongeacht de volgorde, zolang reverse2 maar voor elke knoop i wordt aangeroepen. De knopen kunnen ook gelijktijdig worden afgewerkt, als we de knopen i, n1 en n2 reserveren, zodat andere threads moeten wachten voordat ze bij die knopen kunnen en de thread waarvoor p de laatste knoop is de knopen i en n1 niet kan reserveren. Als er n threads zijn, zal een derde deel daarvan door kunnen gaan; de volgende ronde een derde deel van het restant enzovoorts, zodat de doorlooptijd O( 2 log(n)) wordt. De meeste computers gebruiken tegenwoordig Symmetric MultiProcessing, wat neerkomt op een klein aantal processoren of cores, die via een gemeenschappelijke bus of crossbar switch verbonden zijn met een gedeeld geheugen; een andere groep werkt met Non Uniform Memory Access, wat betekent dat elke processor een lokaal geheugen heeft waar andere processoren langzamer bij kunnen. Supercomputers bestaan doorgaans uit meerdere computers die via een snel netwerk gegevens uitwisselen zonder toegang tot elkaars geheugen. Het algoritme is geoptimaliseerd voor een SMP systeem door het aantal threads p te kiezen als 2 maal het aantal cores. Daarmee worden telkens 3 * p mutexen gereserveerd, waardoor de kans dat een thread op een andere moet wachten klein is en als een thread geblokkeerd is, een andere thread de processor krijgt. Zodoende kost de uitvoering O(n/p) rekentijd. Een groter aantal threads heeft weinig zin. Deze combinatie van parallelle en sequentiële uitvoering blijkt simpel te realiseren zodat alle threads evenveel werk doen. Het aantal mutexen is gekozen tussen n en p voor een compromis tussen de tijd om ze aan te maken en de tijd die we met wachten verliezen. Conclusie Een linked list kan in willekeurige volgorde worden verwerkt door de knopen in een array op te slaan. Dat kan handig zijn als objecten meerdere volgordes hebben: bijvoorbeeld een verzameling personen, die zowel op naam als op leeftijd zijn gerangschikt. Dit algoritme is in theorie even snel als de links te volgen en in de praktijk ook snel genoeg. Op een SMP systeem is het optimaal met een rekentijd van O(n/p) stappen voor n knopen en p processoren.
4 C programma code geschreven onder Windows Listing 1. Linked list omkeren #include <stdio.h> #include <stdlib.h> #include <time.h> #include <Windows.h> #include <process.h> #define N /* maximum nr. of list elements */ #define M 1000 /* range of numbers */ #define P 8 /* 2 threads per core */ #define X /* number of mutexes */ #define NIL 1 /* invalid array index */ typedef struct _node int key; /* data */ int next; /* pointer to next node */ int prev; /* pointer to previous node */ NODE; typedef struct _list int head; /* point to first and last node */ int tail; /* NIL denotes end of the list */ int count; /* number of elements */ NODE nodes[n]; /* fixed maximum size */ LIST; LIST list; /* contains the data */ int tails[ N]; /* defines temporary sublists */ HANDLE mutexes[ X]; /* ensure 1 thread changes node */ HANDLE threads[ P]; /* parallel tasks */ /* Elementary linked list operations */ /* We use an array to hold the nodes that we manage such that nodes */ /* 0..n 1 always contain valid elements */ /* initialise an empty list */ init( LIST *list) int i; list >head = list >tail = NIL; list >count = 0; for( i = 0; i < N; i++) list >nodes[i].next = NIL; list >nodes[i].prev = NIL; /* new nodes are inserted at the front of the list */ /* this more or less reverses it */ insert( LIST *list, int key) if( list >count == N) printf( "The list is full!\n"); return; if( list >tail == NIL) list >tail = list >count; list >nodes[ list >head].prev = list >count; list >nodes[ list >count].next = list >head; list >head = list >count; list >nodes[ list >count++].key = key;
5 /* remove a node from the list */ /* we may have to move a node to preserve the structure */ delete( LIST *list, int i) int h, n, p; list >count ; h = list >head; p = list >nodes[i].prev; /* Relink previous node */ if( p!= NIL) list >nodes[p].next = list >nodes[i].next; if( list >nodes[i].next!= NIL) list >nodes[list >nodes[i].next].prev = p; /* Adjust the head and tail */ if( i == list >head) list >head = list >nodes[i].next; if((i == list >tail) && (p!= NIL)) list >tail = p; list >nodes[p].next = NIL; if( list >count!= i) /* Relink semifinal node */ p = list >nodes[list >count].prev; if( p!= NIL) list >nodes[p].next = i; n = list >nodes[list >count].next; if( n!= NIL) list >nodes[n].prev = i; /* Adjust the head and tail */ if( list >count == h) list >head = i; if( list >count == list >tail) list >tail = i; /* move the last entry to the freed position */ list >nodes[i] = list >nodes[list >count]; /* clear the freed node */ list >nodes[list >count].key = 0; list >nodes[list >count].next = NIL; list >nodes[list >count].prev = NIL; print( LIST *list) int i,j; printf( "The list: \t"); for( i = list >head, j = 1; i!= NIL; i = list >nodes[i].next, j++) printf( "%03d ", list >nodes[i].key); if( j > N) printf( " \n **** ERROR **** \n\n"); exit( 2); printf( "\n"); /* Fill the list with random test data */ fill_random( LIST *list) int i; init( list); srand( (int) time( 0)); for( i = 0; i < N; i++) insert( list, (rand() % (M 3) + 3));
6 /* Delete a few random elements from the list */ test_deletion( LIST *list) int i, next; for( i = list >head; i!= NIL; i = next) next = list >nodes[i].next; if(!(list >nodes[i].key % 3)) delete( list, i); /* Combine the sublists starting at nodes i and n1 into one */ /* Precondition: the elements of sublist i and n1 are already handled */ /* except for the heads. */ reverse2( LIST *list, int i) int j1, j2, n1, n2, p; /* find next sublist n1 and the one after that (n2) */ j1 = tails[i]; n1 = list >nodes[j1].next; /* The second sublist */ if( n1 == NIL) /* We have reached the last node */ return; j2 = tails[n1]; n2 = list >nodes[j2].next; /* Node after second sublist */ p = list >nodes[i].prev; /* concatenate the sublists */ list >nodes[j2].next = i; list >nodes[j1].next = n2; if( p!= NIL) /* Node before first sublist */ list >nodes[p].next = n1; /* swap pointers for the predecessor nodes */ list >nodes[n1].prev = p; list >nodes[i].prev = j2; if( n2!= NIL) list >nodes[n2].prev = j1; /* join two sublists */ tails[n1] = j1; /* obtain exclusive access for nodes and let reverse2() do the actual work */ /* this function is run by each thread simultaneously */ /* each thread performs count / P iterations */ unsigned int stdcall reverse1( int p) DWORD status; int i, j1, n1, j2, n2; for( i = p; i < list.count; i += P) while( TRUE) /* try to obtain mutexes */ status = WaitForSingleObject( mutexes[i], 9); if( status!= WAIT_OBJECT_0) continue /* try again */ /* find next sublist n1 */ j1 = tails[i]; n1 = list.nodes[j1].next; /* The second sublist */ if( n1 == NIL) break; /* one mutex is enough here */ j2 = tails[n1]; n2 = list.nodes[j2].next; /* Node after second sublist */
7 if( n1 % X!= i % X) status = WaitForSingleObject( mutexes[n1 % X], 0); if( status == WAIT_OBJECT_0) if( n2 == NIL) break; /* two mutexes is enough here */ if((n2 % X!= n1 % X) && (n2 % X!= i % X)) status = WaitForSingleObject( mutexes[n2 % X], 0); if( status == WAIT_OBJECT_0) break; /* success */ ReleaseMutex( mutexes[n1 % X]); /* failed so release the mutex */ ReleaseMutex( mutexes[i % X]); /* failed so release first mutex */ /* now we own both mutexes */ reverse2( &list, i); /* so we can safely proceed */ ReleaseMutex( mutexes[n2 % X]); /* return codes not checked here */ ReleaseMutex( mutexes[n1 % X]); ReleaseMutex( mutexes[i % X]); /* release all three mutexes */ _endthreadex( 0); /* now end this thread */ return 0; /* never reached */ /* reverse the elements of the linked list */ reverse( LIST *list) int i; unsigned int id; for( i = 0; i < X; i++) /* create enough mutexes */ if((mutexes[i] = CreateMutex( NULL, FALSE, NULL)) == NULL) printf( "CreateMutex() failed. \n"); exit( 2); printf( "Starting %0d threads for %0d nodes. \n", P, list >count); for( i = 0; i < P; i++) /* create a thread for each node */ threads[i] = (HANDLE) _beginthreadex( NULL, 0, reverse1, (void *) i, 0, &id); if( threads[i] == NULL) printf( "BeginThreadEx() failed \n"); exit( 2); /* wait up to 100 seconds for the other threads to finish */ if((int) WaitForMultipleObjects( P, threads, TRUE, ) > list >count) printf( "Wait failed \n"); exit( 2); printf( "Back to 1 thread. \n", P); for( i = 0; i < P; i++) /* clean up threads & mutexes */ CloseHandle( threads[i]); for( i = 0; i < X; i++) CloseHandle( mutexes[i]); i = list >head; /* swap head & tail pointers */ list >head = list >tail; list >tail = i; int main( void) int i; printf( "Starting 1 thread. \n"); /* initialisation of linked data list */ fill_random( &list); init( ©); test_deletion( &list); for( i = list.head; i!= NIL; i = list.nodes[i].next) insert( ©, list.nodes[i].key);
8 /* initialisation of auxiliary data */ for( i = 0; i < N; i++) tails[i] = NIL; for( i = 0; i < list.count; i++) tails[i] = i; /* now do it */ // print( &list); reverse( &list); // print( &list); exit( 0);
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 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 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 informatieALGORITMIEK: answers exercise class 7
Problem 1. See slides 2 4 of lecture 8. Problem 2. See slides 4 6 of lecture 8. ALGORITMIEK: answers exercise class 7 Problem 5. a. Als we twee negatieve (< 0) getallen bij elkaar optellen is het antwoord
Nadere informatieDALISOFT. 33. Configuring DALI ballasts with the TDS20620V2 DALI Tool. Connect the TDS20620V2. Start DALISOFT
TELETASK Handbook Multiple DoIP Central units DALISOFT 33. Configuring DALI ballasts with the TDS20620V2 DALI Tool Connect the TDS20620V2 If there is a TDS13620 connected to the DALI-bus, remove it first.
Nadere informatieVerslag 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 informatieFOR DUTCH STUDENTS! ENGLISH VERSION NEXT PAGE. Toets Inleiding Kansrekening 1 8 februari 2010
FOR DUTCH STUDENTS! ENGLISH VERSION NEXT PAGE Toets Inleiding Kansrekening 1 8 februari 2010 Voeg aan het antwoord van een opgave altijd het bewijs, de berekening of de argumentatie toe. Als je een onderdeel
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 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 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 informatieDatastructuren 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 informatieSAMPLE 11 = + 11 = + + Exploring Combinations of Ten + + = = + + = + = = + = = 11. Step Up. Step Ahead
7.1 Exploring Combinations of Ten Look at these cubes. 2. Color some of the cubes to make three parts. Then write a matching sentence. 10 What addition sentence matches the picture? How else could you
Nadere informatieClassification of triangles
Classification of triangles A triangle is a geometrical shape that is formed when 3 non-collinear points are joined. The joining line segments are the sides of the triangle. The angles in between the sides
Nadere informatieFOR DUTCH STUDENTS! ENGLISH VERSION NEXT PAGE
FOR DUTCH STUDENTS! ENGLISH VERSION NEXT PAGE Tentamen Analyse 6 januari 203, duur 3 uur. Voeg aan het antwoord van een opgave altijd het bewijs, de berekening of de argumentatie toe. Als je een onderdeel
Nadere informatieEE1400: Programmeren in C BSc. EE, 1e jaar, , 4e college
EE1400: Programmeren in C BSc. EE, 1e jaar, 2012-2013, 4e college Arjan van Genderen, Computer Engineering 11-12-2012 Delft University of Technology Challenge the future Mededelingen Voortgangstoets: Woensdagmiddag
Nadere informatieIllustrator Tutorial - How to Create a Watch
Illustrator Tutorial - How to Create a Watch «Andrew Bannecker - Simple, True and Tender Vector Movie Posters by GABZ» Categories: Tutorials Have you ever seen print advertising of some watch brand before?
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 informatieDe 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 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 informatiePreschool Kindergarten
Preschool Kindergarten Objectives Students will recognize the values of numerals 1 to 10. Students will use objects to solve addition problems with sums from 1 to 10. Materials Needed Large number cards
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 informatieModelleren 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 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 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 informatieCS 202 Fundamental Structures of Computer Science II Bilkent University Computer Engineering Department
Hashing CS 202 Fundamental Structures of Computer Science II Bilkent University Computer Engineering Department Bilkent University 1 Hashing We will now see a data structure that will allow the following
Nadere informatieMyDHL+ Van Non-Corporate naar Corporate
MyDHL+ Van Non-Corporate naar Corporate Van Non-Corporate naar Corporate In MyDHL+ is het mogelijk om meerdere gebruikers aan uw set-up toe te voegen. Wanneer er bijvoorbeeld meerdere collega s van dezelfde
Nadere informatieObjective-C Basis. 23 april 2005, Eindhoven Patrick Machielse
Objective-C Basis 23 april 2005, Eindhoven Patrick Machielse patrick@hieper.nl Algemeen // extensies Objective-C code in bestanden met.m extensie // commentaar moet! /* Alles hiertussen wordt genegeerd
Nadere informatie(1) De hoofdfunctie van ons gezelschap is het aanbieden van onderwijs. (2) Ons gezelschap is er om kunsteducatie te verbeteren
(1) De hoofdfunctie van ons gezelschap is het aanbieden van onderwijs (2) Ons gezelschap is er om kunsteducatie te verbeteren (3) Ons gezelschap helpt gemeenschappen te vormen en te binden (4) De producties
Nadere informatieQuery SQL Boekje. Fredrik Hamer
Query SQL Boekje Query SQL Boekje Fredrik Hamer Schrijver: Fredrik Hamer Coverontwerp: Fredrik Hamer ISBN: 9789402162103 Fredrik Hamer Inhoudsopgave A. Aanhef bepalen 17 Aantal 18 Aantal dagen tussen
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 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 informatieHoofdstuk 3: Processen: Beschrijving en Besturing. Wat is een proces? Waarom processen? Wat moet het OS ervoor doen? Is het OS zelf een proces?
Hoofdstuk 3: Processen: Beschrijving en Besturing Wat is een proces? Waarom processen? Wat moet het OS ervoor doen? Is het OS zelf een proces? 1 Wat is een proces? Een proces is een programma in uitvoering
Nadere informatieBasic operations Implementation options
Priority Queues Heaps Heapsort Student questions EditorTrees WA 6 File Compression Graphs Hashing Anything else Written Assignments 7 and 8 have been updated for this term. Each of them is smaller than
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 informatieChromosomal crossover
Chromosomal crossover As one of the last steps of genetic recombination two homologous chromosomes can exchange genetic material during meiosis in a process that is referred to as synapsis. Because of
Nadere informatieDeel 1: schriftelijk deel
Examen Computerarchitectuur en systeemsoftware Donderdag 15 januari 2009, namiddag Deel 1: schriftelijk deel Algemene bemerkingen: Het examen bestaat uit 2 delen. Dit zijn de vragen voor het eerste deel.
Nadere informatieSyntax- (compile), runtime- en logische fouten Binaire operatoren
Inhoud Syntax- (compile), runtime- en logische fouten Binaire operatoren Operaties op numerieke datatypen Evaluatie van expressies, bindingssterkte Assignment operaties en short-cut operatoren Controle
Nadere informatieFOR DUTCH STUDENTS! ENGLISH VERSION NEXT PAGE
FOR DUTCH STUDENTS! ENGLISH VERSION NEXT PAGE Tentamen Bewijzen en Technieken 1 7 januari 211, duur 3 uur. Voeg aan het antwoord van een opgave altijd het bewijs, de berekening of de argumentatie toe.
Nadere informatieGeeft de lengte van een object (string, lijst, tupel) terug als integer
Python cheat sheet: Operatoren: De standaard operatoren voor wiskundige bewerkingen (+,-,*,/,**) worden als vanzelfsprekend ondersteld. Voor integers en floating point getallen doen deze functies wat je
Nadere informatieEM7680 Firmware Update by Micro SD card
EM7680 Firmware Update by Micro SD card 2 NEDERLANDS/ENGLISH EM7680 Firmware update by Micro SD card Table of contents 1.0 (NL) Introductie... 2 2.0 (NL) Firmware installeren... 2 3.0 (NL) Opmerking...
Nadere informatieAdd the standing fingers to get the tens and multiply the closed fingers to get the units.
Digit work Here's a useful system of finger reckoning from the Middle Ages. To multiply $6 \times 9$, hold up one finger to represent the difference between the five fingers on that hand and the first
Nadere informatieThe genesis of the game is unclear. Possibly, dominoes originates from China and the stones were brought here by Marco Polo, but this is uncertain.
Domino tiles Dominoes is a game played with rectangular domino 'tiles'. Today the tiles are often made of plastic or wood, but in the past, they were made of real stone or ivory. They have a rectangle
Nadere informatieUniversiteit 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 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 informatieZelftest Inleiding Programmeren
Zelftest Inleiding Programmeren Document: n0824test.fm 22/01/2013 ABIS Training & Consulting P.O. Box 220 B-3000 Leuven Belgium TRAINING & CONSULTING INLEIDING BIJ DE ZELFTEST INLEIDING PROGRAMMEREN Deze
Nadere informatie8+ 60 MIN Alleen te spelen in combinatie met het RIFUGIO basisspel. Only to be played in combination with the RIFUGIO basicgame.
8+ 60 MIN. 2-5 Alleen te spelen in combinatie met het RIFUGIO basisspel. Only to be played in combination with the RIFUGIO basicgame. HELICOPTER SPEL VOORBEREIDING: Doe alles precies hetzelfde als bij
Nadere informatieInleiding Programmeren 2
Inleiding Programmeren 2 Gertjan van Noord December 17, 2018 Vandaag Naar aanleiding van de opdrachten Zelle hoofdstuk 11 Boolean variabelen: niet checken met == Fout: if clicked == True : gohome () Goed:
Nadere informatieHoe met Windows 8 te verbinden met NDI Remote Office (NDIRO) How to connect With Windows 8 to NDI Remote Office (NDIRO
Handleiding/Manual Hoe met Windows 8 te verbinden met NDI Remote Office (NDIRO) How to connect With Windows 8 to NDI Remote Office (NDIRO Inhoudsopgave / Table of Contents 1 Verbinden met het gebruik van
Nadere informatieEngels op Niveau A2 Workshops Woordkennis 1
A2 Workshops Woordkennis 1 A2 Workshops Woordkennis 1 A2 Woordkennis 1 Bestuderen Hoe leer je 2000 woorden? Als je een nieuwe taal wilt spreken en schrijven, heb je vooral veel nieuwe woorden nodig. Je
Nadere informatieOUTDOOR HD BULLET IP CAMERA PRODUCT MANUAL
OUTDOOR HD BULLET IP CAMERA PRODUCT MANUAL GB - NL GB PARTS & FUNCTIONS 1. 7. ---- 3. ---- 4. ---------- 6. 5. 2. ---- 1. Outdoor IP camera unit 2. Antenna 3. Mounting bracket 4. Network connection 5.
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 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 informatieB1 Woordkennis: Spelling
B1 Woordkennis: Spelling Bestuderen Inleiding Op B1 niveau gaan we wat meer aandacht schenken aan spelling. Je mag niet meer zoveel fouten maken als op A1 en A2 niveau. We bespreken een aantal belangrijke
Nadere informatieSQL manipulatietaal. We kunnen er data mee toevoegen, wijzigen en verwijderen uit een database.
SQL manipulatietaal We kunnen er data mee toevoegen, wijzigen en verwijderen uit een database. Basiscommando's: INSERT : toevoegen van gegevens DELETE : verwijderen van gegevens UPDATE : wijzigen van gegevens
Nadere informatieIntroductie in flowcharts
Introductie in flowcharts Flow Charts Een flow chart kan gebruikt worden om: Processen definieren en analyseren. Een beeld vormen van een proces voor analyse, discussie of communicatie. Het definieren,
Nadere informatieDe 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 informatieRandom-Getallen. Tristan Demont en Mark van der Boor en
Random-Getallen Tristan Demont en Mark van der Boor 0768931 en 0772942 18 januari 2013 Begeleider: Relinde Jurrius Opdrachtgever: Berry Schoenmakers Modelleren B, 2WH02 Technische Universiteit Eindhoven
Nadere informatieHOOFDSTUK 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 informatieOefententamen 2. Tijd: 2 uur. Maximaal aantal punten: 30. Naam: Studentnummer:
Oefententamen 2 C Naam: Studentnummer: Tijd: 2 uur Maximaal aantal punten: 30 Menselijke compiler (10 punten) 0. (1 punt) Stel, je haalt het tentamen als je tenminste een 5.5 gemiddeld hebt gehaald voor
Nadere informatieDe MySQL C API. Variabelen in C Functies in C Pointers in C
LinuxFocus article number 304 http://linuxfocus.org De MySQL C API door Özcan Güngör Over de auteur: Ik gebruik Linux sinds 1997. Vrijheid, flexibiliteit en opensource. Dat
Nadere informatieInstallatie van Windows 10 op laptops. Windows 10 installation on laptops
Installatie van Windows 10 op laptops In mei vindt de migratie naar Windows 10 plaats op de laptops. Per dag worden ongeveer 25 laptops gemigreerd. Elke laptop heeft een ISSC-sticker met een laptop-nummer.
Nadere informatieL.Net s88sd16-n aansluitingen en programmering.
De L.Net s88sd16-n wordt via één van de L.Net aansluitingen aangesloten op de LocoNet aansluiting van de centrale, bij een Intellibox of Twin-Center is dat de LocoNet-T aansluiting. L.Net s88sd16-n aansluitingen
Nadere informatieGeneral info on using shopping carts with Ingenico epayments
Inhoudsopgave 1. Disclaimer 2. What is a PSPID? 3. What is an API user? How is it different from other users? 4. What is an operation code? And should I choose "Authorisation" or "Sale"? 5. What is an
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 informatieL.Net s88sd16-n aansluitingen en programmering.
De L.Net s88sd16-n wordt via één van de L.Net aansluitingen aangesloten op de LocoNet aansluiting van de centrale, bij een Intellibox of Twin-Center is dat de LocoNet-T aansluiting. L.Net s88sd16-n aansluitingen
Nadere informatiePlanning. 1. Mini College. 2. Introductiecursus Imperatief Programmeren. 3. Crash and Compile (vanaf 17:00 uur)
Planning 1. Mini College 2. Introductiecursus Imperatief Programmeren 3. Crash and Compile (vanaf 17:00 uur) Geschiedinis van de Codemonkeys imperatief programmeren voor beginners Geschiedenis van de Codemonkey
Nadere informatieInleiding Programmeren 2
Inleiding Programmeren 2 Gertjan van Noord en Leonie Bosveld December 19, 2016 Vandaag Naar aanleiding van de opdrachten Zelle hoofdstuk 11 Boolean variabelen: niet checken met == Fout: if clicked == True
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 informatie2019 SUNEXCHANGE USER GUIDE LAST UPDATED
2019 SUNEXCHANGE USER GUIDE LAST UPDATED 0 - -19 1 WELCOME TO SUNEX DISTRIBUTOR PORTAL This user manual will cover all the screens and functions of our site. MAIN SCREEN: Welcome message. 2 LOGIN SCREEN:
Nadere informatieMulti-core systemen. door Alexander Melchior
Multi-core systemen Multi-cpu & Multi-core Multi cpu & Multi core door Alexander Melchior Toevoeging aan GDP Overdragen Capita Selecta Waarom? Een stukje geschiedenis 2005: Introductie eerste consumenten
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 informatieEM7580 Firmware Update by Micro SD card
EM7580 Firmware Update by Micro SD card 2 NEDERLANDS/ENGLISH EM7580 Firmware update by Micro SD card Table of contents 1.0 (NL) Introductie... 3 2.0 (NL) Firmware installeren... 3 3.0 (NL) Opmerking...
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 informatieLuister alsjeblieft naar een opname als je de vragen beantwoordt of speel de stukken zelf!
Martijn Hooning COLLEGE ANALYSE OPDRACHT 1 9 september 2009 Hierbij een paar vragen over twee stukken die we deze week en vorige week hebben besproken: Mondnacht van Schumann, en het eerste deel van het
Nadere informatieDatastructuren en Algoritmen voor CKI
Ω /texmf/tex/latex/uubeamer.sty-h@@k 00 /texmf/tex/latex/uubeamer.sty Datastructuren en Algoritmen voor CKI Vincent van Oostrom Clemens Grabmayer Afdeling Wijsbegeerte Hoorcollege 5 16 februari 2009 Waar
Nadere informatieModelleren 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 informatieFOR DUTCH STUDENTS! ENGLISH VERSION NEXT PAGE. Toets Inleiding Kansrekening 1 7 februari 2011
FOR DUTCH STUDENTS! ENGLISH VERSION NEXT PAGE Toets Inleiding Kansrekening 1 7 februari 2011 Voeg aan het antwoord van een opgave altijd het bewijs, de berekening of de argumentatie toe. Als je een onderdeel
Nadere informatieMyDHL+ ProView activeren in MyDHL+
MyDHL+ ProView activeren in MyDHL+ ProView activeren in MyDHL+ In MyDHL+ is het mogelijk om van uw zendingen, die op uw accountnummer zijn aangemaakt, de status te zien. Daarnaast is het ook mogelijk om
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 informatieTentamen Computersystemen
Tentamen Computersystemen baicosy6 2e jaar bachelor AI, 2e semester 21 oktober 213, 9u-11u OMHP D.9 vraag 1 Van een Single Cycle Harvard machine hebben de componenten de volgende propagation delay time:
Nadere informatieROM en RAM in een ROMforth
Albert Nijhof 24/06/2016 ROM en RAM in een ROMforth Vragen Twee HERE's? Voor een forth die in (Flash)ROM compileert is het uitgangspunt dat programmacode en onveranderlijke data naar ROM gaan en veranderbare
Nadere informatieFOR DUTCH STUDENTS! ENGLISH VERSION NEXT PAGE
FOR DUTCH STUDENTS! ENGLISH VERSION NEXT PAGE Tentamen Analyse 8 december 203, duur 3 uur. Voeg aan het antwoord van een opgave altijd het bewijs, de berekening of de argumentatie toe. Als jeeen onderdeel
Nadere informatiepublic 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 informatieTentamen Objectgeorienteerd Programmeren IN1205 Voorbeeld
Tentamen Objectgeorienteerd Programmeren IN1205 Voorbeeld Afdeling ST Faculteit EWI TU Delft Bij dit tentamen mag u gebruik maken van: Barnes, Object-Oriented Programming with Java en de Notitie Algoritmiek
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 informatieControle structuren. Keuze. Herhaling. Het if statement. even1.c : testen of getal even of oneven is. statement1 statement2
Controle structuren De algemene vorm: 1 bloks door middel van indentatie Keuze Herhaling if expressie :...... In de volgende vorm is het else gedeelte weggelaten: if expressie :... Het if keuze- of conditioneel
Nadere informatieLab Webdesign: Javascript 3 maart 2008
H5: OPERATORS In dit hoofdstuk zullen we het hebben over de operators (of ook wel: operatoren) in JavaScript waarmee allerlei rekenkundige en logische bewerkingen kunnen worden uitgevoerd. Daarbij zullen
Nadere informatie2000 Volkswagen Passat GLS
REAR DOOR WINDOW Rear door window, assembly overview Fig. 304: Exploded View Of Rear Door Window 1 - Door Removing and installing: --> Rear door, removing and installing 2 - Spring nut Qty 2 3 - Screw
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 informatieGenetische algoritmen in Java met JGAP
Genetische algoritmen in Java met JGAP Inleiding JGAP, uitgesproken als "jee-gep", is een framework voor het implementeren van genetische algoritmen en het gebruik ervan in Java. Genetische algoritmen
Nadere informatieDatastructuren en algoritmen voor CKI
Datastructuren en algoritmen voor CKI Jeroen Bransen 1 2 oktober 2015 1 met dank aan Hans Bodlaender en Gerard Tel Priority queue Priority queue ADT insert(q, x): voeg element x toe aan de queue maximum(q):
Nadere informatieHoofdstuk 9: Menu s toevoegen
Programmeren in Microsoft Visual Basic 6.0, lessenserie voor het voortgezet onderwijs HAVO/VWO David Lans, Emmauscollege, Marnix Gymnasium Rotterdam, maart 2005 Hoofdstuk 9: Menu s toevoegen 9.0 Leerdoel
Nadere informatieIntermax backup exclusion files
Intermax backup exclusion files Document type: Referentienummer: Versienummer : Documentatie 1.0 Datum publicatie: Datum laatste wijziging: Auteur: 24-2-2011 24-2-2011 Anton van der Linden Onderwerp: Documentclassificatie:
Nadere informatieThe first line of the input contains an integer $t \in \mathbb{n}$. This is followed by $t$ lines of text. This text consists of:
Document properties Most word processors show some properties of the text in a document, such as the number of words or the number of letters in that document. Write a program that can determine some of
Nadere informatie1. Coroutines in C Pull Push Makefile Pull Push Push som Link...
Inhoudsopgave 1. Coroutines in C++... 1 1.1. Pull... 1 1.2. Push... 2 1.3. Makefile... 3 1.4. Pull2... 3 1.5. Push2... 4 1.6. Push som... 4 1.7. Link... 5 1. Coroutines in C++ 1.1. Pull De laatste standaard
Nadere informatieOptimalisatie technieken
Things should be made as simple as possible, but not any simpler. Floatingpoint berekeningen Floatingpoint getallen kun je praktisch niet met elkaar vergelijken. De meeste embedded systemen hebben geen
Nadere informatien-queens Local Search met Conflict Minimalizatie
n-queens Local Search met Conflict Minimalizatie Efficient Local Search with Conflict Minimalization: A Case Study of the n-queens Problem, door Rok Sosič en Jun Gu. Sjoerd van Egmond svegmond@liacs.nl
Nadere informatieFunction checklist for the ML-350 or XL-350 with a print set. Missing loop.
Function checklist for the ML-350 or XL-350 with a 260217 print set. Below mentioned check-point should resolve function problems of the lift systems. Missing loop. When a lift is connected to an external
Nadere informatieJavascript 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