Hjemmeside
Nyheter
Forelesningsplan
Oppgaver
Eksempler
Pensumliste

Algoritmer og datastrukturer

Løsningsforslag til øvingsoppgaver: Algoritmeanalyse

[Oppgavesett]

Oppgave 1

  1. En enkel for-løkke som går n ganger: O(n)

  2. 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)

  3. To enkle for-løkker som hver går n ganger: O(n)

  4. 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)

  5. 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).

  6. 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).

  7. 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

  1. t(n) = C · n ms, C = 0.5 / 100 = 0.005
    Kjøretid: t(500) = 0.5 · 500 / 100 ms = 2.5 ms

  2. 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

  3. t(n) = C · n2 ms, C = 0.5 / 1002
    Kjøretid: t(500) = 0.5 · 5002 / 1002 ms = 12.5 ms

  4. t(n) = C · n3 ms, C = 0.5 / 1003
    Kjøretid: t(500) = 0.5 · 5003 / 1003 ms = 62.5 ms

Oppgave 3

  1. t(n) = C · n
    C = 0.5 / 100 = 0.005
    t(n) = 60000 = 0.005 · n
    n = 60000 / 0.005 = 12000000 = 12 millioner

  2. 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

  3. 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

  4. 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