Hjemmeside
Nyheter
Forelesningsplan
Oppgaver
Eksempler
Pensumliste
|
Algoritmer og datastrukturer
Løsningsforslag til øvingsoppgaver: Algoritmeanalyse
[Oppgavesett]
Oppgave 1
-
En enkel for-løkke som går n ganger: O(n)
-
To for-løkker "nestet" inn i hverandre. For hver gang ytre løkke går 1 gang, går indre løkke n ganger, totalt blir dette O(n2)
-
To enkle for-løkker som hver går n ganger: O(n)
-
To for-løkker "nestet" inn i hverandre. For hver gang ytre løkke går 1 gang, går indre løkke n2 ganger, totalt blir dette O(n3)
-
To for-løkker "nestet" inn i hverandre. For hver gang ytre løkke går 1 gang, går indre løkke i + 1 ganger, totalt vil da indre løkke gå 1 + 2 + 3 + ... + n - 1 = n (n - 1) / 2 ganger, altså blir dette O(n2).
-
Setter vi N = n2, ser vi på samme måte som i forrige oppgave at de to innerste løkkene har en arbeidsmengde på O(N2) = O(n4). Siden de to innerste løkkene skal utføres n ganger, blir den totale arbeidsmengden her
O(n5).
-
Denne oppgaven illustrerer et eksempel med 3 nestede løkker, der
arbeidsmengden ikke er så enkel å beregne fordi den innerste løkken
ligger i en if-setning som sjelden slår til.
Hvis det ikke hadde stått noen if-setning foran den innerste løkken, ville
dette vært en O(n5) algoritme (omtrent samme resonnement som i punkt 6 ovenfor).
Her vil j-løkken hver gang gå fra j = 0 til j = i2 - 1, og if-testen
vil derfor bare slå til nøyaktig i ganger hver gang den ytre løkken gjør et
gjennomløp (for f.eks. i = 4 vil j gå fra 0 til 15, og testen slår til for
j-verdiene 0, 4, 8 og 12.). Vi får da en total arbeidsmengde som er av
størrelsesorden O(n4)
Oppgave 2
-
t(n) = C · n ms, C = 0.5 / 100 = 0.005
Kjøretid: t(500) = 0.5 · 500 / 100 ms = 2.5 ms
-
t(n) = C · n · log(n) ms, C = 0.5 / (100 · log(100))
Kjøretid: t(500) = 0.5 · (500 · log(500)) / (100 · log(100)) ms = 0.5 · 6.75 ms = 3.375 ms
-
t(n) = C · n2 ms, C = 0.5 / 1002
Kjøretid: t(500) = 0.5 · 5002 / 1002 ms = 12.5 ms
-
t(n) = C · n3 ms, C = 0.5 / 1003
Kjøretid: t(500) = 0.5 · 5003 / 1003 ms = 62.5 ms
Oppgave 3
-
t(n) = C · n
C = 0.5 / 100 = 0.005
t(n) = 60000 = 0.005 · n
n = 60000 / 0.005 = 12000000 = 12 millioner
-
t(n) = C · n logn
C = 0.5 / (100 · log(100))
t(n) = 60000 = 0.5 · (n logn) / (100 · log(100))
n logn = 60000 · 100 · log(100) / 0.5
n log10n = 60000 · 100 · 2 / 0.5 = 24 millioner
Prøving med innsetting av verdier gir omtrent n = 3650000 = 3.65 millioner
-
t(n) = C · n2
C = 0.5 / 1002 = 0.00005
t(n) = 60000 = 0.00005 · n2
n2 = 60000 / 0.00005 = 1200000000 = 1.2 millarder
n = 34641
-
t(n) = C · n3
C = 0.5 / 1003 = 0.0000005
t(n) = 60000 = 0.0000005 · n3
n3 = 60000 / 0.0000005 = 120000000000 = 120 millarder
n = 4932
Oppgave 4
Se Javakoden.
Oppgave 5
O(log(n)), siden while-løkka går like mange ganger som n er delelig med 2.
Jan Høiberg
|