Wat een algoritme is
De methode om de grootste gemeenschappelijke deler te vinden uit Boek VII van de Elementen van Euclides, ongeveer 2300 jaar geleden geschreven, werkt nog steeds in computers.
Een methode die altijd werkt
Stel dat je het grootste getal nodig hebt dat zowel 1071 als 462 deelt. Je kunt elk getal van 462 terug tot 1 proberen en stoppen bij het eerste dat beide deelt. Dat werkt, maar kan honderden pogingen kosten. Er is een kortere weg. Deel 1071 door 462 en bewaar de rest, 147. Deel nu 462 door 147 en bewaar de rest, 21. Deel 147 door 21: de rest is 0, dus het antwoord is 21. Drie delingen in plaats van enkele honderden.
Die kortere weg is een algoritme: een eindige lijst nauwkeurige stappen die invoer krijgt en de juiste uitvoer oplevert. Dit is het algoritme van Euclides voor de grootste gemeenschappelijke deler, uit Boek VII van de Elementen, geschreven rond 300 v.Chr. Euclides beschreef het met herhaald aftrekken van lengten in plaats van delen, maar het idee is hetzelfde. Programma's gebruiken tegenwoordig de versie met resten.
function gcd(a, b) {
while (b !== 0) {
const r = a % b; // remainder
a = b;
b = r;
}
return a;
}
console.log(gcd(1071, 462)); // 21Wat een lijst stappen tot algoritme maakt
Leerboeken zoals dat van Cormen, Leiserson, Rivest en Stein beschrijven een algoritme als een goed gedefinieerde procedure die invoer omzet in uitvoer. In die beschrijving zitten drie dingen, die elk van belang zijn wanneer je code schrijft.
- Nauwkeurig. Elke stap betekent één ding. ‘Deel a door b en bewaar de rest’ is nauwkeurig; ‘maak de getallen op de een of andere manier kleiner’ niet.
- Eindig. Het moet stoppen. In het algoritme van Euclides is de rest altijd kleiner dan het getal waardoor je deelde, dus hij krimpt elke ronde en moet 0 bereiken.
- Correct. Voor elke toegestane invoer is de uitvoer het juiste antwoord, niet alleen voor de voorbeelden die je probeerde.
Een recept wordt vaak als alledaags voorbeeld gegeven en dat is terecht: ingrediënten zijn de invoer, het gerecht is de uitvoer en de stappen staan op volgorde. Het verschil is hoeveel de lezer zelf invult. Een kok beslist wat ‘een snufje’ betekent. Een computer beslist niets, en daarom worden algoritmen voor computers met elke stap uitgeschreven.
Hetzelfde probleem, verschillende algoritmen
Voor één probleem bestaan meestal veel correcte algoritmen, die enorm kunnen verschillen in de hoeveelheid werk. Voor de grootste gemeenschappelijke deler van 1071 en 462 kost elk getal vanaf 462 omlaag proberen 442 pogingen tot je 21 bereikt, terwijl de methode van Euclides 3 delingen nodig heeft. Beide zijn correct. Slechts één is snel. In een groot deel van deze cursus bekijk je die tweede vraag: als een methode correct is, hoeveel stappen kost zij en hoe groeit dat aantal als de invoer groter wordt?
Om dat te beantwoorden tellen informatici basisstappen (een vergelijking, een verwisseling, een deling) in plaats van seconden. Seconden hangen af van de machine. Het aantal stappen hangt alleen af van het algoritme en de invoer, zodat je twee methoden eerlijk kunt vergelijken. In het lab hieronder tel je vergelijkingen terwijl je een rij balken sorteert. Probeer dezelfde beginvolgorde met twee verschillende methoden en bekijk de tellers.
Sleep om te draaien. Scroll of knijp om te zoomen.
Invoer, uitvoer en de stappen ertussen
Schrijf vóór het algoritme precies op wat erin gaat en wat eruit moet komen. Voor de grootste gemeenschappelijke deler: de invoer is twee positieve gehele getallen en de uitvoer één geheel getal dat beide deelt, zonder dat een groter getal dat ook doet. Die beschrijving vertelt hoe je het resultaat test en geeft vaak aanwijzingen voor de stappen. Ze onthult ook randgevallen: wat als één getal 0 is? (De lus hierboven geeft het andere getal terug, het juiste antwoord.) Wat als beide getallen gelijk zijn? Door vóór de uitvoering over randgevallen na te denken vind je veel fouten.
- Rond 300 v.Chr.: Elementen van Euclides, Boek VII: de methode voor de grootste gemeenschappelijke deler.
- 9e eeuw: Al-Khwarizmi schrijft in Bagdad over Indiase cijfers; zijn Latijnse naam levert het woord algoritme op.
- 1843: Note G van Ada Lovelace: stappen voor de Analytical Engine om Bernoulli-getallen te berekenen.
- 1945: John von Neumann stelt mergesort voor.
- 1959: Tony Hoare bedenkt quicksort in Moskou (gepubliceerd in 1961).
| algoritme | Een eindige lijst nauwkeurige stappen die invoer omzet in de juiste uitvoer |
| invoer | De gegevens waarmee een algoritme begint |
| uitvoer | Het resultaat dat het algoritme moet opleveren |
| correct | Geeft de juiste uitvoer voor elke toegestane invoer |
| eindig | Stopt altijd na een bepaald aantal stappen |
| grootste gemeenschappelijke deler | Het grootste gehele getal dat twee getallen exact deelt |
| randgeval | Een ongebruikelijke invoer zoals 0, een lege lijst of gelijke waarden |
| aantal stappen | Hoeveel basisbewerkingen een algoritme uitvoert |
- Wat is met het algoritme van Euclides de grootste gemeenschappelijke deler van 48 en 18?
- Hoeveel delingen heeft het algoritme van Euclides nodig voor 1071 en 462?
- Welke hiervan is geen vereiste eigenschap van elk algoritme?
- Het stopt na een eindig aantal stappen
- Elke stap is nauwkeurig
- Het gebruikt een computer
- Het geeft de juiste uitvoer voor elke toegestane invoer
- Waarom stopt het algoritme van Euclides altijd?
- De rest is altijd kleiner dan de deler, dus hij krimpt tot 0
- Het stopt na 10 rondes
- Computers stoppen lussen automatisch
- De getallen groeien totdat ze gelijk zijn
- Het woord algoritme komt van de naam van
- Euclides
- Al-Khwarizmi
- Ada Lovelace
- Alan Turing
- Waarom tellen informatici stappen in plaats van seconden te meten?
- Seconden hangen af van de machine; aantallen stappen alleen van het algoritme en de invoer
- Klokken zijn onnauwkeurig
- Stappen zijn altijd sneller
- Seconden kun je niet in code meten
- Een methode geeft het juiste antwoord voor de vijf voorbeelden die je probeerde. Is zij correct?
- Ja, vijf voorbeelden bewijzen het
- Niet noodzakelijk: zij moet voor elke toegestane invoer kloppen
- Alleen als zij snel is
- Alleen als zij een lus gebruikt
- Wat geeft gcd(35, 0) terug met de lus uit dit hoofdstuk?
- In welk jaar publiceerde Ada Lovelace haar notities, waaronder Note G?
- 1801
- 1843
- 1945
- 1961
- Zet de stappen van het algoritme van Euclides op volgorde.
- Een algoritme is een eindige lijst nauwkeurige stappen van invoer naar correcte uitvoer.
- Het algoritme van Euclides vindt een grootste gemeenschappelijke deler met herhaalde resten.
- Eén probleem kan veel correcte algoritmen met heel verschillende aantallen stappen hebben.
- Schrijf vóór de stappen de invoer, uitvoer en randgevallen op.
- Het woord komt van de Latijnse naam van al-Khwarizmi.
Bronnen van deze cursus (11)
- MIT OpenCourseWare 6.006 Introduction to Algorithms, Spring 2020 (Demaine, Ku, Solomon)
- lecture notes 1 Introduction, 3 Sorting, 9 Breadth-First Search, 10 Depth-First Search (ocw.mit.edu/courses/6-006-introduction-to-algorithms-spring-2020/pages/lecture-notes) and Fall 2011 lecture 13 BFS notes (ocw.mit.edu/courses/6-006-introduction-to-algorithms-fall-2011)
- Cormen, Leiserson, Rivest, Stein, Introduction to Algorithms (MIT Press)
- with the CLRS-based Khan Academy algorithms unit by Thomas Cormen and Devin Balkcom of Dartmouth (khanacademy.org/computing/computer-science/algorithms: binary search, selection sort analysis, merge sort, quicksort overview and analysis)
- MacTutor History of Mathematics, Al-Khwarizmi (mathshistory.st-andrews.ac.uk/Biographies/Al-Khwarizmi: word algorithm from the Latin title Algoritmi de numero Indorum)
- D. E. Joyce, Euclid's Elements Book VII Propositions 1 and 2 (mathcs.clarku.edu/~djoyce/elements/bookVII)
- Wolfram MathWorld, Merge Sort (mathworld.wolfram.com/MergeSort.html: proposed by John von Neumann in 1945, after Knuth 1998 p. 159)
- Stanford CS "Tony Hoare: Quicksort" (cs.stanford.edu/people/eroberts/courses/soco/projects/2008-09/tony-hoare/quicksort.html: devised while a student at Moscow State University for Russian-English machine translation with a tape dictionary, programmed in Algol 60 and published 1961; the year 1959 from the Wikipedia Quicksort article and its cited sources)
- Bodleian Libraries, Ada Lovelace (blogs.bodleian.ox.ac.uk/adalovelace: 1843 paper, Note G Bernoulli numbers)
- Fourmilab text of Menabrea's Sketch with Lovelace's notes (fourmilab.ch/babbage/sketch.html)
- Seven Bridges of Konigsberg (Euler 1736) and Tower of Hanoi (Edouard Lucas, 1883) checked against the Wikipedia articles and their cited sources.
Geraadpleegd: 2026-10-17