1.4 Algoritmeanalyse


Algoritmeanalyse prøver at finde svar på spørgsmål som

Den videnskabelige metode.

Vi kan analysere programmers tidsforbrug med samme metode, som naturvidenskaberne bruger til at forstå verden omkring os:

Eksperimenterne skal være reproducerbare, og den formulerede hypotese skal være falsificerbar.

Observationer.

Vi begynder med at foretage kvantitative målinger af programmers tidsforbrug. Hertil bruger vi datatypen Stopwatch.java, der måler køretiden af et program.
public class Stopwatch
Stopwatch() skab nyt stopur
doubleelapsedTime()tid siden skabelse (i sekunder)
Programmet for tresummer, ThreeSum.java, læser \(N\) heltal og tæller antallet af tripler, der summerer til 0. (Programmet tager ikke hensym til heltalsoverløb.) Testprogrammet DoublingTest.java kalder tresumskoden på indput af voksende størrelse som følger. Testprogrammet skaber en række af \(N\) tilfældige heltal og udskriver tiden for kørslen af ThreeSum.count() på dette indput. Derefter fordobles \(N\) og processen gentages.

loglog plot of running time

Matematiske modeller.

Et programs samlede køretid afhænger hovedsageligt af to faktorer: omkostningen af den enkelte sætning og antallet af gange, hver enkelt sætning udføres.

Egenskab. Vækstraten for køretiden af ThreeSum.java er \(N^3\).

Påstand. Den naive algoritme for tresum bruger \(\sim \frac{1}{2}N^3\) rækkeadgange for blandt \(N\) tal at finde antallet af tripler der summer til \(0\).

Konstruktion af hurtigere algoritmer.

Hovedanledningen for at studere vækstraten af programmers køretid er som hjælp til at konstruere hurtigere algoritmer for at løse det samme problem. Vi kan fx udvikle hurtigere algoritmer for tosums- og tresumsproblemerne ved at bruge flettesortering og binærsøgning.

Afhængighed af indput.

Det viser sig, at mange af vores algoritmer har køretider som vi kan karakterisere som funktion af størrelsen af indput. Der findes dog situationer, hvor denne meget enkle model ikke er tilstrækkelig.

Påstand. Iimplementationen af sæk, stak og kø som en hægtet liste tager alle operationer konstant tid i værste fald.

Påstand. I implementationen af sæk, stak og kø som en dynamisk række tager alle operationer amortiseret konstant tid per operation i værste fald. Med andre ord tager hver sekvens af \(N\) operationer, begyndende med en tom datastruktur, tid proportionalt med \(N\) i værste fald.

Lagerforbrug.

memory requirement of
  some objects

For at afgøre, hvor meget lager vores program bruger, tæller vi antallet af variaber og vægter dem efter, hvor mange bytes deres datatype bruger. For en typisk 64-bitsmaskine har vi: