Tilbake
1.1

1.1 Asymptotisk notasjon — O (og kort Ω, Θ)

O-notasjonen (øvre grense) som IN2010s arbeidshest, med kort omtale av Ω og Θ — grunnlaget alle kjøretidssvar hviler på.

45 min
6 oppgaver
Asymptotisk notasjonO (og kort Ω
Din fremgang i kapitlet
0 / 6 oppgaver

Forkunnskaper

Dette kapitlet kan leses uten forkunnskaper fra resten av boka — det er
startpunktet.

Har du aldri møtt OO-notasjon før, kan disse to gi et mykere første møte:

- Algoritmedefinisjon, pseudokode og kompleksitet (Big-O)
— samme idé, forklart uten eksamenspress.
- Potenser og logaritmer — hvis log2n\log_2 n føles ukjent. Du
trenger bare én ting derfra: at log2n\log_2 n er svaret på spørsmålet «hvor mange
ganger kan jeg halvere nn før jeg er nede i 1?».

Notasjons- og pseudokodeliste

Hvorfor vi ikke måler i sekunder

Folkeregisteret i en mellomstor kommune har rundt 40 000 innbyggere. Du skal
skrive en funksjon som finner ut om en bestemt person står i registeret.

Du kan gjøre det på to måter. Du kan gå gjennom listen fra start og sammenligne
hver eneste rad — da må du i verste fall innom alle 40 000. Eller du kan, hvis
listen er sortert, slå opp på midten, se om du havnet for høyt eller for lavt,
og halvere søkeområdet: 40 000, 20 000, 10 000, og så videre. Det tar 16 steg.

Forskjellen er ikke at det ene programmet er «raskere skrevet». Forskjellen er
hvordan de to skalerer. Doble registeret til 80 000, og den første metoden
bruker dobbelt så lang tid, mens den andre bruker ett steg til. Ett eneste.

Det er dette OO-notasjonen fanger. Den måler ikke sekunder, for sekunder
avhenger av maskinen, programmeringsspråket og hvor travelt det er på
serveren. Den måler hvordan arbeidsmengden vokser når inputen vokser — og
det er en egenskap ved algoritmen selv, ikke ved maskinen den kjøres på.

Å si at noe er asymptotisk betyr nettopp «når nn blir stor». Det er en
uttalelse om oppførsel i det lange løp, ikke om et bestemt regnestykke.

Problemstørrelsen n

Tallet som beskriver hvor stor inputen er: antall elementer i et array, antall
noder i en graf, antall tegn i en tekst. Alt annet i kjøretidsanalysen måles
mot dette tallet.

På eksamen trekkes det eksplisitt for å bruke nn uten å si hva det teller.
Skriv derfor alltid én setning som «her er nn antall bøker i registeret».

Asymptotisk kjøretid

Hvordan arbeidsmengden til en algoritme vokser når nn blir stor, uavhengig av
maskin, språk og faste kostnader. Måles i grunnsteg, ikke i sekunder.

Praktisk konsekvens: konstanter og lavere ordensledd faller bort, fordi de ikke
påvirker hvordan uttrykket vokser.

Store O — øvre grense
f(n)=O(g(n))f(n) = O(g(n)) betyr at det finnes en konstant c>0c > 0 og en terskel n0n_0
slik at

f(n)cg(n)for alle nn0.f(n) \leq c \cdot g(n) \quad \text{for alle } n \geq n_0.

Med ord: fra et visst punkt og oppover ligger ff under gg, bortsett fra en
fast faktor. OO er altså et løfte om at det ikke blir verre enn dette.

Dette er notasjonen IN2010 bruker nesten overalt, og den du skal svare med når
en oppgave ber om kjøretiden.

De to bokstavene cc og n0n_0 er hele hemmeligheten bak at OO virker så
grovkornet. cc lar deg se bort fra faste faktorer: en algoritme som bruker
5n5n steg og en som bruker nn steg er begge O(n)O(n), fordi du bare velger
c=5c = 5. Og n0n_0 lar deg se bort fra hva som skjer for små input: at en
kompleks algoritme er treg på tre elementer, betyr ingenting.

Dette er både styrken og svakheten. Styrken er at OO sier noe robust som
gjelder på enhver maskin. Svakheten er at OO ikke sier noe som helst om
hvilken av to algoritmer som er raskest på nettopp dine data.

✏️Eksempel 1: Vis at $3n + 7$ er $O(n)$

En algoritme bruker f(n)=3n+7f(n) = 3n + 7 grunnsteg. Vis at f(n)=O(n)f(n) = O(n) ved å
oppgi en konstant cc og en terskel n0n_0 som oppfyller definisjonen.

Vi skal finne cc og n0n_0 slik at 3n+7cn3n + 7 \leq c \cdot n for alle
nn0n \geq n_0.

Prøv c=4c = 4. Da må vi ha 3n+74n3n + 7 \leq 4n, altså 7n7 \leq n. Det stemmer for
alle n7n \geq 7.

Svar: med c=4c = 4 og n0=7n_0 = 7 er 3n+74n3n + 7 \leq 4n for alle n7n \geq 7,
og dermed er 3n+7=O(n)3n + 7 = O(n).

Kontroller gjerne: for n=7n = 7 er venstresiden 2828 og høyresiden 2828; for
n=10n = 10 er de 3737 og 4040; for n=100n = 100 er de 307307 og 400400. Avstanden
vokser, aldri motsatt.

Legg merke til at valget ikke er entydig. c=10c = 10 og n0=1n_0 = 1 virker også.
Definisjonen krever bare at det finnes ett par som virker, ikke at du
finner det beste.

📝Oppgave 1

(Innstegsoppgave, sjanger C — kjøretidsfakta, altså et sant/usant-punkt om hvor
raskt noe går.) Avgjør om hvert utsagn er sant eller usant, og begrunn med én
setning.

a) 2n+1002n + 100 er O(n)O(n).
b) n2n^2 er O(n)O(n).
c) nn er O(n2)O(n^2).

