Programmeertechnieken

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

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

Lineaire data structuren. Doorlopen van een lijst

Uitwerking tentamen Algoritmiek 9 juli :00 13:00

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

Tentamen Programmeren in C (EE1400)

Tweede college algoritmiek. 12 februari Grafen en bomen

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

Tentamen Programmeren in C (EE1400)

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

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

Algoritmiek. 15 februari Grafen en bomen

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

Tentamen Programmeren in C (EE1400)

Achtste college algoritmiek. 8 april Dynamisch Programmeren

Javascript oefenblad 1

Programmeermethoden. Pointers. Walter Kosters. week 10: november kosterswa/pm/

Uitwerking tentamen Algoritmiek 9 juni :00 17:00

Modelleren en Programmeren

Een gelinkte lijst in C#

Modelleren en Programmeren

Datastructuren: stapels, rijen en binaire bomen

Inleiding Programmeren 2

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

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

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

Tiende college algoritmiek. 26 april Gretige algoritmen

Tentamen in2705 Software Engineering

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

is eigenlijk overbodig!

10 Meer over functies

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

Uitwerking tentamen Algoritmiek 10 juni :00 13:00

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

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

Elementary Data Structures 3

Examen Programmeren I 2e Bachelor Elektrotechniek en Computerwetenschappen Faculteit Ingenieurswetenschappen Academiejaar juni 2011

Inleiding Programmeren 2


Datastructuren: stapels, rijen en binaire bomen

Een eenvoudig algoritme om permutaties te genereren

Tiende college algoritmiek. 14 april Gretige algoritmen

ALGORITMIEK: antwoorden werkcollege 5

ALGORITMIEK: antwoorden werkcollege 5

Deel 1: Arduino kennismaking. Wat is een microcontroller, structuur van een programma, syntax,

1 Inleiding in Functioneel Programmeren

Vijfde college algoritmiek. 2/3 maart Exhaustive search

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

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

Recursie: definitie. De som van de kwadraten van de getallen tussen m en n kan als volgt gedefinieerd worden:

Arduino Cursus, Deel 2 Programmeren. Simon Pauw, ZB45, Amsterdam

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

Presentatie Michiel. Informaticastage najaar 2004

Datastructuren en algoritmen voor CKI

EE1400: Programmeren in C BSc. EE, 1e jaar, , 4e college

Hoofdstuk 3. Week 5: Sorteren. 3.1 Inleiding

U ziet de progressie van de download aan de groene blokjes in het balkje helemaal onder aan de pagina.

Containers stapelen. M.L. Koning april 2013

Verslag Opdracht 4: Magische Vierkanten

Uitwerking tentamen Analyse van Algoritmen, 29 januari

Java Programma structuur

Modelleren en Programmeren

Modelleren en Programmeren

Algoritmiek. 2 februari Introductie

Examencursus. wiskunde A. Rekenregels voor vereenvoudigen. Voorbereidende opgaven VWO kan niet korter

Derde college complexiteit. 7 februari Zoeken

Tiende college algoritmiek. 2 mei Gretige algoritmen, Dijkstra

Opgaven Zoekbomen Datastructuren, 20 juni 2018, Werkgroep.

TW2020 Optimalisering

software constructie recursieve datastructuren college 15 5 stappen plan ontwerpen de software bestaat uiteindelijk uit datatypen functies

Tiende college algoritmiek. 4 mei Gretige Algoritmen Algoritme van Dijkstra

Tweede Toets Datastructuren 28 juni 2017, , Educ-β.

Hoe een TomTom een sudoku oplost

Wat is FP? The Haskell School of Expression. Functies. Types 1+1=2. Iedere expressie (en waarde) heeft een type.

Uitleg. Welkom bij de Beverwedstrijd Je krijgt 15 vragen, die je in maximaal 45 minuten moet beantwoorden.

Uitgebreide uitwerking tentamen Algoritmiek Dinsdag 5 juni 2007, uur

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

Let op dat de scoping regels gerespecteerd blijven; het volgende voorbeeld mag geen fout melden.

ALGORITMIEK: answers exercise class 7

Stoomcursus. wiskunde A. Rekenregels voor vereenvoudigen. Voorbereidende opgaven VWO ( ) = = ( ) ( ) ( ) = ( ) ( ) = ( ) = = ( )

Online c++ leren programmeren:

Dynamisch Programmeren. Het Rugzakprobleem

Zevende college algoritmiek. 24 maart Verdeel en Heers

8C080 deel BioModeling en bioinformatica

Programmeermethoden NA. Week 6: Lijsten

Vakgroep CW KAHO Sint-Lieven

ALGORITMIEK: antwoorden werkcollege 5

