Algoritme

Een algoritme is een recept om een wiskundig of informaticaprobleem op te lossen. Wiskundig geformuleerd is het een eindige reeks instructies die vanuit een gegeven begintoestand naar een beoogd doel leidt.

Algoritme om een willekeurig veelvlak in driehoeken op te delen (in het algemeen heeft dit probleem meerdere oplossingen, de bereikte oplossing hangt dus af van het gebruikte algoritme)
Principes
Computationele complexiteitstheorie
Modellen
Algoritme
Turingmachine
Lambdacalculus
Theorieën
Berekenbaarheid
Complexiteitsgraad
NP-volledig

De term algoritme is afkomstig van het Perzische woord Gaarazmi: خوارزمي, naar de naam van de Perzische wiskundige Al-Chwarizmi (محمد بن موسى الخوارزمي).

Algoritmen staan in beginsel los van computerprogramma's, al worden voor de uitvoering van algoritmen vaak computers gebruikt.

Het doel van een algoritme is een probleem oplossen, met een duidelijk resultaat. De instructies kunnen in het algemeen omgaan met eventualiteiten (fouten, datakwaliteitsproblemen, inconsistenties, randeffecten) die bij het uitvoeren kunnen optreden. Algoritmen hebben in het algemeen stappen (sequentie) die zich kunnen herhalen (iteratie) of die beslissingen (logica of vergelijkingen) vereisen om de taak te voltooien.

Eenzelfde taak kan gewoonlijk op verschillende manieren worden opgelost. Het verschil ligt dan meestal in de hoeveelheid tijd, ruimte of inspanning die het algoritme vergt; dit kan een indicatie zijn voor de complexiteit of de efficiëntie van het algoritme.

Vergelijk een algoritme met een recept in de keuken. Om aardappelsalade te maken kan het ene recept de instructie "schil de aardappel" bevatten en daarna de instructie "kook de aardappel". Bij een ander recept kunnen die twee stappen omgedraaid zijn. Beide recepten zullen echter vragen deze stappen voor alle aardappelen uit te voeren en het eindresultaat is een lekkere aardappelsalade.

Bij het correct uitvoeren van een computerprogramma is het belangrijk dat het algoritme inderdaad de beoogde functie uitvoert en dat het algoritme goed door het computerprogramma wordt uitgevoerd. Eventuele fouten of problemen moeten hierbij worden gerapporteerd.

Formele algoritmenBewerken

Algoritmen in formele systemen zijn essentieel voor bijvoorbeeld de manier waarop computers informatie verwerken, omdat een computerprogramma een formeel algoritme is dat de computer vertelt welke specifieke stappen in een specifieke volgorde uitgevoerd moeten worden om een bepaald eindresultaat te bereiken. Een groter probleem wordt opgesplitst in meerdere deelproblemen.

In het algemeen wordt bij algoritmen informatie verwerkt; de informatie (data) wordt gelezen van een invoerapparaat en weggeschreven naar een uitvoerapparaat; de informatie kan ook bewaard worden voor later. Opgeslagen data worden bij het analyseren van algoritmen gezien als de "interne toestand" van het apparaat dat het algoritme uitvoert.

Voor elk rekenkundig proces moet een algoritme nauwkeurig gedefinieerd worden: het specificeert namelijk hoe het apparaat zal reageren op elke mogelijke invoer en interne toestand. Omdat een algoritme een exacte lijst is met exacte stappen, is de volgorde waarin de berekening gebeurt kritisch voor het correct functioneren van het algoritme. Uniek aan het concept van formele algoritmen is de toewijzing van een waarde aan een variabele. Dit komt voort uit de notie van het geheugen als werkruimte.

Algoritme versus computerprogrammaBewerken

Waar een algoritme de beschrijving is van een oplossing van een probleem, is een computerprogramma (in een of andere programmeertaal) de implementatie van dat algoritme. Een algoritme voor een berekening met reële getallen kan bijvoorbeeld uitgaan van exacte berekeningen, terwijl de implementatie bepaalt hoe groot de afrondfouten kunnen zijn. De nauwkeurigheid van het eindresultaat kan (bij gelijkwaardige wijze van afronden van tussenresultaten) wel van het algoritme afhangen, dus bij het ontwerp van het algoritme moet er vaak al rekening mee worden gehouden dat er in de implementatie niet exact gerekend wordt. Dit geldt overigens niet alleen bij computergebruik, maar ook bij een handberekening met tussentijdse afrondingen.