De to andre bokstavene

OO har to søsken. Du trenger dem sjelden på IN2010-eksamen, men de dukker opp i
emnebeskrivelsen og i pensumboka, og det er verdt å kunne skille dem fra
hverandre på et sant/usant-punkt.

Omega — nedre grense
f(n)=Ω(g(n))f(n) = \Omega(g(n)) betyr at det finnes en konstant c>0c > 0 og en terskel
n0n_0 slik at

f(n)cg(n)for alle nn0.f(n) \geq c \cdot g(n) \quad \text{for alle } n \geq n_0.

Med ord: algoritmen bruker minst så mye tid. Ω\Omega er den nedre grensen,
og brukes typisk om problemer heller enn om algoritmer — for eksempel at
sammenligningsbasert sortering krever Ω(nlogn)\Omega(n \log n) sammenligninger.

Theta — tett grense
f(n)=Θ(g(n))f(n) = \Theta(g(n)) betyr at f(n)=O(g(n))f(n) = O(g(n)) og f(n)=Ω(g(n))f(n) = \Omega(g(n))
samtidig: gg er både øvre og nedre grense, altså den nøyaktige vekstraten.

3n+73n + 7 er Θ(n)\Theta(n), men bare O(n2)O(n^2) — ikke Θ(n2)\Theta(n^2).

Notasjonen IN2010 ikke bruker

Lille oo og lille ω\omega er strenge versjoner av OO og Ω\Omega («vokser
strengt saktere», «strengt raskere»). De brukes ikke i IN2010, verken i
oppgavetekster eller i sensorveiledninger.

Møter du dem i en generell algoritmebok, kan du hoppe over avsnittet. Det du
skal svare med på eksamen, er OO.

✏️Eksempel 2: $O$, $\Omega$ eller $\Theta$?

En algoritme bruker f(n)=n2+5n+3f(n) = n^2 + 5n + 3 grunnsteg. Hvilke av disse utsagnene
er sanne?

a) f(n)=O(n2)f(n) = O(n^2)
b) f(n)=O(n3)f(n) = O(n^3)
c) f(n)=Ω(n)f(n) = \Omega(n)
d) f(n)=Θ(n)f(n) = \Theta(n)

a) Sant. Med c=9c = 9 er n2+5n+39n2n^2 + 5n + 3 \leq 9n^2 for alle n1n \geq 1
(fordi 5n5n25n \leq 5n^2 og 33n23 \leq 3n^2 når n1n \geq 1). Dette er det
strammeste OO-uttrykket, og det er dette du skal svare på eksamen.

b) Sant, men slapt. n2n3n^2 \leq n^3 for n1n \geq 1, så en øvre grense på
n3n^3 holder også. Sensor ber om det strammeste uttrykket; svarer du O(n3)O(n^3)
her, mister du poeng selv om påstanden i seg selv er sann.

c) Sant. f(n)nf(n) \geq n for alle n1n \geq 1, så nn er en gyldig nedre
grense — også den slapp, men gyldig.