extra oefening algoritmiek - antwoorden

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

Semaforen. Semaforen p. 1/2

De doorsnede van twee verzamelingen vinden

Universiteit van Amsterdam FNWI. Voorbeeld van tussentoets Inleiding programmeren

Programmeermethoden NA

Discrete Structuren. Piter Dykstra Opleidingsinstituut Informatica en Cognitie

De MySQL C API. Variabelen in C Functies in C Pointers in C

Hoofdstuk 7: Werken met arrays

Doorzoeken van grafen. Algoritmiek

Tweede Toets Datastructuren 26 juni 2019, , Educ-β.

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

Examen Software Ontwikkeling I 2e Bachelor Informatica Academiejaar Januari, **BELANGRIJK** : Schrijf je naam onderaan dit blad

Transcriptie:

Aanvulling op Programmeren Radboud Universiteit Nijmegen 10 December 2012

1 Omschrijving Linked lists Implementatie Boomstructuren 2 Recursie De rij van Fibonacci Het driehoekprobleem 3 Het substitutiecijfer Tetragramfrequenties

Omschrijving Linked lists Implementatie Boomstructuren Vind de gemiddelde wachttijd in een postkantoor met P loketten N klanten Klanten komen aan tussen 0 en T Gem. verwerkingstijd τ, met P(t) = te t2 Alle klanten worden afgehandeld

De toestand Omschrijving Linked lists Implementatie Boomstructuren De toestand op tijdstip t bestaat uit Het aantal mensen in de rij per kassa De vertrektijden per kassa

Gebeurtenissen Omschrijving Linked lists Implementatie Boomstructuren Er zijn twee type gebeurtenissen Een klant komt aan Een klant vertrekt Eindconditie De simulatie loopt af als er geen gebeurtenissen meer zijn.

Strategieschets Omschrijving Linked lists Implementatie Boomstructuren Er moet gebeuren Gemiddelde over meerdere simulaties Sorteren van gebeurtenissen op tijd Alle geordende gebeurtenissen afwerken Idee Maak een altijd gesorteerde queue m.b.v. een linked list

Linked list code Omschrijving Linked lists Implementatie Boomstructuren 1 struct list_elem { 2 int data; 3 struct list_elem* next; 4 };

Linked list, grafisch Omschrijving Linked lists Implementatie Boomstructuren 13 99 37

Element toevoegen Omschrijving Linked lists Implementatie Boomstructuren 13 99 37 42

Array vs linked list Omschrijving Linked lists Implementatie Boomstructuren Array: Gemakkelijk items toevoegen aan het eind Snel element i opvragen Vaste lengte Linked list: Gemakkelijk items toevoegen in het midden Opvragen is lineair Variabele lengte

De eventstructuur Omschrijving Linked lists Implementatie Boomstructuren 1 #define NEW_CLIENT 0 2 #define CLIENT_HANDLED 1 3 4 typedef struct list_elem { 5 int type; 6 float time; 7 int counter; /* Loketnummer */ 8 struct list_elem* next; 9 } Event;

