Algoritmes classificeren
Op deze pagina, ga je leren dat sommige correcte algoritmes te langzaam zijn om goed
kunnen gebruiken.
- Als hij nog niet open staat, open dan het project H5L3-timer van de vorige pagina. Je gaat
experimenteren met
time function
met de volgende invoerfuncties:
Wat gebeurt er voor elke invoer met de looptijd als je de grootte van de invoer verdubbelt?
Wat betekent het om de grootte van de invoer voor
getallen van () tot ()
te verdubbelen?
Je kan algoritmen classificeren op basis van de tijd die ze nodig hebben om te worden uitgevoerd.
Om een algoritme te classificeren, kijk je naar het aantal stappen dat nodig is om het algoritme te
voltooien, vergeleken met de grootte van de invoer.
- Redelijke tijd: als het aantal stappen kleiner is dan of gelijk aan een macht
van de grootte van de invoer, wordt het algoritme uitgevoerd in polynomiale tijd .
Polynomiale tijd omvat constante ( n 0 ), sublinear, lineair
( n 1 ), kwadratische ( n 2 ), kubieke ( n
3 ), enz. functies:
algoritme-efficiëntie |
Als je de grootte van de invoer
verdubbeld,, dan...
|
voorbeeld-algoritme |
constant |
blijft de tijd hetzelfde (vermenigvuldigt met 20 wat gelijk is aan 1)
|
|
sublineair |
vermenigvuldigt de tijd met een getal tussen de 1 en 2 (tussen 20 en
21) |
binaire zoekopdracht: positie van () in een gesorteerde lijst |
lineair |
vermenigvuldigt de tijd met 2 (wat 21 is) |
lineair zoekopdracht: positie van () in een ongesorteerde lijst |
kwadratisch |
vermenigvuldigt de tijd met 4 (wat 22 is) |
sommige zoekalgoritmes |
kubiek |
vermenigvuldigt de tijd met 8 (wat 23 is) |
sommige algoritmes om genen in kaart te brengen |
Het is zeldzaam om polynomiale algoritmes te vinden die meer dan kubieke ( n 3
) tijd kosten.
Wat als een algoritme een hoeveelheid tijd kost die tussen twee categorieën
valt?
Deze categorieën zeggen dat een algoritme hoogstens zoveel tijd kost. Dus een
algoritme voor constante tijd is dus ook een algoritme voor lineaire tijd, en ook een
algoritme voor polynomiale tijd. Maar meestal als iemand zegt dat een algoritme
"kwadratische tijd kost", bedoelen ze dat het meer dan lineaire tijd maar
niet meer dan kwadratische tijd kost.
- Onredelijke tijd: als het aantal stappen groter is dan welke macht dan ook van
de grootte van de invoer (dat wil zeggen, meer dan een polynomiale functie), dan werkt het algoritme
in een onredelijke tijdshoeveelheid.
Het klassieke voorbeeld van een algoritme
met onredelijke tijd is er een die exponentiële (2 n
) tijd gebruikt. 1 toevoegen aan de invoergrootte ( n
) verdubbelt het aantal stappen! Dus zo'n algoritme zal twee keer zo lang doen
over het oplossen een probleem met als invoer 5 elementen, dan met een invoer van 4 elementen.
Een soort probleem waarvan de oplossing vaak onredelijk is, is een
optimalisatieprobleem (zoals "vind de beste" of "vind de kleinste").
Het is belangrijk om te begrijpen dat een onredelijketijd-algoritme een probleem nog steeds correct
oplost . Onredelijketijd-algoritmes kunnen soms worden vervangen door een heuristiek
, dat is een polynomialetijd-algoritme dat het probleem niet precies oplost, maar een goede benadering
biedt.
Een reden waarom het de moeite waard is om deze categorieën te leren, is dat je bij het schrijven van
programma's vaak een probleem moet oplossen waarvoor al oplossingen zijn bedacht. Je hebt bijvoorbeeld
geleerd dat het zoeken naar iets in een ongeordende lijst lineaire tijd vergt, maar als de lijst
gesorteerd is, kun je deze sneller doorzoeken (in sublineaire tijd). Dus als je een programma schrijft dat
herhaaldelijk in een lijst moet zoeken, weet je dat het de moeite waard is om de lijst te sorteren voordat
je gaat zoeken. Als je weet welke standaardalgoritmen er al zijn, kan dat helpen met het bedenken van nieuwe
algoritmes.
- Bekijk enkele algoritmen die je hebt gebouwd. Bepaal of deze algoritmes in constante tijd,
sublinear, lineaire, kwadratische of onredelijke tijd loopt.
- Voor de manier waarop Alex gehele getallen toevoegt, maak je een grafiek met het aantal gehele
getallen op de horizontale as en de looptijd op de verticale as. Genereer gegevens voor het diagram
door
time function
uit te voeren met grote invoeren voor Alex' manier
(bijvoorbeeld veelvouden van 100). Gebruik vervolgens de technieken van Les 2 om het diagram te
maken.
- Welke informatie vertelt dit diagram je over het algoritme van Alex? Kost het constante tijd,
lineaire tijd, andere polynomiale tijd of is het onredelijke tijd?
-
De onderstaande tabel toont de computertijd die nodig is om verschillende
taken op de gegevens van steden van verschillende grootte uit te voeren.
Taak |
Klein Dorp (bevolking 1.000) |
Gemiddeld Dorp (bevolking 10.000) |
Groot Dorp (bevolking 100.000) |
Data Invoeren |
2 uren |
20 uren |
200 uren |
Data Opslaan |
0,5 uur |
5 uren |
50 uren |
Data Doorzoeken |
5 uren |
15 uren |
25 uren |
Data Sorteren |
0,01 uur |
1 uur |
100 uren |
Op basis van de informatie in de tabel, welke van de volgende taken neemt waarschijnlijk de
langste hoeveelheid tijd in beslag wanneer deze wordt
opgeschaald voor een stad met 1.000.000 inwoners.
Data Invoeren
Omdat de populatiegrootte wordt vermenigvuldigd met 10, wordt de
benodigde tijd voor het invoeren van gegevens ook vermenigvuldigd met 10, dus voor een
populatie van 1.000.000 zou dit ongeveer 10 * 200 = 2000 uur duren.
Data Opslaan
Als de populatiegrootte met 10 wordt vermenigvuldigd, wordt de tijd
die nodig is om een back-up van gegevens te maken met 10 vermenigvuldigd, dus voor een
populatie van 1.000.000 zou dit ongeveer 10x50 = 500 uur duren.
Data Doorzoeken
Het doorzoeken van de gegevens lijkt te stijgen met ongeveer 10 uur
elke keer dat de populatie wordt vermenigvuldigd met 10, dus voor een populatie van
1.000.000 zou het ongeveer 35 uur duren .
Data Sorteren
Correct! Omdat de populatiegrootte wordt vermenigvuldigd met 10,
wordt de benodigde tijd voor het sorteren van gegevens vermenigvuldigd met 100. Dus voor
een populatie van 1.000.000 ongeveer 100*100 = 10.000 uur.
- Schrijf een stuk tekst waarin je het verschil uitlegt tussen algoritmen die binnen een
redelijke tijd worden uitgevoerd en algoritmen die onredelijke tijd vereisen om te worden
uitgevoerd.