Grotere systemen en algoritmen worden opgesplitst in deelsystemen, modules, functies en statements, waarbij het ontwerp top-down of bottom-up wordt verwezenlijkt. In principe is het algoritme onafhankelijk van de fysieke implementatie op een bepaald computersysteem. Toch kan er in het ontwerp rekening (moeten) worden gehouden met een bepaalde architectuur. In dat geval worden de specifieke functies in een afzonderlijke module ondergebracht. Als het systeem moet worden vervangen blijven de wijzigingen beperkt tot een enkele module.

De verschillende manieren om tegen een probleem aan te kijken en het te beschrijven hebben in de loop van de jaren ook verschillende vormen van programmeren opgeleverd: imperatief programmeren, objectgeoriënteerd programmeren, aspectgeoriënteerd programmeren, logisch programmeren, symbolisch programmeren, functioneel programmeren.

In imperatief programmeren worden instructies expliciet opgeschreven, waarbij de berekening bovenaan begint en vervolgens stap voor stap naar beneden verloopt. Dit heet de control flow van een algoritme.

Een andere manier om tegen algoritmen aan te kijken is functioneel programmeren. In programma's van dit type worden algoritmen gezien als wiskundige functies die elkaar kunnen aanroepen. Diezelfde functies kunnen ook aan variabelen worden toegewezen en zelfs als parameter in een functieaanroep gebruikt worden.

VoorbeeldBewerken

Een voorbeeld van een algoritme is het algoritme van Euclides, dat de grootste gemene deler van twee strikt positieve getallen in de variabelen a en b geeft. De informele beschrijving van dit algoritme is als volgt:

  • Zolang a en b niet gelijk zijn:
    • Trek van het grootste van de twee het andere af.
  • Zodra ze gelijk zijn, is de grootste gemene deler a (of b).

In pseudocode:

function ggd(a,b)
  if a = b
    return a
  else if a < b
    return ggd(a, b-a)
  else
    return ggd(a-b, b)
end

Dit algoritme is recursief.

GeschiedenisBewerken

 
Blad uit een Latijnse vertaling (Cambridge manuscript), beginnend met "Dixit algorizmi"

Het woord algoritme is een verbastering van het Oudengelse woord algorism, dat van het Latijnse woord algorismus komt, dat weer voortkomt uit de naam van de Perzische wiskundige Al-Chwarizmi (ca. 780 - ca. 845). Hij was de auteur van het boek al-Kitab al-mukhtasar fi hisab al-jabr w'al-muqabala (Boek van de beknopte rekenkundige algebra en handelsbalans) dat de algebra in de Westerse wereld introduceerde. Het woord algebra zelf komt van al-Jabr uit de titel van het boek. Het woord algorisme verwees oorspronkelijk alleen naar de regels voor het rekenen met Arabische cijfers, maar was in de 18e eeuw naar algoritme geëvolueerd. Het woord algoritme wordt nu gebruikt voor alle eindige procedures om problemen op te lossen of taken uit te voeren.

Het eerste voor een computer geschreven algoritme is te vinden in de notities van Ada Byron over de analytische machine, geschreven in 1842. Daarom wordt zij wel als 's werelds eerste computerprogrammeur beschouwd.

Het ontbreken van wiskundige strengheid in de definitie van een "goed gedefinieerde procedure" voor een algoritme vormde een probleem voor de wiskundigen en logici van de 19e en begin 20e eeuw. Dit probleem werd grotendeels opgelost met de beschrijving van de turingmachine, een abstract model van een computer, door Alan Turing, en de demonstratie dat elke tot dan toe gevonden methode om "goed gedefinieerde procedures" te beschrijven op een turingmachine uitgevoerd kon worden (een uitspraak die wel bekend is als de stelling van Church-Turing).

Tegenwoordig is het formele criterium voor een algoritme dat het een procedure is die geïmplementeerd kan worden op een volledig gespecificeerde turingmachine, of een van de equivalente formalisaties. Turings eerste interesse lag bij de berekenbaarheidstheorie: welke functies en problemen kunnen met een algoritme opgelost worden. In de praktijk is ook de complexiteitstheorie van belang, waarbij het niet gaat om de vraag welke functies berekenbaar zijn, maar om de vraag of het kan worden opgelost, en hoe efficiënt de oplossing dan is.

LijstBewerken

Gerelateerde onderwerpenBewerken

  Zie de categorie Algorithms van Wikimedia Commons voor mediabestanden over dit onderwerp.