d) Usant. Θ(n)\Theta(n) ville krevd at ff også er O(n)O(n), og det er den
ikke: n2n^2-leddet vokser raskere enn noen fast faktor ganger nn. Den riktige
tette grensen er Θ(n2)\Theta(n^2).

Momentet å ta med videre: OO er en øvre grense og har lov til å være
romslig. Derfor er «er dette O()O(\ldots)?» et annet spørsmål enn «hva er
kjøretiden?». Eksamen spør nesten alltid om det siste, og forventer det
strammeste uttrykket.

📝Oppgave 2
Sjanger C

Sant eller usant? Begrunn hvert svar med én setning.

a) Hvis f(n)=Θ(nlogn)f(n) = \Theta(n \log n), så er f(n)=O(n2)f(n) = O(n^2).
b) Hvis f(n)=O(n)f(n) = O(n), så er f(n)=Θ(n)f(n) = \Theta(n).
c) En algoritme som er Ω(n2)\Omega(n^2) kan ikke ha kjøretid O(n)O(n).

📜Vekstordningen
For store nok nn gjelder alltid denne rekkefølgen:

1<logn<n<nlogn<n2<n3<2n<n!1 < \log n < n < n\log n < n^2 < n^3 < 2^n < n!

Hvert uttrykk vokser raskere enn alle som står til venstre for det. Rekkefølgen
er den mest brukte enkeltopplysningen i hele faget, og den skal sitte utenat:
den avgjør hvilket ledd som dominerer i en sum, hvilken algoritme som er best i
en poengtrapp, og hva som er riktig svar på et sant/usant-punkt.

Konsekvensen for forenkling: i en sum er det alltid det raskest voksende
leddet som bestemmer OO-klassen. n2+1000n+106n^2 + 1000n + 10^6 er O(n2)O(n^2), fordi de to
siste leddene til slutt er forsvinnende små ved siden av det første.

Dominerende ledd

Det leddet i en sum som vokser raskest, og som derfor alene bestemmer
OO-klassen. I 3n2+100nlogn+5003n^2 + 100n \log n + 500 er 3n23n^2 dominerende, og hele
uttrykket er O(n2)O(n^2).

Regelen brukes hver gang du analyserer kode med løkker etter hverandre: du
legger sammen, og beholder det verste.

Skjulte konstanter

De faste faktorene som forsvinner når du skriver OO: en algoritme med 100n100n
steg og en med 2n2n steg er begge O(n)O(n), men den ene er femti ganger tregere i
praksis.

Dette er grunnen til at OO ikke kan brukes til å avgjøre hvilken av to
algoritmer som er raskest på en konkret, liten input — bare hvilken som til
slutt vinner når nn vokser.

✏️Eksempel 3: Sortér etter vekst og forenkl
Sortér disse fem uttrykkene fra saktest til raskest voksende, og oppgi det
strammeste OO-uttrykket for hvert:

4n2+3n,200,nlogn+5n,2n+n10,7n+logn4n^2 + 3n, \qquad 200, \qquad n \log n + 5n, \qquad 2^n + n^{10}, \qquad 7n + \log n

Vi tar dem ett om gangen og finner det dominerende leddet i hver.

- 200200 er en konstant: ingen nn i det hele tatt, altså O(1)O(1).
- 7n+logn7n + \log n: siden logn<n\log n < n, dominerer 7n7n, og konstanten faller bort.
Altså O(n)O(n).
- nlogn+5nn \log n + 5n: her er nlognn \log n det største leddet, fordi logn>1\log n > 1 for
n>2n > 2. Altså O(nlogn)O(n \log n).
- 4n2+3n4n^2 + 3n: kvadratleddet dominerer, konstanten 4 faller bort. Altså O(n2)O(n^2).
- 2n+n102^n + n^{10}: dette er den som lurer flest. n10n^{10} ser voldsomt ut, men
2n2^n passerer den — allerede rundt n=59n = 59 er 2n2^n større, og deretter
drar den fra for godt. Altså O(2n)O(2^n).

Rekkefølgen fra saktest til raskest voksende:

200  <  7n+logn  <  nlogn+5n  <  4n2+3n  <  2n+n10200 \ \ <\ \ 7n + \log n \ \ <\ \ n\log n + 5n \ \ <\ \ 4n^2 + 3n \ \ <\ \ 2^n + n^{10}

altså O(1)O(1), O(n)O(n), O(nlogn)O(n \log n), O(n2)O(n^2), O(2n)O(2^n).

