{"id":6183,"date":"2012-11-05T20:39:43","date_gmt":"2012-11-06T01:39:43","guid":{"rendered":"http:\/\/cscircles.cemc.uwaterloo.ca\/?page_id=6183"},"modified":"2015-12-02T03:35:11","modified_gmt":"2015-12-02T08:35:11","slug":"18-efficiency-nl","status":"publish","type":"page","link":"https:\/\/cscircles.cemc.uwaterloo.ca\/dev\/18-efficiency-nl\/","title":{"rendered":"18: Effici\u00ebntie"},"content":{"rendered":"<p>Veel programmeertaken kunnen op meer dan \u00e9\u00e9n manier worden uitgevoerd, maar de ene manier kan veel sneller zijn dan een andere. Snelle programma's ontwerpen is een deel van de kunst en wetenschap van het programmeren van een computer. In deze oefening kijken we naar een aantal voorbeelden.<\/p>\n<h1>Deel 1: Bereken niet twee keer hetzelfde<\/h1>\n<p>De <a href=\"http:\/\/en.wikipedia.org\/wiki\/Fibonacci_number\">Rij van Fibonacci<\/a> is een fascinerende maar ook eenvoudige rij getallen. Begin met twee getallen, 1 en 1. Dan is de regel:<em> om het volgende getal te krijgen tel je de vorige twee op<\/em>. Het volgende getal is dus 1+1=2. Dan hebben we de eerste drie elementen,<\/p>\n<p><code>1, 1, 2<\/code><\/p>\n<p>en het vierde element is 1+2=3, vervolgens krijgen we 2+3=5, enzovoort:<\/p>\n<p><code>1, 1, 2, 3, 5, 8, 13, ...<\/code><\/p>\n<p>De\u00a0 Rij van Fibonacci werd aanvankelijk gebruikt om de populatie van konijnen te beschrijven, en het heeft ook fantastische relaties met de architectuur van planten. Hier is een deel van een videoserie over de Rij van Fibonacci: <div style='text-align: center;'>\n<iframe width='560' height='315' src='https:\/\/www.youtube.com\/embed\/ahXIMUkSXX0?rel=0' frameborder='0' allowfullscreen>\n<\/iframe>\n<\/div>\n<p>De definitie van de de Rij van Fibonacci leent zich natuurlijk voor een recursieve functie. In de volgende oefening wordt een functie <code>Fibonacci(n)<\/code> gedefinieerd die het\u00a0 <code>n<\/code>de element levert uit de rij hierboven (te beginnen met <code>n=1<\/code>).<\/p>\n<p><form class=\"pbform\" action=\"#\" id=\"pbform0\" method=\"POST\">\n<div class='pybox modeNeutral scramble' id='pybox0'>\n<img title='You have not yet completed this problem.' src='https:\/\/cscircles.cemc.uwaterloo.ca\/dev\/wp-content\/plugins\/pybox\/files\/icon.png' class='pycheck'\/><div class=\"heading\"><span class='type'>Scramble Exercise: <\/span><span class='title'>Nibofacci<\/span><\/div>Sleep in dit programma de regels in de juiste volgorde zodat er een recursieve functie ontstaat dat de Rij van Fibonacci oplevert. De grader zal de eerste tien ervan afdrukken.<ul class=\"pyscramble\" name=\"pyscramble\" id=\"pyscramble0\">\n <li class=\"pyscramble\">def Fibonacci(n):<\/li>\n <li class=\"pyscramble\">        return Fibonacci(n-1) + Fibonacci(n-2)<\/li>\n <li class=\"pyscramble\">    if (n==1 or n==2):<\/li>\n <li class=\"pyscramble\">        return 1<\/li>\n <li class=\"pyscramble\">    else:<\/li>\n<\/ul>\n<input type='hidden' id='usercode0' name='usercode0'\/>\n<div id='pbhistory0' class='flexcontain' style='display:none;'><\/div>\n<div name=\"pyinput\" id=\"pyinput0\">Enter testing statements like <code>print(myfunction(\"test argument\"))<\/code> below.<div class=\"pyboxTextwrap resizy\" style=\"height: 102px;\" ><textarea wrap=\"off\" name=\"userinput\" class=\"pyboxInput\" cols=10 rows=4><\/textarea><\/div><\/div>\n<div class='pyboxbuttons'><table><tr>\n<td><input type='submit' name='submit' id='submit0' value=' '\/><\/td>\n<td><input type='button' name='switch' id=\"switch0\" value=\"Input Switch\" onclick=\"pbInputSwitch(0,'Y')\" ><\/td>\n<\/tr><\/table><\/div>\n<input type=\"hidden\" name=\"lang\" value=\"\"\/><input type=\"hidden\" id=\"inputInUse0\" name=\"inputInUse\" value=\"Y\"\/>\n<input type=\"hidden\" name=\"pyId\" value=\"0\"\/>\n<input type=\"hidden\" name=\"hash\" value=\"771d5db1d831345d1541a0f9df133ac8\"\/>\n<div id='pbresults0' class='pbresults'><\/div>\n<\/div>\n<\/form>\n<script type='text\/javascript'>pbInputSwitch(0,\"Y\");<\/script>\n<\/p>\n<p>Deze recursieve functie wordt echter te langzaam om elementen te berekenen die een eind verderop in\u00a0 de rij staan. Druk op <strong>Test statements invoeren<\/strong> en\u00a0 type <code>print(Fibonacci(80))<\/code>. Wanneer je dit test krijg je \"Time Limit Exceeded.\"<\/p>\n<p>Waarom gaat dat zo langzaam? De functie kent geen complexe instructies of loops, alleen maar optellen. Dus moet de traagheid wel gerelateerd zijn aan het aantal keren dat de functie wordt aangeroepen. Wanneer we <code>Fibonacci(3)<\/code> aanroepen, wordt de functie in totaal drie keer aangeroepen: de begin-aanroep, en dan twee recursieve aanroepen. Wanneer we <code>Fibonacci(4) <\/code>aanroepen, wordt de recursive functie vijf keer aangeroepen: de begin-aanroep de drie keer die we juist noemden bij <code>n=3<\/code>, en nog een recursieve aanroep met <code>n=2<\/code>. Bij het berekenen van <code>Fibonacci(5)<\/code> gebruiken we in totaal negen aanroepen, en bij\u00a0<code>Fibonacci(6)<\/code> zijn er 9+5+1=15 aanroepen. Het aantal aanroepen wordt snel erg groot bij toenemende <code>n<\/code>!<\/p>\n<p>Als ruwe schatting heeft\u00a0<code>Fibonacci(n+2)<\/code> twee maal zoveel aanroepen nodig als <code>Fibonacci(n)<\/code>, want <code>Fibonacci(n+2) <\/code>roept <code>Fibonacci(n)<\/code> eenmaal direct aan, en een ander keer indirect via de recursieve aanroep van\u00a0 <code>Fibonacci(n+1)<\/code>. Dus is de rekentijd evenredig met met een\u00a0 <em>exponenti\u00eble functie<\/em> tenminste zo groot als (\u221a2)<sup>n<\/sup>. Dit is te langzaam! De aanroep <code>Fibonacci(80)<\/code> vergt bijvoorbeeld al meer dan\u00a0 2<sup>40<\/sup> =\u00a01099511627776 recursieve aanroepen.<\/p>\n<p>Bovenstaand argument schetst het probleem: <code>Fibonacci(n)<\/code> twee keer aanroepen en het antwoord erop helemaal opnieuw te berekenen is tijdverspilling. We moeten een nieuwe aanpak verzinnen waarbij we geen tijd verspillen met steeds weer hetzelfde keer op keer te berekenen.<\/p>\n<h2>De\u00a0 oplossing<\/h2>\n<p>Laten we proberen iets in Python te schrijven dat meer lijkt op wat we in de inleiding hebben gedaan. We begonnen door 1, 1 op te schrijven. Dan gingen we verder met het uitbreiden van de rij door de laatste twee elementen op te tellen. Hier volgt de code; het is jouw taak om de regels in de juiste volgorde te zetten.<\/p>\n<p><form class=\"pbform\" action=\"#\" id=\"pbform1\" method=\"POST\">\n<div class='pybox modeNeutral scramble' id='pybox1'>\n<img title='You have not yet completed this problem.' src='https:\/\/cscircles.cemc.uwaterloo.ca\/dev\/wp-content\/plugins\/pybox\/files\/icon.png' class='pycheck'\/><div class=\"heading\"><span class='type'>Scramble Exercise: <\/span><span class='title'>Fast Fibonacci<\/span><\/div>Zet de regels, van het programma waarmee snel grote waarden van de Rij van Fibonacci berekend kunnen worden, in de juiste volgorde.<ul class=\"pyscramble\" name=\"pyscramble\" id=\"pyscramble1\">\n <li class=\"pyscramble\">    for i in range(3, n+1):      <\/li>\n <li class=\"pyscramble\">        sequence.append(sequence[i-1] + sequence[i-2])<\/li>\n <li class=\"pyscramble\">def Fibonacci(n):<\/li>\n <li class=\"pyscramble\">    sequence = [0, 1, 1]  # Fibonacci(0) is 0, Fibonacci(1) and Fibonacci(2) are 1<\/li>\n <li class=\"pyscramble\">    return sequence[n]<\/li>\n<\/ul>\n<input type='hidden' id='usercode1' name='usercode1'\/>\n<div id='pbhistory1' class='flexcontain' style='display:none;'><\/div>\n<div name=\"pyinput\" id=\"pyinput1\">Enter testing statements like <code>print(myfunction(\"test argument\"))<\/code> below.<div class=\"pyboxTextwrap resizy\" style=\"height: 102px;\" ><textarea wrap=\"off\" name=\"userinput\" class=\"pyboxInput\" cols=10 rows=4><\/textarea><\/div><\/div>\n<div class='pyboxbuttons'><table><tr>\n<td><input type='submit' name='submit' id='submit1' value=' '\/><\/td>\n<td><input type='button' name='switch' id=\"switch1\" value=\"Input Switch\" onclick=\"pbInputSwitch(1,'Y')\" ><\/td>\n<\/tr><\/table><\/div>\n<input type=\"hidden\" name=\"lang\" value=\"\"\/><input type=\"hidden\" id=\"inputInUse1\" name=\"inputInUse\" value=\"Y\"\/>\n<input type=\"hidden\" name=\"pyId\" value=\"1\"\/>\n<input type=\"hidden\" name=\"hash\" value=\"142dda911985eef1c235b123ab62a5ad\"\/>\n<div id='pbresults1' class='pbresults'><\/div>\n<\/div>\n<\/form>\n<script type='text\/javascript'>pbInputSwitch(1,\"Y\");<\/script>\n<\/p>\n<p>Er is steeds nog wat ruimte voor verbeteringen, omdat bij een nieuwe aanroep het niet nodig is de hele array opnieuw te berekenen, maar het is goed genoeg omdat het snel werkt zelfs bij grote waarden van n!<\/p>\n<h1>Deel 2: Bereken geen onnodige dingen<\/h1>\n<p>Ons tweede voorbeeld gaat over de test of een getal\u00a0<strong>priem\u00a0<\/strong>is. Dit is belangrijk voor cryptografie en computerbeveiliging. Een getal is priem wanneer het precies twee delers heeft: 1 en zichzelf. De eerste priemgetallen zijn 2, 3, 5, 7, 11, 13, 17, 19, 23. (21 bijvoorbeeld is niet priem, omdat het, naast 1 en 21, delers 3 en 7 heeft.)<\/p>\n<p>Hoe kunnen we in Python testen of een getal priem is? We zagen\u00a0<a href=\"\/7b-math\/\">eerder<\/a>\u00a0hoe we deelbaarheid kunnen testen:<\/p>\n<p><code>N % D == 0 \u00a0# will be True if D is a divisor of N, False otherwise<\/code><\/p>\n<p>Door te testen op alle mogelijke delers, komen we tot het volgende programma.<\/p>\n<p><form class=\"pbform\" action=\"#\" id=\"pbform2\" method=\"POST\">\n<div class='pybox modeNeutral  facultative' id='pybox2'>\n<div class=\"heading\"><span class=\"title\">Example<\/span><\/div>Test om na te gaan of een paar getallen priem zijn<div class='pyboxTextwrap pyboxCodewrap RO '  style='height: 162px;'><textarea wrap='off' name='usercode2' id='usercode2'  cols=10 rows=6 readonly='readonly'  style = 'height : 162px;'  class='pyboxCode RO'>\ndef isItPrime(N):\n  for D in range(2, N):                        # test D from 2 to N-1\n    if N % D == 0:                             # is D a divisor of N?\n      print(N, \"is not prime; divisible by\", D)\n      return\n  print(N, \"is prime\")                         # there were no divisors<\/textarea><\/div>\n<div id='pbhistory2' class='flexcontain' style='display:none;'><\/div>\n<div name=\"pyinput\" id=\"pyinput2\">Enter testing statements like <code>print(myfunction(\"test argument\"))<\/code> below.<div class=\"pyboxTextwrap resizy\" style=\"height: 102px;\" ><textarea wrap=\"off\" name=\"userinput\" class=\"pyboxInput\" cols=10 rows=4><\/textarea><\/div><\/div>\n<div class='pyboxbuttons'><table><tr>\n<td><input type='submit' name='submit' id='submit2' value=' '\/><\/td>\n<td><input type='button' name='switch' id=\"switch2\" value=\"Input Switch\" onclick=\"pbInputSwitch(2,'Y')\" ><\/td>\n<td><input type='button' name='consolecopy' value=\"Open in console\" onclick=\"pbConsoleCopy(2)\" ><\/td>\n<td><input type='button' name='visualize' value=\"Visualize\" onclick=\"pbVisualize(2,'Y')\" ><\/td>\n<\/tr><\/table><\/div>\n<input type=\"hidden\" name=\"lang\" value=\"\"\/><input type=\"hidden\" id=\"inputInUse2\" name=\"inputInUse\" value=\"Y\"\/>\n<input type=\"hidden\" name=\"pyId\" value=\"2\"\/>\n<input type=\"hidden\" name=\"hash\" value=\"6c26fa224dbd58cfcb868c800ad7b407\"\/>\n<div id='pbresults2' class='pbresults'><\/div>\n<\/div>\n<\/form>\n<script type='text\/javascript'>pbInputSwitch(2,\"Y\");<\/script>\n<\/p>\n<p>Het werkt! Maar het is te langzaam bij grote getallen. Ga naar\u00a0<strong>Enter input<\/strong>\u00a0en vul in\u00a0<code>isItPrime(324635459)<\/code>. Het programma doet er veel te lang over. Wanneer je nog een paar waarden probeert die groter dan 10000000 zijn om na te gaan of die priem zijn, dan zie je dat het programma altijd te weinig tijd heeft, omdat de grader de deelbaarheids-test loop maar 10 miljoen keer per seconde kan uitvoeren. Wanneer we grotere getallen willen testen hebben we een effici\u00ebntere methode nodig. Laten we er voor zorgen dat het programma werkt voor getallen ter grootte van een triljoen (1000000000000)!<\/p>\n<p>Moeten we echt <strong>alle<\/strong> getallen testen tussen <code>2<\/code>\u00a0en\u00a0<code>N-1<\/code>, om na te gaan of <code>N<\/code>\u00a0priem is? <a class=\"hintlink\"  id=\"hintlink3\">Hint<\/a><\/p>\n<h2>Het idee, en een redenering<\/h2>\n<p>Wanneer je de hint hebt gelezen en hebt ge\u00ebxperimenteerd, dan zou je hebben kunnen opmerken dat wanneer <code>N<\/code> niet priem is, het programma meestal een betrekkelijk kleine deler vond in vergelijking tot\u00a0<code>N<\/code>. Bijvoorbeeld <code>isItPrime(34827948723948723984729834)<\/code>\u00a0wordt tamelijk snel uitgevoerd ondanks dat de input enorm groot is, omdat meteen de deler\u00a0<code>D=2<\/code> gevonden wordt.<\/p>\n<p>Misschien is het helemaal niet nodig om alle mogelijke delers te vinden. Is er een grens aan het aantal delers dat we moeten testen, voordat we er zeker van kunnen zeggen dat\u00a0<code>N<\/code>\u00a0priem is? Gelukkig wel! We kunnen beargumenteren dat\u00a0<em>als\u00a0<\/em><code>N<\/code><em>\u00a0niet priem is, een van zijn delers ten hoogste\u00a0<\/em><code>sqrt(N)\u00a0<\/code><em>is.<\/em> Waarom? Als\u00a0<code>N<\/code>\u00a0niet priem is, dan is er een deler\u00a0<code>A<\/code>. Omdat\u00a0<code>A<\/code>\u00a0een deler is, betekent dit dat er een ander getal\u00a0<code>B<\/code>\u00a0is zodat<\/p>\n<p><code>A*B == N<\/code><\/p>\n<p>Laten we de argumentatie voortzetten. Als\u00a0<code>A &lt;= sqrt(N)<\/code> of <code>B &lt;= sqrt(N)<\/code>, zijn we gelukkig: we hebben dan een deler van\u00a0<code>N<\/code> die klein genoeg is zoals we wilden. Maar ze vormen ook de enige mogelijkheid: anders krijgen we een tegenspraak<\/p>\n<p><code>N = A*B &gt; sqrt(N)*sqrt(N) &gt; N<\/code><\/p>\n<p>Mooi! Laten we dan nu dit nieuwe idee in Python implementeren. De gemakkelijkste \u00a0weg is om de oude benadering aan te passen is om een test toe te voegen in de\u00a0<code>for<\/code> loop: als \u00a0<code>D &gt; sqrt(N)<\/code> (of gelijk daaraan, <code>D*D &gt; N<\/code>), kunnen we\u00a0uit de loop stappen en stoppen met testen.<\/p>\n<p><form class=\"pbform\" action=\"#\" id=\"pbform4\" method=\"POST\">\n<div class='pybox modeNeutral  facultative' id='pybox4'>\n<div class=\"heading\"><span class=\"title\">Example<\/span><\/div>Snellere priem test<div class='pyboxTextwrap pyboxCodewrap RO '  style='height: 292px;'><textarea wrap='off' name='usercode4' id='usercode4'  cols=10 rows=11 readonly='readonly'  style = 'height : 292px;'  class='pyboxCode RO'>\ndef isItPrime(N): # same as before\n  for D in range(2, N):\n    if (D * D > N):          # first added line\n      break                  # second added line\n    if N % D == 0:\n      print(N, \"is not prime; divisible by\", D)\n      return\n  print(N, \"is prime\")\n\nisItPrime(1000006000009)\nisItPrime(1666666009999)<\/textarea><\/div>\n<div id='pbhistory4' class='flexcontain' style='display:none;'><\/div>\n<div class='pyboxbuttons'><table><tr>\n<td><input type='submit' name='submit' id='submit4' value=' '\/><\/td>\n<td><input type='button' name='consolecopy' value=\"Open in console\" onclick=\"pbConsoleCopy(4)\" ><\/td>\n<td><input type='button' name='visualize' value=\"Visualize\" onclick=\"pbVisualize(4,'N')\" ><\/td>\n<\/tr><\/table><\/div>\n<input type=\"hidden\" name=\"lang\" value=\"\"\/><input type=\"hidden\" id=\"inputInUse4\" name=\"inputInUse\" value=\"Y\"\/>\n<input type=\"hidden\" name=\"pyId\" value=\"4\"\/>\n<input type=\"hidden\" name=\"hash\" value=\"87782243ae066971c8870ad20d35c7d1\"\/>\n<div id='pbresults4' class='pbresults'><\/div>\n<\/div>\n<\/form>\n<script type='text\/javascript'>document.getElementById(\"submit4\").value = \"Run program\";document.getElementById(\"inputInUse4\").value = \"N\";<\/script>\n<\/p>\n<p>Het programma werkt voor op gigantische priemgetallen!<\/p>\n<h2>Slotoefening<\/h2>\n<p>In deze oefening combineren we de priemgetallen uit de tweede helft met de lijst-gebaseerde aanpak uit de eerste helft. Je programma moet een tabel vullen van lengte 1000001 zodanig dat\u00a0<code>isPrime[N]<\/code>\u00a0gelijk wordt aan\u00a0<code>True\u00a0<\/code>als\u00a0<code>N<\/code>\u00a0priem is, en <code>False<\/code>\u00a0als\u00a0<code>N<\/code>\u00a0dat niet is, voor alle\u00a0<code>N<\/code> tot een miljoen.\u00a0(<code>isPrime[0]<\/code> en\u00a0<code>isPrime[1]<\/code> moeten natuurlijk\u00a0<code>False\u00a0<\/code>aangeven.)<\/p>\n<p><a class=\"hintlink\"  id=\"hintlink5\">Klik hier voor een hint. Het is een uitgebreide!<\/a><\/p>\n<p><form class=\"pbform\" action=\"#\" id=\"pbform6\" method=\"POST\">\n<div class='pybox modeNeutral ' id='pybox6'>\n<img title='You have not yet completed this problem.' src='https:\/\/cscircles.cemc.uwaterloo.ca\/dev\/wp-content\/plugins\/pybox\/files\/icon.png' class='pycheck'\/><div class=\"heading\"><span class='type'>Coding Exercise: <\/span><span class='title'>Priem klaar voor takeoff<\/span><\/div>Schrijf een programma dat een tabel definieert in\u00a0<code>isPrime<\/code>\u00a0zoals we boven beschreven (merk op dat <code>isPrime<\/code> een lijst is, niet een functie). <a class=\"hintlink\"  id=\"hintlink7\">Hint<\/a><br\/> <em>De grader zal een langer dan gebruikelijke tijdlimiet toestaan om je programma uit te voeren, namelijk\u00a0<strong>7 seconden<\/strong>. Toch zal gewoon de functie\u00a0<\/em><code>isItPrime<\/code><em> uitvoeren niet snel genoeg werken.<\/em><div class=\"helpOuter\" style=\"display: none;\"><div class=\"helpInner\"><div style=\"text-align: center\">You need to create an account and log in to ask a question.<\/div><\/div><\/div><div class='pyboxTextwrap pyboxCodewrap RW resizy'  style='height: 526px;'><textarea wrap='off' name='usercode6' id='usercode6'  cols=10 rows=20   class='pyboxCode RW'>\n# delete this comment and enter your code here\n<\/textarea><\/div>\n<div id='pbhistory6' class='flexcontain' style='display:none;'><\/div>\n<div name=\"pyinput\" id=\"pyinput6\">Enter testing statements like <code>print(myfunction(\"test argument\"))<\/code> below.<div class=\"pyboxTextwrap resizy\" style=\"height: 102px;\" ><textarea wrap=\"off\" name=\"userinput\" class=\"pyboxInput\" cols=10 rows=4><\/textarea><\/div><\/div>\n<div class='pyboxbuttons'><table><tr>\n<td><input type='submit' name='submit' id='submit6' value=' '\/><\/td>\n<td><input type='button' name='switch' id=\"switch6\" value=\"Input Switch\" onclick=\"pbInputSwitch(6,'Y')\" ><\/td>\n<td><input type='button' name='consolecopy' value=\"Open in console\" onclick=\"pbConsoleCopy(6)\" ><\/td>\n<td><input type='button' name='visualize' value=\"Visualize\" onclick=\"pbVisualize(6,'Y')\" ><\/td>\n<\/tr><\/table><select id='pbSelect6' class='selectmore'><option name='more'>More actions...<\/option>\n<option name='history' data-pbonclick=\"historyClick(6,'18.sieve')\" >History<\/option>\n<option name='help' data-pbonclick=\"helpClick(6);\" >Help<\/option>\n<\/select><\/div>\n<input type='hidden' name='timeout' value='20000'\/>\n<input type=\"hidden\" name=\"lang\" value=\"\"\/><input type=\"hidden\" id=\"inputInUse6\" name=\"inputInUse\" value=\"Y\"\/>\n<input type=\"hidden\" name=\"pyId\" value=\"6\"\/>\n<input type=\"hidden\" name=\"hash\" value=\"9071240208007187c0a17e3e9492558d\"\/>\n<div id='pbresults6' class='pbresults avoidline'><\/div>\n<\/div>\n<\/form>\n<script type='text\/javascript'>jQuery(function(){pbToggleCodeMirror(6);});pbInputSwitch(6,\"Y\");<\/script>\n<\/p>\n<p><table class='pywarn'><tr><td class='pywarnleft'><img src='https:\/\/cscircles.cemc.uwaterloo.ca\/dev\/wp-content\/plugins\/pybox\/files\/warning.png'\/><\/td><td class='pywarnright'><span> Dit is de laatste oefening van de CS Circles website. Als je alle lessen hebt doorlopen: gefeliciteerd! Kijk naar de <a href=\"\/resources\/\">\u00a0bronnenpagina's<\/a>\u00a0voor suggesties voor vervolgstappen.\u00a0Veel plezier, veel succes, en programmeer ze! <\/span><\/td><\/table><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Veel programmeertaken kunnen op meer dan \u00e9\u00e9n manier worden uitgevoerd, maar de ene manier kan veel sneller zijn dan een andere. Snelle programma's ontwerpen is een deel van de kunst en wetenschap van het programmeren van een computer. In deze &hellip; <a href=\"https:\/\/cscircles.cemc.uwaterloo.ca\/dev\/18-efficiency-nl\/\">Continue reading <span class=\"meta-nav\">&rarr;<\/span><\/a><\/p>\n","protected":false},"author":1,"featured_media":0,"parent":0,"menu_order":0,"comment_status":"closed","ping_status":"closed","template":"","meta":{"footnotes":""},"class_list":["post-6183","page","type-page","status-publish","hentry"],"_links":{"self":[{"href":"https:\/\/cscircles.cemc.uwaterloo.ca\/dev\/wp-json\/wp\/v2\/pages\/6183","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/cscircles.cemc.uwaterloo.ca\/dev\/wp-json\/wp\/v2\/pages"}],"about":[{"href":"https:\/\/cscircles.cemc.uwaterloo.ca\/dev\/wp-json\/wp\/v2\/types\/page"}],"author":[{"embeddable":true,"href":"https:\/\/cscircles.cemc.uwaterloo.ca\/dev\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/cscircles.cemc.uwaterloo.ca\/dev\/wp-json\/wp\/v2\/comments?post=6183"}],"version-history":[{"count":21,"href":"https:\/\/cscircles.cemc.uwaterloo.ca\/dev\/wp-json\/wp\/v2\/pages\/6183\/revisions"}],"predecessor-version":[{"id":9102,"href":"https:\/\/cscircles.cemc.uwaterloo.ca\/dev\/wp-json\/wp\/v2\/pages\/6183\/revisions\/9102"}],"wp:attachment":[{"href":"https:\/\/cscircles.cemc.uwaterloo.ca\/dev\/wp-json\/wp\/v2\/media?parent=6183"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}