Samenvatting · Informatica · vwo 5 Complexiteit van algoritmen: orde van grootte en efficiëntie
Bewaar deze samenvatting
Twee algoritmen kunnen hetzelfde probleem oplossen en toch enorm verschillen in snelheid. Bij een lijst van tien elementen merk je dat niet, bij een miljard wel. Na deze samenvatting bepaal je de orde van grootte van een algoritme en beoordeel je of het ook voor grote invoer bruikbaar blijft.
Waarom complexiteit?
Je meet de snelheid van een algoritme niet in seconden, want die hangen af van de computer en de programmeertaal. In plaats daarvan tel je hoe het aantal basisstappen (vergelijkingen, optellingen, toewijzingen) groeit met de grootte van de invoer . Je kijkt naar het slechtste geval (worst case), omdat dat een garantie geeft.
Orde van grootte
Je geeft de groei aan met de grote-O-notatie: alleen de snelst groeiende term telt, constante factoren laat je weg. Een algoritme met stappen is .
| orde | naam | voorbeeld |
|---|---|---|
| constant | het eerste element van een lijst lezen | |
| logaritmisch | binair zoeken | |
| lineair | lineair zoeken, alle elementen optellen | |
| lineair-logaritmisch | snelle sorteeralgoritmen (mergesort) | |
| kwadratisch | bubble sort, selection sort | |
| exponentieel | alle deelverzamelingen proberen | |
| faculteit | alle volgordes proberen |
Het aantal stappen bepalen
Kijk naar de lussen:
- Een enkele lus die keer draait: .
- Twee geneste lussen die allebei keer draaien: , dus .
- Een lus die telkens halveert (n = n // 2 tot n = 1): rondes, dus .
- Twee lussen na elkaar: de stappen tellen op en alleen de grootste telt, dus .
Wat betekent een orde in de praktijk?
Wat gebeurt er met de rekentijd als twee keer zo groot wordt?
- : twee keer zo lang.
- : vier keer zo lang.
- : maar één stap erbij.
- : één extra element verdubbelt al de tijd.
Efficiënt en onhandelbaar
Algoritmen met een orde (een macht van ) heten polynomiaal en zijn in de praktijk meestal bruikbaar. Algoritmen met een exponentiële of faculteitsorde groeien zo snel dat ze al bij matige onhaalbaar zijn.
Voorbeeld: het handelsreizigersprobleem. Een reiziger moet steden bezoeken en de kortste route zoeken. Alle routes proberen (brute force) kost een aantal stappen dat groeit als : bij 10 steden zijn dat al 3,6 miljoen volgordes en bij 20 steden meer dan . Voor zulke problemen is geen snel algoritme bekend dat altijd de beste oplossing vindt. In de praktijk gebruikt men heuristieken: slimme methoden die snel een goede, maar niet altijd de beste oplossing geven.
Ruimtecomplexiteit
Naast tijd telt ook geheugen. Een algoritme dat een kopie van de invoer maakt, heeft extra geheugen nodig; een algoritme dat alleen een paar variabelen gebruikt, . Tijd en geheugen ruilen vaak: een tabel met tussenresultaten maakt een algoritme sneller maar kost geheugen.
Let op
- Alleen de snelst groeiende term telt. is .
- Constanten tellen niet mee in O, maar wel in de praktijk bij kleine .
- Slechtste, beste en gemiddelde geval kunnen verschillen. Lineair zoeken kan in het beste geval al bij het eerste element klaar zijn.
- ** zegt hoe snel de tijd groeit,** niet hoe lang het precies duurt.
In het kort
- Je telt basisstappen als functie van de invoergrootte , meestal in het slechtste geval.
- Grote-O: alleen de snelst groeiende term telt, constanten vallen weg.
- Een enkele lus is , twee geneste lussen , een halverende lus .
- Bij betekent een dubbele invoer ongeveer vier keer zoveel tijd.
- Exponentiële en faculteitsgroei zijn onhandelbaar; dan gebruikt men heuristieken.
Staat hier iets dat niet klopt of niet hoort? .