Merk framgangsmåten, for den er den samme hver gang: finn det dominerende
leddet, stryk konstanten foran det, og skriv OO av det som står igjen. Ingen
tredje ting.

📝Oppgave 3
Sjanger B

Oppgi det
strammeste OO-uttrykket for hvert av disse.

a) 6n3+400n2+96n^3 + 400n^2 + 9
b) 5050
c) n+n+n+nn + n + n + n
d) n2logn+n2n^2 \log n + n^2

Fella som kommer igjen hvert år

Det finnes ett sant/usant-punkt som går igjen i settene i ulike forkledninger,
og som svært mange svarer feil på. Det ser slik ut:

«En algoritme med bedre asymptotisk kompleksitet bruker alltid færre
grunnsteg enn en med dårligere kompleksitet, på samme input.»

Svaret er usant, og grunnen ligger i de to bokstavene cc og n0n_0 fra
definisjonen.

📜Bedre asymptotikk gir ikke færre steg for all input

At f(n)=O(nlogn)f(n) = O(n \log n) og g(n)=O(n2)g(n) = O(n^2) sier kun at det finnes en
terskel n0n_0 der ff havner under gg og blir liggende der. Det sier ingenting
om hvem som er minst før den terskelen.

Et konkret par: la f(n)=1000nlognf(n) = 1000\,n \log n og g(n)=n2g(n) = n^2. For n=100n = 100 er
f(100)664000f(100) \approx 664\,000 mens g(100)=10000g(100) = 10\,000 — den «bedre» algoritmen
bruker over seksti ganger så mange steg. Først rundt n=14000n = 14\,000 tar ff igjen
gg, og fra da av vinner den for alltid.

Dette er grunnen til at praktiske sorteringsbiblioteker bytter til
innsettingssortering for korte lister, selv om den er O(n2)O(n^2): på små input er
den faktisk raskest.

Formuleringen du skal kjenne igjen: «bedre OO» betyr «vinner til slutt»,
ikke «vinner alltid».

Bedre asymptotikk er ikke færre steg

At en algoritme har lavere OO-klasse enn en annen, garanterer bare at den er
raskest for store nok nn — ikke for all input. Skjulte konstanter kan gjøre
den «bedre» algoritmen langsommere på små datasett.

Dette er et fast sant/usant-punkt på eksamen, og svaret er alltid at påstanden
om «alltid færre steg» er usann.

✏️Eksempel 4: Sant/usant på eksamensnivå

Marker sant eller usant, og begrunn hvert svar med én setning.

a) En O(nlogn)O(n \log n)-algoritme bruker alltid færre grunnsteg enn en
O(n2)O(n^2)-algoritme på samme input.

b) Et array kan sjekkes for om det er sortert i O(n)O(n).

c) Hvis en algoritme har kjøretid O(n)O(n), kan den ikke ha kjøretid
O(n2)O(n^2).

a) Usant. OO-klassen sier bare hva som skjer for store nok nn; en
skjult konstant kan gjøre den asymptotisk bedre algoritmen tregere på små input.

b) Sant. Gå gjennom arrayet én gang og sammenlign hvert element med det
neste; du er ferdig etter n1n-1 sammenligninger, altså O(n)O(n). Pseudokoden står
rett under her.

c) Usant. OO er en øvre grense, og en øvre grense kan gjøres
slappere. Alt som er O(n)O(n) er også O(n2)O(n^2) — det er bare et mindre
informativt svar. Denne formuleringen er en klassisk felle fordi den høres
fornuftig ut.

Sensorblikket: på slike punkter er det ordet «alltid» i (a) og ordet «kan
ikke» i (c) som avgjør. Les sant/usant-utsagn ord for ord — det er den mest
gjentatte oppfordringen i sensorveiledningene.

📜Pseudokode-kontrakt: `IsSorted`
Antagelser om representasjon. A er et array med nn elementer, indeksert
fra 0, slik at A[0] er det første og A[n-1] det siste. Elementene kan
sammenlignes med < og >.

Prebetingelse: A inneholder n0n \geq 0 elementer.
Postbetingelse: prosedyren returnerer true hvis og bare hvis
A[0] <= A[1] <= ... <= A[n-1]; arrayet er uendret.

Procedure IsSorted(A)
  Input:  array A med n elementer, indeksert fra 0
  Output: true hvis A er sortert stigende, ellers false
  n = A.length
  for i = 0 to n-2:
      if A[i] > A[i+1]:
          return false
  return true