Sorted insert (I) Omschrijving Linked lists Implementatie Boomstructuren 1 Event* sorted_insert(event* queue, Event* event) { 2 Event* cur = queue; 3 4 /* Moet event vooraan in de queue? */ 5 if (cur == NULL event->time < cur->time) { 6 event->next = cur; 7 return event; 8 }

Sorted insert (II) Omschrijving Linked lists Implementatie Boomstructuren 8 while (cur!= NULL) { 9 if (cur->next == NULL 10 event->time < cur->next->time) { 11 /* Element invoegen */ 12 event->next = cur->next; 13 cur->next = event; 14 return queue; 15 } 16 17 cur = cur->next; 18 }

De simulatie Omschrijving Linked lists Implementatie Boomstructuren 1 Event* queue = NULL; 2 float* counter_time = malloc(p * sizeof(float)); 3 int* counter_queue = malloc(p * sizeof(int)); 4 5 float avg = 0; 6 for (j = 0; j < NUM_ITER; j++) { 7 avg += do_simulation(); 8 } 9 10 float sol = avg / (float)(n * NUM_ITER);

De strategie Omschrijving Linked lists Implementatie Boomstructuren Per simulatie: Vul de queue met aankomstevents Klant bij loket Maak nieuw vertrekevent Klant weg bij loket met rij Maak nieuw vertrekevent Blijf doorgaan zolang de queue niet leeg is

De aankomsten Omschrijving Linked lists Implementatie Boomstructuren Aankomsten kunnen meteen toegevoegd worden 1 for (i = 0; i < N; i++) { 2 Event* new_client = malloc(sizeof(event)); 3 new_client->type = NEW_CLIENT; 4 new_client->time = rand() / (float)rand_max * T; 5 new_client->next = NULL; 6 7 queue = sorted_insert(queue, new_client); 8 }

De queue loop Omschrijving Linked lists Implementatie Boomstructuren 1 while (queue!= NULL) { 2 if (queue->type == NEW_CLIENT) { 3 /* Handel nieuwe client af */ 4 } 5 if (queue->type == CLIENT_HANDLED) { 6 /* Handel vertrek af */ 7 } 8 9 Event* tmp = queue; 10 queue = queue->next; /* Naar de volgende */ 11 free(tmp); 12 }

Een nieuwe client Omschrijving Linked lists Implementatie Boomstructuren 1 if (queue->type == NEW_CLIENT) { 2 int min_counter = get_shortest_queue(); 3 4 counter_queue[min_counter]++; 5 6 if (counter_queue[min_counter] == 1) { 7 add_handled_event(queue, min_counter); 8 } 9 }

De kortste rij Omschrijving Linked lists Implementatie Boomstructuren Kortste rij qua aantal mensen: 1 int get_shortest_queue() { 2 int shortest = 0; 3 for (i = 1; i < P; i++) { 4 if (counter_queue[i] < counter_queue[shortest]) { 5 shortest = i; 6 } 7 } 8 9 return shortest; 10 }

Een afgehandelde client Omschrijving Linked lists Implementatie Boomstructuren 1 if (queue->type == CLIENT_HANDLED) { 2 counter_queue[queue->counter]--; 3 last_time = queue->time; 4 5 if (counter_queue[queue->counter] > 0) { 6 queue = add_handled_event(queue, queue->counter); 7 } 8 }

Een handled event toevoegen Omschrijving Linked lists Implementatie Boomstructuren 1 Event* add_handled_event(event* queue, int counter) { 2 Event* event = malloc(sizeof(event)); 3 event->type = CLIENT_HANDLED; 4 event->time = queue->time + sqrt(-log(rand() 5 / (float)rand_max)) * tau * M_2_SQRTPI; 6 event->counter = counter; 7 event->next = NULL; 8 return sorted_insert(queue, event); 9 }

Finis coronat opus Omschrijving Linked lists Implementatie Boomstructuren Doel bereikt is opgelost! Kleine optimalisaties: Events toevoegen gaat lineair met aantal events Er is een slimmere manier dan linked lists

Binaire boom Omschrijving Linked lists Implementatie Boomstructuren 1 struct tree_elem { 2 float data; 3 struct tree_elem* left; 4 struct tree_elem* right; 5 };

Binaire boom, grafisch Omschrijving Linked lists Implementatie Boomstructuren 0.6 0.4 0.8 0.1 0.5 0.7 0.9

Voor- en nadelen Omschrijving Linked lists Implementatie Boomstructuren Sneller opzoeken Sneller toevoegen Moeilijk te balanceren 0.4 0.6 0.8 0.1 0.5 0.7 0.9

Recursieve functies Recursie De rij van Fibonacci Het driehoekprobleem Een recursieve functie bestaat uit: Een vaste startwaarde / eindwaarde Een aanroeping van zichzelf Eindwaarde functie eindigt In de wiskunde: f (0) = 1 f (n) = n f (n 1)

Voorbeeld in C Recursie De rij van Fibonacci Het driehoekprobleem De faculteitsfunctie: 1 int fac(int n) { 2 if (n == 0) 3 return 1; 4 5 return n * fac(n - 1); 6 }

Recursief vs. niet recursief Recursie De rij van Fibonacci Het driehoekprobleem Recursief: 1 int fac(int n) { 2 if (n == 0) 3 return 1; 4 5 6 return n * fac(n - 1); 7 } Niet recursief: 1 int fac(int n) { 2 int i, f = 1; 3 for (i = 2; i <= n; i++) 4 f *= i; 5 6 return f; 7 }

Fibonacci-serie Recursie De rij van Fibonacci Het driehoekprobleem 0 1 1 2 3 5 8 13 21 34... f 0 = 0 f 1 = 1 f n = f n 1 + f n 2

Naïeve implementatie Recursie De rij van Fibonacci Het driehoekprobleem 1 int fibonacci(int n) { 2 if (n < 2) 3 return n; 4 5 return fibonacci(n - 2) + fibonacci(n - 1); 6 }

Problemen en oplossingen Recursie De rij van Fibonacci Het driehoekprobleem Fibonacci is erg traag voor grote n Er wordt heel veel opnieuw berekend Idee f n 2 (en dus ook f n 1 ) kunnen we onthouden!

Betere implementatie Recursie De rij van Fibonacci Het driehoekprobleem 1 int fib[200] = {0}; 2 3 int fibonacci(int n) { 4 if (n < 2) 5 return n; 6 7 if (fib[n] > 0) 8 return fib[n]; 9 10 int fibn = fibonacci(n - 2) + fibonacci(n - 1); 11 fib[n] = fibn; 12 return fibn; 13 }

Resultaten Recursie De rij van Fibonacci Het driehoekprobleem Antwoord in paar milliseconden! Opslaan van subresultaten heet dynamic programming Snelheid ten koste van geheugen

Het driehoekprobleem Recursie De rij van Fibonacci Het driehoekprobleem 3 Loop naar beneden Zoek pad met hoogste score 7 4 2 4 6 8 5 9 3

Het driehoekprobleem Recursie De rij van Fibonacci Het driehoekprobleem 3 Loop naar beneden Zoek pad met hoogste score 7 4 2 4 6 8 5 9 3

De uitdaging Recursie De rij van Fibonacci Het driehoekprobleem Stel de driehoek is 100 lagen diep Aantal paden: 2 99 Stel je doet 10 12 paden per seconde Dan duurt het nog steeds meer dan 20 miljard jaar!

Subprobleem Recursie De rij van Fibonacci Het driehoekprobleem 3 Waarde bij 3? Bereken waarde bij 7 Bereken waarde bij 4 Pak maximum 7 4 2 4 6 8 5 9 3

Opslaan van waarden Recursie De rij van Fibonacci Het driehoekprobleem Waarde op positie x,y opslaan Simpele oplossing kost wat geheugen 1 int value[100][100]; (0,0) (0,1) (1,1) (0,2) (1,2) (2,2)

Oplossing driehoekprobleem Recursie De rij van Fibonacci Het driehoekprobleem 1 int get_value(int x, int y) { 2 if (y == 99) /* Laatste rij */ 3 return tree[x][y]; 4 5 if (value[x][y] > 0) 6 return value[x][y]; 7 8 int left = get_value(x, y + 1); 9 int right = get_value(x + 1, y + 1); 10 value[x][y] = tree[x][y] + max(left, right); 11 return value[x][y]; 12 }

Het substitutiecijfer Het substitutiecijfer Tetragramfrequenties Maak een bijectie: A B C D E F G H I J K L M N O P Q R S T U V W X Y Z G T U J C P L D O R Y W X Z F I V Q S K A N E M H B Vertaal: HALLO DGWWF WERELD ECQCWJ

De uitdaging Het substitutiecijfer Tetragramfrequenties Aantal mogelijkheden: 26! 4 10 26 Hoe vinden we de originele tekst? Welke eigenschap van de brontekst blijft bewaard?

Letterfrequenties Het substitutiecijfer Tetragramfrequenties 0.14 0.12 0.1 0.08 0.06 0.04 0.02 0 e t a o i n s h r d l c u m w f g y p b v k j x q z

Tetragrammen Het substitutiecijfer Tetragramfrequenties Letterfrequenties zijn een goed begin Tetragramfrequenties zijn stabieler DITISEENZIN splitst op in DITI, ITIS, TISE, ISEE, SEEN, EENZ, ENZI, NZIN Bereken frequenties uit grote boeken (bijbel)

Strategie Het substitutiecijfer Tetragramfrequenties Een tekst lijkt meer op Nederlands als de tetragramfrequenties overeenkomen! Score We kunnen dus een scorefunctie maken Tel de frequenties f in tekst Vergelijk met de referentie r S = i e (f i r i ) 2 2σ 2

Oplossingsruimte Het substitutiecijfer Tetragramfrequenties We zoeken oplossing met hoogste score Oplosruimte is te groot om alles af te gaan

Het substitutiecijfer Tetragramfrequenties We zoeken absoluut maximum Stel we beginnen op een random plaats Zoek een pad naar boven Idee Bekijk buren van de huidige locatie en loop naar buur die beter is

code Het substitutiecijfer Tetragramfrequenties 1 void hillclimb(char* text, char* alpha) { 2 int i, j; 3 float best_score = 0; 4 5 for (i = 0; i < 25; i++) 6 for (j = i + 1; j < 26; j++) { 7 swap(alpha, i, j); 8 float new_score = score(transcribe(text, alpha)); 9 if (new_score > best_score) { 10 i = j = 0; 11 best_score = new_score; 12 } else 13 swap(alpha, i, j); 14 } 15 }

Einde Het substitutiecijfer Tetragramfrequenties Computer science education cannot make anybody an expert programmer any more than studying brushes and pigment can make somebody an expert painter. (Eric Raymond)