MMI The Digital World 4 Peter van Kranenburg
Intro Vandaag: Terugblik vorige week Leren programmeren Algoritmes
Terugblik Hogere-orde programmeertalen maken het schrijven van code eenvoudiger. Je hoeft vrijwel nooit assemblercode te schrijven. De eenvoud is echter betrekkelijk: een bug zit in een klein hoekje. een omvangrijke hoeveelheid code wordt al snel onoverzichtelijk. Veel functionaliteit is al geïmplementeerd en beschikbaar. Het besturingssysteem verzorgt (o.a.) het aansturen van de hardware.
Leren Programmeren Een programmeertaal heeft: 1. syntax : de structuur van wat uitgedrukt wordt. 2. semantiek : de betekenis van wat uitgedrukt wordt. 3. Lexicon : de woordenschat Syntax is gedefinieerd door een verzameling productieregels. De set regels wordt een grammatica genoemd.
Leren Programmeren: grammatica Een (contextvrije) grammatica wordt gedefinieerd door: Een set eindsymbolen Een set tussensymbolen Een set productieregels met de vorm NTS ts, waarbij NTS : tussensymbool ts : string met eindsymbool en tussensymbolen Een startsymbool (één van de tussensymbolen)
Leren Programmeren: grammatica NTS ts Voorbeeld van een grammatica met twee regels: Eindsymbolen: a en b Tussensymbolen: S S Startsymbool: S regel 2 Productieregels: 1. S a bs regel 2 2. S bs bbs bba is een geldige expressie in deze taal. bbbba ook bba regel 1 syntaxboom parse tree bab niet
Leren Programmeren: grammatica NTS ts Voorbeeld: Eindsymbolen: e, j, 3 Tussensymbolen: T Startsymbool: T Productieregels: 1. T etj 2. T jt 3. T 3 T jt jetj jejtj jej3j regel 2 regel 1 regel 2 regel 3 Een van de niet-eindsymbolen is het startsymbool. Deze representeert de gehele expressie. In dit geval is het T.
Leren Programmeren: grammatica NTS ts Voorbeeld: Eindsymbolen: 3, 5, 8 Tussensymbolen: S, A, B Startsymbool: S Productieregels: 1. S SS 3. S BA 4. B 3A 5. A 5 6. A 8 385358 is een geldige expressie in deze taal.
Leren Programmeren: grammatica Voorbeeld: getallen in JavaScript. Uit de standaard (iets andere notatie):
Leren Programmeren: grammatica Getallen in JavaScript (vervolg). https://www.ecma-international.org/publications/files/ecma-st/ecma-262.pdf
Leren Programmeren: grammatica Voorbeeld: 3.48e10 ( = 3,48 x 10 10 = 34.800.000.000 )
Leren Programmeren: grammatica Voorbeeld: 3.48e10
Leren Programmeren: grammatica Voorbeeld: 3.48e10
Leren Programmeren: grammatica Voorbeeld: 3.48e10
Leren Programmeren: grammatica Voorbeeld: 3.48e10
Leren Programmeren: grammatica Voorbeeld: 3.48e10
Leren Programmeren: grammatica Voorbeeld: 3.48e10
Leren Programmeren: grammatica Voorbeeld: 3.48e10
Leren Programmeren: grammatica Voorbeeld: 3.48e10
Leren Programmeren: grammatica Voorbeeld: 3.48e10
Leren Programmeren: grammatica Voorbeeld: 3.48e10
Leren Programmeren: grammatica Voorbeeld: 3.48e10
Leren Programmeren: grammatica Voorbeeld: 3.48e10
Leren Programmeren: grammatica Voorbeeld: 3.48e10
Leren Programmeren: grammatica Voorbeeld: 3.48e10
Leren Programmeren: grammatica Voorbeeld: 3.48e10
Leren Programmeren: grammatica De syntax van een programmeertaal wordt geheel en ondubbelzinnig vastgelegd door een dergelijke grammatica. Zie: https://www.ecma-international.org/publications/files/ecma- ST/Ecma-262.pdf voor de grammatica van JavaScript. (De standaard heet officiëel ECMAScript).
Leren Programmeren: Semantiek Semantiek: De betekenis van de expressies. Voorbeeld: wederom getallen in de JavaScript standaard:
Leren Programmeren Een compiler gebruikt de grammatica om de programmeercode te ontleden in elementen. Vervolgens wordt de betekenis van de elementen uitgevoerd. Daar moet de programmeur van de compiler voor zorgen.
Leren Programmeren: JavaScript JavaScript wordt uitgevoerd door een webbrowser. Een JavaScript-programma wordt dus ingebed in een web-pagina. Voorbeeld: <html> <body> <script> alert( Hello, world ); </script> </body> <html> HTML JavaScript HTML
Leren Programmeren: JavaScript <html> <body> <script> alert( Hello, world ); </script> </body> <html> Sla deze code op in een tekstbestand met de extensie.html Open het bestand in een browser. Of gebruik een online tool. Bijvoorbeeld: http://math.chapman.edu/~jipsen/js/
Leren Programmeren: JavaScript <html> <body> <script> alert( Hello, world ); </script> </body> <html> Roept functie alert() aan.
Leren Programmeren: JavaScript <html> <body> <script> alert( Hello, world ); </script> </body> <html> https://www.w3schools.com/jsref/met_win_alert.asp
Leren Programmeren: JavaScript var username; username = prompt("what s your name?"); alert("hello, " + username); 3 statements statement: een uitvoerbare instructie
Leren Programmeren: JavaScript var username; username = prompt("what s your name?"); alert("hello, " + username); Declareert een variabele (label voor een geheugenplaats). Declareren: Er wordt een geheugenlocatie aangevraagd om iets op te slaan. Het is nog niet duidelijk wat er opgeslagen gaat worden. Het is zelfs niet duidelijk wat voor soort data er opgeslagen gaat worden (getal, tekst, lijst, ). Wel krijgt de locatie een naam, in dit geval: username.
Leren Programmeren: JavaScript Variabelen kunnen verschillende soorten data bevatten: var x = 3; getal var x = 3.14; getal var x = "Hello, world!"; string (tekst) var x = "3"; string (tekst) var x = ["Saab", "Volvo", "BMW"]; lijst
Leren Programmeren: JavaScript var username; username = prompt("what s your name?"); alert("hello, " + username); Roept functie prompt() aan.
Leren Programmeren: JavaScript var username; username = prompt("what s your name?"); alert("hello, " + username); Roept functie prompt() aan. https://www.w3schools.com/jsref/met_win_prompt.asp
Leren Programmeren: JavaScript Toekenning var username; username = prompt("what s your name?"); alert("hello, " + username); Roept functie prompt() aan. Hierna bevat de variabele username de tekst die de gebruiker heeft ingevoerd.
Leren Programmeren: JavaScript var username; username = prompt("what s your name?"); alert("hello, " + username); Roept functie alert() aan.
Leren Programmeren: JavaScript "Hello, " + username Als de operator + wordt gebruikt voor tekst-strings, krijgt deze de betekenis: aaneenschakelen. "Hello, " + "John" "Hello, John" "1"+"2"+"3"+"4" "1234" 1+2+3+4 10 http://math.chapman.edu/~jipsen/js/
Leren Programmeren: JavaScript Program flow Conditionals: ALS DAN ANDERS var b = 3; if (b > 0) alert("groter dan nul"); Conditional: Als b groter dan nu, dan alert
Leren Programmeren: JavaScript Program flow Conditionals: ALS DAN ANDERS if ( condition ) block else block block : { statement1; statement2; statement n; }
Leren Programmeren: JavaScript Program flow if ( condition ) block; else block; Conditionals: ALS DAN ANDERS var b = parseint(prompt("geef een getal")); if (b > 0) alert("groter dan nul"); else alert("kleiner of gelijk aan nul");
Leren Programmeren: JavaScript var b = parseint(prompt("geef een getal")); Vraag gebruiker een getal (tekst) Maak er een getal van Sla het resultaat op in variabele b
Leren Programmeren: JavaScript Program flow if ( condition ) block; else block; Conditionals: ALS DAN ANDERS var b = parseint(prompt("geef een getal")); if (b > 0) alert("groter dan nul"); else alert("kleiner of gelijk aan nul");
Leren Programmeren: JavaScript Loop (lus): statements een aantal keer herhalen. var n = parseint(prompt("geef een getal")); var res = 1; var input = n; while ( n > 0 ) { res = res * n; Lus: Zolang n groter is dan nul, doe {.} n = n - 1; } alert ( input + "! is " + res);
Leren Programmeren: JavaScript Functie: stukje code met een naam. function fact(n) { var res = 1; while ( n > 0 ) { res = res * n; n = n - 1; } return res; }
Leren Programmeren: JavaScript Functie: stukje code met een naam. function fact(n) { } Naam Uit te voeren opdrachten Invoer: 1 variabele n
Leren Programmeren: JavaScript Functie: stukje code met een naam. function fact(n) { var res = 1; while ( n > 0 ) { res = res * n; n = n - 1; } return res; } De functie geeft een waarde terug.
Leren Programmeren: JavaScript Functie: stukje code met een naam. De functie fact() kan nu gebruikt worden. Bijvoorbeeld: var i = 10; while ( i > 0 ) { var f = fact(i); alert(i + "! is " + f); i = i - 1; }
Leren Programmeren: JavaScript In Javascript is witruimte (spaties, tabs, regeleinden) optioneel en betekenisloos. We gebruiken dit alleen voor de leesbaarheid. function fact(n) { var res = 1; while ( n > 0 ) { res = res * n; n = n - 1; } return res; } Doet hetzelfde als function fact(n){var res=1;while(n>0){res=res*n;n=n- 1;}return res;}
Algoritmes INVOER Algoritme (Procedure) UITVOER Algoritme: Een procedure/stappenplan om iets uit te rekenen. Neemt invoer Genereert uitvoer Bestaat uit stappenplan voor berekening Heeft geheugen ter beschikking voor invoer, uitvoer en tussenresultaten
Algorithms INVOER Algoritme (Procedure) UITVOER Kernighan (p.56): Careful, precise, unambiguous, sequence of steps. Each step is expressed in basic operations whose meaning is completely specified. Guaranteed to compute a result correctly. No ambiguity about what anything means. The nature of the input (and output) data is given. All possible situations are covered: the algorithm never encounters a situation where it doesn t know what to do next. Has to stop eventually.
Algoritmes Voorbeeld: Maximum van een lijst getallen. INVOER Lijst getallen Algoritme (Procedure) UITVOER Grootste getal 1, 2, 3 5, 8, 3, 4, 1 0, 5, 0, 5 3 8 5
Algoritmes Voorbeeld: Maximum van een lijst getallen. VRAAG: Hoe doe ik dit stap voor stap? ALGORITME voor lijst met één getal {a}: 1. max = a 2. return max
Algoritmes Voorbeeld: Maximum van een lijst getallen. VRAAG: Hoe doe ik dit stap voor stap? ALGORITME voor lijst met twee getallen {a, b}: 1. max = a 2. if b > max: max = b 3. return max
Algoritmes Voorbeeld: Maximum van een lijst getallen. VRAAG: Hoe doe ik dit stap voor stap? ALGORITME voor lijst met drie getallen {a, b, c}: 1. max = a 2. if b > max: max = b 3. if c > max: max = c 4. return max
Algoritmes Voorbeeld: Maximum van een lijst getallen. VRAAG: Hoe doe ik dit stap voor stap? ALGORITME voor lijst met vier getallen {a, b, c, d}: 1. max = a 2. if b > max: max = b 3. if c > max: max = c 4. if d > max: max = d 5. return max
Algoritmes Voorbeeld: Maximum van een lijst getallen. VRAAG: Hoe doe ik dit stap voor stap? ALGORITME voor n getallen {x 1, x 2,, x n }: 1. max = x 1 2. for t in {x 2, x 3,, x n }: 3. if t > max : max = t 4. return max Pseudocode
Algoritmes Voorbeeld: Maximum van een lijst getallen. Implementatie in JavaScript: function grootste(lijst) { max = lijst[0]; for ( i = 1; i < lijst.length; i = i + 1) { if ( lijst[i] > max ) max = lijst[i]; } return max; }
Algoritmes Voorbeeld: Maximum van een lijst getallen. VRAAG: Hoeveel stappen heb ik eigenlijk nodig?
Algoritmes Voorbeeld: Maximum van een lijst getallen. VRAAG: Hoeveel stappen heb ik eigenlijk nodig? ALGORITME voor lijst met één getal {a}: 1. max = a 1 stap 2. return max
Algoritmes Voorbeeld: Maximum van een lijst getallen. VRAAG: Hoeveel stappen heb ik eigenlijk nodig? ALGORITME voor lijst met twee getallen {a, b}: 1. max = a 2 stappen 2. if b > max: max = b 3. return max
Algoritmes Voorbeeld: Maximum van een lijst getallen. VRAAG: Hoeveel stappen heb ik eigenlijk nodig? ALGORITME voor lijst met drie getallen {a, b, c}: 1. max = a 2. if b > max: max = b 3 stappen 3. if c > max: max = c 4. return max
Algoritmes Voorbeeld: Maximum van een lijst getallen. VRAAG: Hoeveel stappen heb ik eigenlijk nodig? ALGORITME voor lijst met vier getallen {a, b, c, d}: 1. max = a 2. if b > max: max = b 3. if c > max: max = c 4 stappen 4. if d > max: max = d 5. return max
Algoritmes Voorbeeld: Maximum van een lijst getallen. VRAAG: Hoeveel stappen heb ik eigenlijk nodig? ALGORITME voor n getallen {x 1, x 2,, x n }: 1. max = x 1 2. for t in {x 2, x 3,, x n }: 3. if t > max : max = t 4. return max n stappen
Algoritmes Voorbeeld: Maximum van een lijst getallen. VRAAG: Wat is de verhouding tussen n en het aantal stappen? Uiterst belangrijke vraag!
Algoritmes Voorbeeld: Maximum van een lijst getallen. VRAAG: Wat is de verhouding tussen n en het aantal stappen? Aantal stappen om max van n getallen te vinden = n Lineaire verhouding
Algoritmes complexiteit: de verhouding tussen n en het aantal benodigde stappen. Herinner: n is het aantal elementen in de invoer. Verschillende soorten verhoudingen: De factor die gaat overheersen als n heel groot wordt (-> oneindig) ORDE VAN GROOTTE van het aantal benodigde stappen Constant: a (a is een constante) Logaritmisch log(n) Lineair: n Polynomiaal: Exponentieel: n a a n Factoriaal: n!
Algoritmes complexiteit: de verhouding tussen n en de ordegrootte van het aantal benodigde stappen. Bijvoorbeeld als a=2: Constant: Logaritmisch Lineair: Polynomiaal: Exponentieel: Factoriaal: Altijd 2 stappen n 2 keer zo groot -> 1 stap erbij n 4 keer zo groot -> 2 stappen erbij n 2 keer zo groot -> aantal stappen 2 keer zo groot n 3 keer zo groot -> aantal stappen 3 keer zo groot n 2 keer zo groot -> aantal stappen 4 keer zo groot n 3 keer zo groot -> aantal stappen 9 keer zo groot 1 element erbij -> aantal stappen 2 keer zo groot 2 elementen erbij -> aantal stappen 4 keer zo groot 1 element erbij -> aantal stappen n keer zo groot 2 elementen erbij -> aantal stappen n*(n-1) keer zo groot
Algoritmes Terminologie: Polynomiaal met a=2 : Kwadratisch (n 2 ) Polynomiaal met a=3 : Kubisch (n 3 )
Algoritmes Voorbeeld kwadratisch algoritme: selection sort Doel: een lijst met n getallen sorteren. Idee: Zoek steeds het kleinste getal en zet dat vooraan.
Algoritmes N.B Deze slide is gewijzigd t.o.v. het college Selection sort: voorbeeld met 5 getallen 45 4 4 4 4 6 6 6 6 6 22 22 22 9 9 9 9 9 22 22 4 45 45 45 45 Aantal stappen om kleinste te vinden: 5 + 4 + 3 + 2 + 1 = 15 Voor een lijst van n getallen geldt: n(n+1)/2 vergelijkingen. Dat is in de ordegrootte van n 2.
Algoritmes Exponentiële complexiteit (of meer) is problematisch 2 64-1 is meer dan 18 triljoen!
Algoritmes Belangrijke vraag: Is het mogelijk te bewijzen dat een probleem geen oplossing met polynomiale tijd-complexiteit heeft? Zo ja, dan kun je stoppen met zoeken naar een algoritme dat het probleem in polynomiale tijd oplost.
Algoritmes Er is theorie voor beslis-problemen. Beslisprobleem: Uitkomst is JA of NEE. INVOER Algoritme (Procedure) UITVOER JA of NEE Bijvoorbeeld: Is het gemiddelde van deze lijst getallen groter dan 10? Kruisen deze twee lijnsegmenten? Is x een even getal? etc.
Algoritmes Reductie: Probleem L1 kan tot probleem L2 worden gereduceerd als er een extra bewerking T op de invoer van L1 gedaan kan worden, zodat de resulterende invoer voor L2 gebruikt kan worden, terwijl de uitvoer hetzelfde is als die voor L1 (herinner: JA of NEE). INVOER voor L1 Algoritme voor L1 UITVOER voor L1 INVOER voor L1 T INVOER voor L2 Algoritme voor L2 UITVOER voor L1
Algoritmes Reductie INVOER voor L1 Algoritme voor L1 UITVOER voor L1 INVOER voor L1 T INVOER voor L2 Algoritme voor L2 UITVOER voor L1 T heeft ook een tijd-complexiteit
Algoritmes Er is een klasse (groep) problemen waarvoor geldt: Een oplossing kan in polynomiale tijd worden gevonden. Een oplossing kan in polynomiale tijd worden gecontroleerd. Deze klasse heet P
Algoritmes Er is een klasse (groep) problemen waarvoor geldt: Een oplossing kan in niet-deterministisch polynomiale tijd worden gevonden. Een oplossing kan in polynomiale tijd worden gecontroleerd. Deze klasse heet NP niet-deterministisch polynomiaal: als het algoritme een keuze moet maken, worden alle mogelijkheden tegelijk uitgevoerd (in plaats van ná elkaar). Dit kan alleen door een denkbeeldige machine gedaan worden.
Algoritmes Er is een klasse problemen in NP waarvoor geldt dat elk ander probleem in NP naar een probleem in deze klasse gereduceerd kan worden in polynomiale tijd. Deze klasse heet NP-Volledig (NP-Complete). Als je voor één van deze problemen een algoritme vindt dat in polynomiale tijd een antwoord geeft, heb je een dus ook een algoritme dat alle problemen in NP in polynomiale tijd kan oplossen. Zo'n algoritme is nog niet ontdekt. Zie: Cook, Stephen A. "The complexity of theorem-proving procedures." Proceedings of the third annual ACM symposium on Theory of computing. ACM, 1971.
Algoritmes Een openstaande vraag in de Informatica: P = NP? Eén van de 'milleniumproblemen'. Je kunt $1 miljoen verdienen als je het oplost. Zie ook bijvoorbeeld: https://www.claymath.org/sites/default/files/pvsnp.pdf https://www.win.tue.nl/~gwoegi/p-versus-np.htm http://www.claymath.org/millennium-problems
Algoritme Voorbeeld: Handelsreiziger (Travelling salesman): Ik wil een aantal steden bezoeken via de wegen die tussen de steden lopen. Welke route moet ik nemen zodat ik de kortst mogelijke afstand afleg, maar wel alle steden bezoek? Geen oplossing in polynomiale tijd bekend. De 'beslisvariant' van dit probleem is in set NP-Volledig.
Tentamen Drie soorten vragen. Kennis-vragen Welke programmeertaal werd eerder ontwikkeld, Java of Fortran? Wat is een lineair algoritme? Vaardigheid-vragen Getalconversies (dec->bin, bin->hex, etc) Geheugenrepresentatie Inzicht-vragen Waarom werkt dit toy-cpu programma niet?