Grunnidé i én setning: et array er sortert nøyaktig når ingen nabopar står i
gal rekkefølge, så det holder å sjekke naboparene.

Kjøretid: løkka går høyst n1n-1 runder og gjør konstant arbeid i hver, så
kjøretiden er O(n)O(n). Merk at den kan avslutte langt tidligere — finner den et
feil nabopar med én gang, stopper den etter én runde. Men OO beskriver det
verste tilfellet, og verst er at hele arrayet faktisk er sortert.

📝Oppgave 4
Sjanger C

Se på pseudokoden for IsSorted over.

a) Hva er kjøretiden i verste tilfelle, og hvilken input gir det verste
tilfellet?
b) Hva er kjøretiden i beste tilfelle, og hvilken input gir det?
c) Er det riktig å si at IsSorted er O(n2)O(n^2)?

Verste, beste og forventet tilfelle

Oppgaven IsSorted viste at samme algoritme kan bruke svært ulik tid på ulik
input av samme størrelse. Derfor må du vite hvilket tilfelle du snakker om.

Hovedregelen i IN2010: oppgir du en kjøretid uten å presisere, mener du
verste tilfelle.
Unntaket er noen få strukturer der forventet tilfelle er det
interessante, og der sier oppgaven det uttrykkelig — hashtabellen er det
viktigste eksempelet, og den kommer i Del 3.

Verste tilfelle

Den største kjøretiden algoritmen kan få over alle input av størrelse nn.
Standardsvaret når en oppgave spør om «kjøretiden» uten å presisere.

Eksempel: kvikksortering er O(n2)O(n^2) i verste tilfelle, selv om den nesten
alltid oppfører seg langt bedre.

Forventet tilfelle

Gjennomsnittlig kjøretid over inputene, eller over algoritmens egne tilfeldige
valg. Oppgis bare når oppgaven spør om det — men da er det viktig.

Eksempel: oppslag i en hashtabell er O(1)O(1) forventet og O(n)O(n) i verste
tilfelle. Begge tallene hører med i et fullstendig svar.

Beste tilfelle

Den minste kjøretiden algoritmen kan få på en input av størrelse nn. Sjelden
det som spørres om, men nyttig for å forstå en algoritme — for eksempel at
innsettingssortering er O(n)O(n) på et allerede sortert array.

📝Oppgave 5
Sjanger C, eksamensnivå

Du sammenligner to programmer som løser samme
oppgave. Program P bruker f(n)=2n2f(n) = 2n^2 grunnsteg, program Q bruker
g(n)=500ng(n) = 500n grunnsteg.

a) Oppgi OO-klassen for hvert program.
b) For hvilke nn er P faktisk raskest?
c) En kollega sier: «Q har best kompleksitet, så vi bruker Q.» Datasettene
deres har alltid rundt 50 elementer. Hva svarer du?

📝Oppgave 6
Sjanger C, eksamensnivå

Avgjør sant eller usant, og begrunn hvert svar med én
setning.

a) nlogn=O(n2)n \log n = O(n^2).
b) 2n+1=O(2n)2^{n+1} = O(2^n).
c) n!=O(2n)n! = O(2^n).
d) Hvis f(n)=O(g(n))f(n) = O(g(n)) og g(n)=O(h(n))g(n) = O(h(n)), så er f(n)=O(h(n))f(n) = O(h(n)).

En liten notasjonsvane du bør kjenne

IN2010 skriver f(n)=O(g(n))f(n) = O(g(n)) med likhetstegn, slik denne boka har gjort hele
veien. Strengt tatt er O(g)O(g) en mengde av funksjoner, og det logisk
korrekte ville vært «ff tilhører O(g)O(g)». Likhetstegnet er en gammel og fast
konvensjon i faget, og det er den formen du møter i oppgavetekster.

Praktisk betyr det bare én ting: likhetstegnet går ikke begge veier. Du kan
skrive 3n+7=O(n)3n + 7 = O(n), men ikke O(n)=3n+7O(n) = 3n + 7. Les det som «er» eller
«tilhører», ikke som «er lik».

Likhetstegnet i f(n) = O(g(n))

Fagets faste skrivemåte. Leses «ff er O(g)O(g)» eller «ff tilhører O(g)O(g)», og
går bare én vei: 3n+7=O(n)3n + 7 = O(n) er riktig, mens O(n)=3n+7O(n) = 3n + 7 er meningsløst.

