2. Analyse van algoritmen Flashcards
Wat is een algoritme?
Een algoritme is een reeks van instructies om vanaf een beginpunt een bepaald doel te bereiken.
Wat is een programma?
Een programma is een algoritme of een geheel van algoritmes die uitgeschreven zijn in een bepaalde programmeertaal.
Wat is een datastructuur?
Een datastructuur is een manier waarop data bijgehouden wordt.
Wat bepaalt de datastructuur?
De datastructuur bepaalt de wijze waarop en hoe efficiënt gegevens kunnen worden opgeslagen, gewijzigd of geraadpleegd.
Wat is een goed algoritme?
Een goed algoritme is een efficiënt algoritme, en heeft dus een korte UITVOERINGSTIJD en gebruikt weinig GEHEUGEN.
Wat zijn de beperkingen van de uitvoeringstijd experimenteel (System.currentTimeMillis()) te meten?
- Het aantal testen is beperkt. Er zullen bepaalde groottes van invoer niet getest worden, die misschien wel van belang zijn.
- Testen kunnen alleen vergeleken worden met elkaar als ze op identiek hetzelfde platform uitgevoerd worden (hardware en software).
- Om de algoritmen uit te voeren, moeten ze geïmplementeerd worden en moeten er goede testen gezocht worden. Dit vergt veel tijd.
Wat zijn primitieve opdrachten?
Dit zijn basisinstructies waarvan de uitvoeringstijd constant is.
Som enkele primitieve opdrachten op.
- Een toekenning van een waarde aan een variabele
- Een methodeoproep
- Een return
- Wiskundige en logische bewerkingen (vb optelling, vergelijking)
- Een element raadplegen in een array aan de hand van z’n index
Waarom bepalen we het worst-case scenario van een algoritme?
We kiezen voor het slechtste scenario omdat dit zo zijn voordelen heeft:
- Het geeft een bovengrens aan en in bepaalde domeinen is die bovengrens van cruciaal belang (vb luchtvaart, geneeskunde).
- Het slechtste scenario komt in bepaalde algoritmen het meest voor.
- Het gemiddelde is dikwijls even erg als het slechtste geval.
Hoe meten we de uitvoeringstijd van een algorithm op een algemene manier?
Door de primitive opdrachten op te tellen.
Waarom zijn we enkel geïnteresseerd in de graad van de groei van de uitvoeringstijd?
Dit geeft een beter overzicht van de relatie van het algoritme met n.
De grootte van invoer is namelijk een zeer belangrijke factor in de uitvoeringstijd van een algoritme.
Som de zeven meest voorkomende functies op.
- constante functie
- logaritmische functie
- lineaire functie
- kwadratische functie
- n log n functie
- kubische functie
- exponentiële functie
Constante functie?
f(n) = c
Wanneer een algoritme een uitvoeringstijd heeft waarin f(n) = c, betekent dit dat het algoritme altijd even lang zal duren, ongeacht de invoer.
n = 1 => f(n) = c n = 2 => f(n) = c n = 4 => f(n) = c ... n = 100 => f(n) = c
> 0(1)
Logaritmische functie?
f(n) = log n
Een algoritme heeft als uitvoeringstijd een logaritmische functie wanneer het algoritme het probleem steeds weer in twee deelt, zoals binair zoeken.
n = 1 => f(n) = 0 n = 2 => f(n) = 1 n = 4 => f(n) = 2 ... n = 32 => f(n) = 5
> 0(log n)
Lineaire functie?
f(n) = n
Een algoritme heeft een uitvoeringstijd die lineair is, wanneer we iedere keer een eenvoudige basisopdracht moeten uitvoeren voor elke element uit de invoer. Bijvoorbeeld, de vergelijking van een getal x met elk element uit een array met grootte n, zal n vergelijkingen vereisen.
De waarde dat de functie f(n) teruggeeft is recht evenredig met de waarde van n.
n = 1 => f(n) = 1 n = 2 => f(n) = 2 n = 3 => f(n) = 3 ... n = 100 => f(n) = 100
> 0(n)