IN2010 bruker denne formen i oppgavetekster og sensorveiledninger, så du bør
kjenne den igjen — men ingen trekker deg for å skrive «tilhører».

De sju klassene du møter i dette faget

Nesten alle kjøretider i IN2010 lander i en av disse. Tabellen er verdt å kunne
utenat, både veien fra navn til uttrykk og veien fra uttrykk til et eksempel.

OO-klasseNavnTypisk eksempelHva som skjer når nn dobles
O(1)O(1)konstantslå opp A[5], legge til bakerst i et arrayingenting
O(logn)O(\log n)logaritmiskbinærsøk i et sortert arrayett steg til
O(n)O(n)lineærgå gjennom hele arrayet én gangdobbelt så mye arbeid
O(nlogn)O(n \log n)lineærlogaritmiskflettesortering, heapsorteringlitt mer enn dobbelt
O(n2)O(n^2)kvadratisksammenligne alle par, boblesorteringfire ganger så mye
O(n3)O(n^3)kubisktre nøstede løkker over samme mengdeåtte ganger så mye
O(2n)O(2^n)eksponentiellprøve alle delmengderkvadrering av arbeidet

Den siste kolonnen er den mest nyttige på eksamen: den lar deg kontrollere et
svar på fem sekunder. Har du regnet ut at en algoritme er O(n2)O(n^2), men vet at
den bare bruker ett steg til når inputen dobles, har du regnet feil et sted.
Konstant tid
O(1)O(1): kjøretiden er den samme uansett hvor stor inputen er. Ingen løkke over
dataene.

Eksempler i dette faget: oppslag på en indeks i et array, å lese det minste
elementet i en min-heap, å lese lengden av en liste.

Logaritmisk tid
O(logn)O(\log n): arbeidet vokser med antall halveringer av nn. Dobler du
inputen, får du bare ett steg til.

Kjennetegnet er at algoritmen kaster bort halvparten av søkeområdet i hvert
steg. Eksempler: binærsøk i et sortert array, innsetting i et balansert
søketre, sift-operasjonene i en heap.

Lineær tid
O(n)O(n): arbeidet vokser i takt med inputen. Kjennetegnet er én løkke som er
innom hvert element et konstant antall ganger.

Eksempler: å sjekke om et array er sortert, å finne det største elementet, å
telle forekomster. Dette er ofte det beste som er mulig, siden du må lese
dataene minst én gang.

Lineærlogaritmisk tid
O(nlogn)O(n \log n): én lineær gjennomgang for hver av de logn\log n halveringsnivåene.
Kjennetegnet på en effektiv sammenligningsbasert sortering.

Eksempler: flettesortering, heapsortering og kvikksortering i forventet
tilfelle. Det er også den beviste nedre grensen for sortering som bare
sammenligner elementer.

Kvadratisk tid
O(n2)O(n^2): typisk to nøstede løkker over de samme dataene, altså at hvert
element møter hvert annet. Dobles inputen, firedobles arbeidet.

Eksempler: boblesortering, innsettingssortering, og enhver «sammenlign alle par»-
løsning. På eksamen er O(n2)O(n^2) nesten alltid det nederste trinnet i
poengtrappen — det gir uttelling, men aldri full pott.

Kubisk tid
O(n3)O(n^3): tre nøstede løkker over de samme dataene. Dobles inputen, åttedobles
arbeidet.

Dukker sjelden opp som en ønsket løsning, men er et vanlig riktig svar på en
kjøretidsoppgave der koden faktisk har tre nøstede løkker.

Eksponentiell tid
O(2n)O(2^n): arbeidet dobles hver gang inputen øker med ett element. Typisk for
løsninger som prøver alle delmengder eller alle kombinasjoner.

Praktisk grense: rundt n=40n = 40 er slike algoritmer ubrukelige. I IN2010 møter
du dem mest som en rekursjon der hvert kall gjør to nye kall, og som
kontrasten til det som er praktisk mulig.

Repetisjon — kapitlet i åtte punkter

Dette kapitlet er skrevet av Anthropics toppmodeller (Claude Opus og Claude Fable) og er foreløpig ikke manuelt gjennomgått — kvalitetskontrollen gjøres av uavhengige KI-agenter, og innmeldte feil rettes fortløpende. Funnet en feil? Meld fra, så retter vi den. Les mer om hvordan innholdet lages.

Skolesaga er en uavhengig læringsressurs og er ikke tilknyttet eller godkjent av Universitetet i Oslo. Dette er ikke offisielt studiemateriell. Les mer.