Tilbake
1.1

1.1 Asymptotisk notasjon — de fem symbolene

De fem asymptotiske symbolene `O, Ω, Θ, o, ω` med formelle definisjoner — grunnlaget alle kjøretidssvar hviler på.

45 min
8 oppgaver
Asymptotisk notasjonde fem symbolene
Din fremgang i kapitlet
0 / 8 oppgaver

Forkunnskaper

Dette er bokas første faglige kapittel, og det forutsetter ingen andre kapitler.
Alt som brukes, forklares her.

To oppslag fra videregående gjør lesningen lettere. Begge er valgfrie:

- Potenser og logaritmer — hva en logaritme er, og hvorfor
grunntallet bare er en konstant faktor. Vi bruker lgn\lg n hele veien.
- MengdelæreO(g(n))O(g(n)) er egentlig navnet på en mengde av
funksjoner, og ordet «tilhører» er nøyaktig det du trenger for å lese
notasjonen riktig.

Har du aldri sett en kjøretid skrevet som O(noe)O(\text{noe}) før, er
Algoritmedefinisjon, pseudokode og kompleksitet (Big-O)
et mykere første møte. Den boka nøyer seg med OO; her skal du lære alle fem.

Notasjons- og pseudokodeliste

Hvorfor vi teller vekst og ikke sekunder

Se for deg at en nettbutikk skal finne den dyreste varen i katalogen sin. Med
1 000 varer merker ingen at programmet i det hele tatt kjørte. Med 10 millioner
varer merker alle det. Spørsmålet som betyr noe er ikke «hvor mange sekunder tok
det på min maskin?», men «hva skjer når katalogen blir ti ganger så stor?».

Det er nettopp det spørsmålet asymptotisk analyse svarer på. Vi teller ikke
sekunder — sekunder avhenger av maskinen, av programmeringsspråket og av hvor
mye annet som kjørte samtidig. Vi teller hvordan arbeidsmengden vokser med
størrelsen på inndataene, og vi kaller den størrelsen nn.

Arbeidet skriver vi som en funksjon T(n)T(n). Å gå gjennom et array med nn
elementer én gang gir T(n)=nT(n) = n sammenligninger, kanskje T(n)=3n+20T(n) = 3n + 20 hvis
du teller med oppstart og bokføring. Poenget med asymptotisk notasjon er at de
to uttrykkene skal behandles likt: begge dobler seg når nn dobles, og det er
den egenskapen som overlever bytte av maskin.

Asymptotisk vekst

Ordet asymptotisk betyr «når nn blir stor nok». En asymptotisk påstand sier
ingenting om hva som skjer for små inndata — den beskriver bare hvordan
arbeidsmengden utvikler seg etter hvert som inndataene vokser.

Derfor har alle definisjonene i dette kapitlet to konstanter i seg: en faktor cc
som lar oss se bort fra hvor rask maskinen er, og en grense n0n_0 som lar oss se
bort fra alt som skjer for nn under den grensen. Kravet er at ulikheten holder
for alle nn0n \ge n_0 — ikke bare for noen få.

📜Pseudokode-kontrakt: `Maximum`
Antagelser om representasjon. Arrayet er A[1..n] med indeks fra 1, slik
CLRS skriver det. Elementene kan sammenlignes to og to.

Prebetingelse: A har minst ett element. Postbetingelse: returverdien er
det største elementet i A[1..n], og A er uendret.

Maximum(A)
  Input:  array A[1..n], n >= 1
  Output: det storste elementet i A[1..n]
  storst = A[1]
  for i = 2 to A.length
      if A[i] > storst
          storst = A[i]
  return storst
  Kjoretid: Theta(n)

Grunnideen i én setning: etter at løkka har behandlet indeks ii, er storst
lik det største elementet i A[1..i], så når løkka er ferdig gjelder det for
hele arrayet.

Kjøretid: løkka kjører nøyaktig n1n-1 runder uansett hvordan tallene ligger,
og hver runde koster en fast mengde arbeid, altså T(n)=Θ(n)T(n) = \Theta(n).

Dette er den enkleste kjøretiden som finnes, og den er et godt anker: alt annet i
kapitlet handler om hvordan man sier presist at én slik funksjon vokser fortere
eller saktere enn en annen.

Det første symbolet: et tak

Anta at du har talt opp arbeidet i et program og fått T(n)=3n+20T(n) = 3n + 20. Du vil si
noe kort og sant om det. Den svakeste, men mest brukte påstanden er: det vokser
høyst like fort som nn
.

Presist betyr det at du kan finne en konstant å gange nn med, slik at 3n+203n + 20
holder seg under den fra et punkt av. Med c=5c = 5 er 5n5n større enn 3n+203n + 20
så snart n10n \ge 10: 310+20=503 \cdot 10 + 20 = 50 og 510=505 \cdot 10 = 50, og for større
nn vokser 5n5n fortest. Det er hele innholdet i OO.

O(g(n))O(g(n)) — øvre grense
O(g(n))O(g(n)) er mengden av funksjoner som fra et punkt av holder seg under
g(n)g(n), når vi først har fått lov til å gange gg med en konstant. Det er en
øvre grense — et tak — og ikke noe mer.

Formelt: f(n)=O(g(n))f(n) = O(g(n)) betyr at det finnes konstanter c>0c > 0 og n0>0n_0 > 0
slik at

0f(n)cg(n)for alle nn0.0 \le f(n) \le c\,g(n) \quad \text{for alle } n \ge n_0.

Det holder å finne én cc som virker, og du får selv velge n0n_0 etterpå.
Merk hva OO ikke lover: den sier ingenting om at ff faktisk er like stor
som gg. 3n+20=O(n100)3n + 20 = O(n^{100}) er en helt sann, men helt ubrukelig påstand.

Vitnene cc og n0n_0

Å vise en asymptotisk påstand er å legge fram et vitne: ett konkret tallpar
(c,n0)(c, n_0) som gjør ulikheten sann for alle nn0n \ge n_0.

Vitnet trenger ikke være det minste eller peneste mulige. For 3n+20=O(n)3n + 20 = O(n)
virker (c,n0)=(5,10)(c, n_0) = (5, 10), men (4,20)(4, 20) og (23,1)(23, 1) virker like godt. På
eksamen holder det å oppgi ett par og vise at ulikheten holder — du skal ikke
lete etter det optimale.

📝Oppgave 1

(Innstegsoppgave, sjanger D — definisjon, altså at du skriver ned den presise
definisjonen av et symbol.)

a) Skriv definisjonen av f(n)=O(g(n))f(n) = O(g(n)) med egne ord, og få med både cc
og n0n_0.
b) Vis at 7n+100=O(n)7n + 100 = O(n) ved å oppgi ett gyldig vitne (c,n0)(c, n_0).

De to neste: et gulv, og begge deler samtidig

OO alene er ofte for lite. Sier du at en algoritme bruker O(n2)O(n^2) tid, har du
ikke utelukket at den egentlig er ferdig på Θ(n)\Theta(n) — du har bare lovet at
den ikke er verre enn kvadratisk. For å si at noe faktisk koster så mye,
trenger du et gulv i tillegg til taket.

Gulvet heter Ω\Omega, og det er den samme definisjonen med ulikheten snudd. Har
du både tak og gulv med samme gg, sier du at ff vokser nøyaktig som gg — og
det symbolet heter Θ\Theta.

Ω(g(n))\Omega(g(n)) — nedre grense
Ω(g(n))\Omega(g(n)) er mengden av funksjoner som fra et punkt av holder seg over
g(n)g(n), når vi først har fått lov til å gange gg med en konstant. Det er en
nedre grense — et gulv.

Formelt: f(n)=Ω(g(n))f(n) = \Omega(g(n)) betyr at det finnes konstanter c>0c > 0 og
n0>0n_0 > 0 slik at

0cg(n)f(n)for alle nn0.0 \le c\,g(n) \le f(n) \quad \text{for alle } n \ge n_0.

Også her holder det med én cc. Legg merke til n0n_0: Ω\Omega betyr ikke at
f(n)g(n)f(n) \ge g(n) for hver eneste nn — bare fra et punkt av, og bare opp til en
konstant faktor. Å definere Ω\Omega som «ff er minst like stor som gg» uten
n0n_0 er et av de vanligste trekkene som koster poeng.

Θ(g(n))\Theta(g(n)) — tett grense
Θ(g(n))\Theta(g(n)) er mengden av funksjoner som vokser nøyaktig like fort som
g(n)g(n): de klemmes inne mellom to konstantganger av gg. Dette er det strammeste
av de tre «vanlige» symbolene, og det er det du skal svare når du kan.

Formelt: f(n)=Θ(g(n))f(n) = \Theta(g(n)) betyr at det finnes konstanter c1>0c_1 > 0,
c2>0c_2 > 0 og n0>0n_0 > 0 slik at

0c1g(n)f(n)c2g(n)for alle nn0.0 \le c_1 g(n) \le f(n) \le c_2 g(n) \quad \text{for alle } n \ge n_0.

Ekvivalent, og ofte lettere å bruke: f(n)=Θ(g(n))f(n) = \Theta(g(n)) hvis og bare hvis
f(n)=O(g(n))f(n) = O(g(n)) og f(n)=Ω(g(n))f(n) = \Omega(g(n)). Å vise en tett grense er altså å
gjøre to jobber, ikke én.

✏️Eksempel 1: $3n^2 + 5n = \Theta(n^2)$ med eksplisitte vitner

Vis at 3n2+5n=Θ(n2)3n^2 + 5n = \Theta(n^2) ved å oppgi konkrete konstanter c1c_1, c2c_2 og
n0n_0.

Vi må klemme 3n2+5n3n^2 + 5n mellom to konstantganger av n2n^2.

Nedre grense. Leddet 5n5n er positivt for alle n1n \ge 1, så

3n2+5n3n2for alle n1.3n^2 + 5n \ge 3n^2 \quad \text{for alle } n \ge 1.

Det gir c1=3c_1 = 3 og n0=1n_0 = 1.

Øvre grense. Vi vil ha 3n2+5nc2n23n^2 + 5n \le c_2 n^2. Prøv c2=4c_2 = 4: ulikheten
blir 5nn25n \le n^2, altså 5n5 \le n. Så

3n2+5n4n2for alle n5.3n^2 + 5n \le 4n^2 \quad \text{for alle } n \ge 5.

Sett sammen. Med c1=3c_1 = 3, c2=4c_2 = 4 og n0=5n_0 = 5 gjelder begge ulikhetene
samtidig:

3n23n2+5n4n2for alle n5.3n^2 \le 3n^2 + 5n \le 4n^2 \quad \text{for alle } n \ge 5.

Altså er 3n2+5n=Θ(n2)3n^2 + 5n = \Theta(n^2).

Kortsvarsformen: på eksamen skriver du én linje — Θ(n2)\Theta(n^2), med
c1=3c_1 = 3, c2=4c_2 = 4, n0=5n_0 = 5 — og ikke hele utledningen. Utregningen over er
undervisning, ikke svar.

Intuisjon: legg merke til at n0=5n_0 = 5 ikke er noe magisk tall. Hadde vi
valgt c2=8c_2 = 8, ville 5n5n25n \le 5n^2 holdt allerede fra n=1n = 1. Konstantene og
grensen henger sammen, og du får velge dem som passer deg.

📝Oppgave 2
Sjanger A

Avgjør for hver av påstandene om den er sann eller gal, og begrunn hver med én
setning.

a) 6n2+3n+9=Θ(n2)6n^2 + 3n + 9 = \Theta(n^2)
b) 6n2+3n+9=O(n3)6n^2 + 3n + 9 = O(n^3)
c) 6n2+3n+9=Θ(n3)6n^2 + 3n + 9 = \Theta(n^3)

De to strenge: oo og ω\omega

De tre symbolene så langt sammenligner opp til en konstant. 3n23n^2 og 5n25n^2 er
Θ\Theta av hverandre — konstanten 3 mot 5 spiller ingen rolle. Noen ganger vil
du si noe sterkere: at ff virkelig blir liten i forhold til gg, uansett hvor
mye du får lov til å gange gg ned med.

Det er nettopp der oo og ω\omega kommer inn, og forskjellen fra OO og Ω\Omega
ligger i ett eneste ord. Der OO sier «det finnes en cc», sier oo «for hver
cc». Klarer du å holde de to fra hverandre, har du sikret deg mot den vanligste
feilen i sjanger D.

o(g(n))o(g(n)) — strengt mindre
o(g(n))o(g(n)) er mengden av funksjoner som vokser strengt saktere enn g(n)g(n):
uansett hvor kraftig du krymper gg, blir ff til slutt mindre.

Formelt: f(n)=o(g(n))f(n) = o(g(n)) betyr at det for hver konstant c>0c > 0 finnes en
grense n0>0n_0 > 0 slik at

0f(n)<cg(n)for alle nn0.0 \le f(n) < c\,g(n) \quad \text{for alle } n \ge n_0.

Legg merke til to ting. For det første: kvantoren er «for hver cc», ikke «det
finnes en cc». For det andre: n0n_0 får lov til å avhenge av cc — jo mindre
cc er, jo lenger ut må du gå. 3n2+5n=o(n3)3n^2 + 5n = o(n^3) krever n5n \ge 5 for
c=1c = 1, men n30002n \ge 30\,002 for c=0,0001c = 0{,}0001.

ω(g(n))\omega(g(n)) — strengt større
ω(g(n))\omega(g(n)) er mengden av funksjoner som vokser strengt fortere enn
g(n)g(n): uansett hvor kraftig du blåser opp gg, blir ff til slutt større.

Formelt: f(n)=ω(g(n))f(n) = \omega(g(n)) betyr at det for hver konstant c>0c > 0 finnes
en grense n0>0n_0 > 0 slik at

0cg(n)<f(n)for alle nn0.0 \le c\,g(n) < f(n) \quad \text{for alle } n \ge n_0.

ω\omega er speilbildet av oo: f(n)=ω(g(n))f(n) = \omega(g(n)) hvis og bare hvis
g(n)=o(f(n))g(n) = o(f(n)). Og som for oo er kravet «for hver cc» — det er dette som
gjør ω\omega strengere enn Ω\Omega.

«For hver cc» kontra «det finnes en cc»

Dette ene ordet er hele skillet mellom de løse og de strenge symbolene, og det
er det som oftest blir borte i en definisjon skrevet under tidspress.

- OO og Ω\Omega krever bare at én konstant cc virker. Du får lov til å
velge den etter at du har sett på ff og gg.
- oo og ω\omega krever at ulikheten holder for hver c>0c > 0, uansett hvor
liten eller stor. Til gjengjeld får n0n_0 avhenge av cc.

Konsekvensen er at f(n)=Θ(g(n))f(n) = \Theta(g(n)) og f(n)=o(g(n))f(n) = o(g(n)) aldri kan være sant
samtidig, og at ingen funksjon er oo eller ω\omega av seg selv. nlgnn\lg n er
O(nlgn)O(n\lg n), men ikke o(nlgn)o(n\lg n).

✏️Eksempel 2: alle fem symbolene på samme funksjon

La f(n)=3n2+5nf(n) = 3n^2 + 5n. Avgjør for hver av g(n)=ng(n) = n, g(n)=n2g(n) = n^2 og
g(n)=n3g(n) = n^3 hvilke av de fem symbolene som gjelder.

Metoden er alltid den samme: se på forholdet f(n)/g(n)f(n)/g(n) når nn vokser. Går det
mot null, er f=o(g)f = o(g). Går det mot uendelig, er f=ω(g)f = \omega(g). Holder det seg
mellom to positive konstanter, er f=Θ(g)f = \Theta(g).

Mot g(n)=n2g(n) = n^2. Forholdet er 3+5/n3 + 5/n, som nærmer seg 3. Det er verken
null eller uendelig, så

3n2+5n=Θ(n2),og dermed ogsa˚ O(n2) og Ω(n2).3n^2 + 5n = \Theta(n^2), \quad \text{og dermed også } O(n^2) \text{ og } \Omega(n^2).

Verken o(n2)o(n^2) eller ω(n2)\omega(n^2) gjelder — de utelukkes av Θ\Theta.

Mot g(n)=n3g(n) = n^3. Forholdet er 3/n+5/n23/n + 5/n^2, som går mot null. Da er

3n2+5n=o(n3),og dermed ogsa˚ O(n3).3n^2 + 5n = o(n^3), \quad \text{og dermed også } O(n^3).

Ω(n3)\Omega(n^3), Θ(n3)\Theta(n^3) og ω(n3)\omega(n^3) er alle gale.

Mot g(n)=ng(n) = n. Forholdet er 3n+53n + 5, som vokser uten grense. Da er

3n2+5n=ω(n),og dermed ogsa˚ Ω(n).3n^2 + 5n = \omega(n), \quad \text{og dermed også } \Omega(n).

O(n)O(n), Θ(n)\Theta(n) og o(n)o(n) er alle gale.

Legg merke til mønsteret. oo trekker alltid OO med seg, og ω\omega trekker
alltid Ω\Omega med seg — men aldri motsatt vei. Det strammeste svaret er alltid
Θ\Theta der Θ\Theta finnes, og her finnes den bare mot n2n^2.

📝Oppgave 3
Sjanger D og A blandet

Bruk forholdet f(n)/g(n)f(n)/g(n) til å avgjøre påstandene.

a) Er 100n=o(n2)100n = o(n^2)?
b) Er nlgn=o(n2)n\lg n = o(n^2)?
c) Er nlgn=O(n2)n\lg n = O(n^2)?
d) Er nlgn=o(nlgn)n\lg n = o(n\lg n)?

Symbolene som ulikhetstegn

Når definisjonene sitter, er det verdt å ha en kortversjon i hodet også. De fem
symbolene oppfører seg som fem ulikhetstegn mellom vekstratene til ff og gg:

SymbolLeses somUlikhetstegnet det minner om
f=O(g)f = O(g)«ff vokser høyst like fort som gg»mindre enn eller lik
f=Ω(g)f = \Omega(g)«ff vokser minst like fort som gg»større enn eller lik
f=Θ(g)f = \Theta(g)«ff vokser nøyaktig like fort som gg»lik
f=o(g)f = o(g)«ff vokser strengt saktere enn gg»strengt mindre enn
f=ω(g)f = \omega(g)«ff vokser strengt fortere enn gg»strengt større enn

Tabellen er en huskeregel, ikke en definisjon, og den har én viktig svakhet: for
tall gjelder at enten er aba \le b eller bab \le a. For funksjoner finnes det par
der ingen av delene gjelder — nn og n1+sinnn^{1 + \sin n} krysser hverandre i det
uendelige. Slike par dukker ikke opp i dette faget, men skriv aldri tabellen som
om den var definisjonen. På et definisjonsspørsmål er det c,n0\exists c, n_0-formen
som gir uttelling.

Rangeringen du bruker i hodet

Nesten alle klassifiseringsspørsmål på eksamen løses ved å plassere de to
funksjonene i denne rekkefølgen:

1<lgn<n<nlgn<n2<n3<2n<n!1 < \lg n < n < n\lg n < n^2 < n^3 < 2^n < n!

Ligger ff til venstre for gg, er f=o(g)f = o(g). Ligger de på samme plass, er
f=Θ(g)f = \Theta(g). Ligger ff til høyre, er f=ω(g)f = \omega(g).

Tallene gjør poenget tydelig. For n=1024n = 1024:

FunksjonVerdi ved n=1024n = 1024
111
lgn\lg n10
nn1 024
nlgnn\lg n10 240
n2n^21 048 576
n3n^31 073 741 824
2n2^nastronomisk
n!n!enda større

Tre ting er verdt å merke seg. Konstanter forsvinner: n/2n/2, 5n5n og
100n+7100n + 7 er alle Θ(n)\Theta(n). Grunntallet i en logaritme forsvinner også:
log10n=lgn/lg10\log_{10} n = \lg n / \lg 10, og lg10\lg 10 er bare en konstant, så
log10n=Θ(lgn)\log_{10} n = \Theta(\lg n). Og en logaritme inne i en potens blir en
konstantfaktor:
lg(n3)=3lgn=Θ(lgn)\lg(n^3) = 3\lg n = \Theta(\lg n).
📝Oppgave 4
Sjanger A
Sorter disse sju funksjonene fra langsomst til raskest voksende, og
oppgi for hvert nabopar hvilket symbol som knytter dem sammen.

n3,lgn,n!,nlgn,n2lgn,2n,nn^3, \quad \lg n, \quad n!, \quad n\lg n, \quad n^2\lg n, \quad 2^n, \quad n

Regler du får bruke uten å bevise dem

Symbolene oppfører seg som ulikhetstegn også når du setter påstander sammen. De
tre reglene under brukes fritt i fasitene, og du trenger ikke bevise dem — men du
må vite at de finnes, og hvilken vei de går.

📜Transitivitet, symmetri og Θ\Theta som ekvivalensrelasjon
Transitivitet. Alle fem symbolene er transitive. Er f=O(g)f = O(g) og
g=O(h)g = O(h), så er f=O(h)f = O(h). Det samme gjelder for Ω\Omega, Θ\Theta, oo og
ω\omega hver for seg. Dette er grunnen til at vekstordningen fungerer som en
kjede: har du plassert to funksjoner i den, vet du hvordan de forholder seg til
alle de andre.

Symmetriregelen mellom OO og Ω\Omega. Det gjelder at

f(n)=O(g(n))    g(n)=Ω(f(n)).f(n) = O(g(n)) \iff g(n) = \Omega(f(n)).

Samme sak sett fra hver sin side. Tilsvarende er f=o(g)f = o(g) det samme som
g=ω(f)g = \omega(f).

Θ\Theta er en ekvivalensrelasjon. Den er refleksiv (f=Θ(f)f = \Theta(f)),
symmetrisk (er f=Θ(g)f = \Theta(g), så er g=Θ(f)g = \Theta(f)) og transitiv. Praktisk
betyr det at «vokser like fort som» deler funksjonene inn i klasser: n/2n/2, 5n5n
og 100n+7100n + 7 havner i samme klasse, og du kan bytte fritt mellom dem inne i et
asymptotisk uttrykk. Vi bruker egenskapen; vi beviser den ikke.

Merk at OO og Ω\Omega ikke er symmetriske: n=O(n2)n = O(n^2) er sant, mens
n2=O(n)n^2 = O(n) er galt.

Likhetstegnet i asymptotisk notasjon
O(g(n))O(g(n)) er en mengde av funksjoner, og f(n)=O(g(n))f(n) = O(g(n)) betyr strengt tatt
at ff tilhører denne mengden. Likhetstegnet er en konvensjon, ikke en
likhet.

CLRS — Cormen, Leiserson, Rivest og Stein, som er pensumlitteraturen i faget —
skriver likhetstegn, og det gjør oppgavesettene og fasitene også. Derfor gjør vi
det her. To konsekvenser du må kjenne:

- Påstanden leses fra venstre mot høyre. Du skriver f(n)=O(g(n))f(n) = O(g(n)), aldri
O(g(n))=f(n)O(g(n)) = f(n).
- Den kan ikke snus som en vanlig likhet. At n=O(n2)n = O(n^2) og n2=O(n2)n^2 = O(n^2) gir
deg ikke lov til å konkludere at n=n2n = n^2.

lgn\lg n — toerlogaritmen
lgn\lg n betyr log2n\log_2 n, altså logaritmen med grunntall 2. Det er CLRS-
konvensjonen, og den notasjonen oppgavene og fasitene i dette faget bruker. Skriv
lgn\lg n, ikke logn\log n, når du svarer.

Asymptotisk spiller grunntallet ingen rolle, fordi
logbn=lgn/lgb\log_b n = \lg n / \lg b og lgb\lg b er en konstant. Derfor er
log10n=Θ(lgn)=Θ(lnn)\log_{10} n = \Theta(\lg n) = \Theta(\ln n). Grunnen til at nettopp 2 er
standard, er at algoritmene i faget deler problemet i to om og om igjen — og da
er det antall halveringer som teller.

📝Oppgave 5
Sjanger F

Avgjør om hver påstand stemmer.

a) Hvis f=O(g)f = O(g) og g=O(h)g = O(h), så er f=O(h)f = O(h).
b) Hvis f=O(g)f = O(g), så er g=O(f)g = O(f).
c) Hvis f=Θ(g)f = \Theta(g), så er g=Θ(f)g = \Theta(f).
d) Hvis f=O(g)f = O(g), så er g=Ω(f)g = \Omega(f).

✏️Eksempel 3: eksamensnivå — definisjon og klassifisering i ett
a) Definér ω(g(n))\omega(g(n)) presist, og forklar med én setning hva som skiller
det fra Ω(g(n))\Omega(g(n)).

b) Avgjør om nlgn=ω(n)n\lg n = \omega(n) og om nlgn=ω(nlgn)n\lg n = \omega(n\lg n).

c) En algoritme har kjøretid T(n)T(n), og du har vist at T(n)4n2T(n) \le 4n^2 for
alle n8n \ge 8. Hvilket av de fem symbolene har du belegg for?

a) f(n)=ω(g(n))f(n) = \omega(g(n)) betyr at det for hver konstant c>0c > 0 finnes en
grense n0>0n_0 > 0 slik at 0cg(n)<f(n)0 \le c\,g(n) < f(n) for alle nn0n \ge n_0.

Forskjellen fra Ω\Omega: Ω\Omega krever bare at ulikheten holder for én
konstant cc, mens ω\omega krever at den holder for hver eneste cc, uansett hvor
stor.

b) nlgn=ω(n)n\lg n = \omega(n) er sant: forholdet er lgn\lg n, som vokser uten grense,
så uansett hvor stor cc er finnes det en n0n_0 der lgn\lg n passerer den.

nlgn=ω(nlgn)n\lg n = \omega(n\lg n) er galt. Ingen funksjon er ω\omega av seg selv —
allerede c=1c = 1 gir ulikheten nlgn<nlgnn\lg n < n\lg n, som aldri holder.

c) Du har belegg for T(n)=O(n2)T(n) = O(n^2), med vitnet (c,n0)=(4,8)(c, n_0) = (4, 8), og
ingenting mer. En øvre grense alene gir ikke Θ\Theta: den utelukker ikke at
algoritmen egentlig er ferdig på Θ(n)\Theta(n). For Θ(n2)\Theta(n^2) måtte du i tillegg
ha vist en nedre grense c1n2T(n)c_1 n^2 \le T(n).

Slik ser svaret ut på arket: a) definisjonen i én setning med kvantoren
tydelig. b) «Ja» og «Nei», hver med en halv linjes begrunnelse. c) «O(n2)O(n^2)
bare øvre grense er vist.» Ikke mer.

📝Oppgave 6
Eksamensnivå, sjanger D

Skriv ned de formelle definisjonene av O(g(n))O(g(n)),
Ω(g(n))\Omega(g(n)) og Θ(g(n))\Theta(g(n)), slik du ville gjort det på et ark uten
hjelpemidler.

Forklar deretter med én setning hvorfor Θ\Theta alltid er det svaret du bør gi
når du kan.

📝Oppgave 7
Eksamensnivå, sjanger A

Vis at 2n2+nlgn=Θ(n2)2n^2 + n\lg n = \Theta(n^2) ved å oppgi
eksplisitte konstanter, og avgjør deretter om uttrykket også er o(n3)o(n^3) og om
det er ω(nlgn)\omega(n\lg n).

📝Oppgave 8
Eksamensnivå, sjanger F

Et forslag til svar på et definisjonsspørsmål lyder
slik:

«f(n)=o(g(n))f(n) = o(g(n)) betyr at det finnes en konstant c>0c > 0 og en n0n_0 slik at
f(n)<cg(n)f(n) < c\,g(n) for alle nn0n \ge n_0

a) Er dette definisjonen av oo? Svar ja eller nei, og pek på nøyaktig hva
som er galt.
b) Hvilket symbol beskriver setningen faktisk?
c) Gi et konkret funksjonspar som setningen godtar, men som ikke er oo.

Begrepsbank

Begrepsbanken er flashcard- og repetisjonsstoff — den gjentar det du nettopp har
lest. Hopp trygt over ved førstegangslesing; tidsanslaget for kapitlet gjelder
kjernestoffet.

Intuisjonstabellen for de fem symbolene

De fem symbolene oppfører seg som fem ulikhetstegn mellom vekstratene: OO svarer
til «mindre enn eller lik», Ω\Omega til «større enn eller lik», Θ\Theta til
«lik», oo til «strengt mindre enn» og ω\omega til «strengt større enn».

Tabellen er en huskeregel for klassifisering, ikke en definisjon. På et
definisjonsspørsmål er det cc-og-n0n_0-formen som gir uttelling.

Standard vekstordning
Rekkefølgen du sammenligner funksjoner mot, fra langsomst til raskest voksende:

1<lgn<n<nlgn<n2<n3<2n<n!1 < \lg n < n < n\lg n < n^2 < n^3 < 2^n < n!

Ligger ff til venstre for gg i denne kjeden, er f=o(g)f = o(g); ligger den til
høyre, er f=ω(g)f = \omega(g); ligger de på samme plass, er f=Θ(g)f = \Theta(g). Ved
n=1024n = 1024 er lgn=10\lg n = 10, nlgn=10240n\lg n = 10\,240 og n2n^2 litt over en million.

Transitivitet

Alle fem symbolene er transitive: er f=O(g)f = O(g) og g=O(h)g = O(h), så er f=O(h)f = O(h),
og tilsvarende for Ω\Omega, Θ\Theta, oo og ω\omega.

Dette er regelen som gjør vekstordningen brukbar. Har du plassert to funksjoner i
kjeden, kan du lese av forholdet mellom dem uten å regne på nytt.

Θ\Theta som ekvivalensrelasjon
Θ\Theta er refleksiv, symmetrisk og transitiv, og deler dermed funksjonene inn i
klasser av «vokser like fort».

Praktisk konsekvens: inne i et asymptotisk uttrykk kan du bytte 5n5n med nn,
n/2n/2 med nn og log10n\log_{10} n med lgn\lg n uten at noe endres. OO og Ω\Omega er
derimot ikke symmetriske — n=O(n2)n = O(n^2) er sant, mens n2=O(n)n^2 = O(n) er galt.

Symmetriregelen mellom de løse symbolene
f(n)=O(g(n))f(n) = O(g(n)) hvis og bare hvis g(n)=Ω(f(n))g(n) = \Omega(f(n)), og f(n)=o(g(n))f(n) = o(g(n))
hvis og bare hvis g(n)=ω(f(n))g(n) = \omega(f(n)).

Det er én og samme observasjon sett fra hver sin side, og den er nyttig når en
oppgave gir deg påstanden «feil vei» av det du trenger.

Strammeste grense

Blant flere sanne asymptotiske påstander om samme funksjon er den strammeste den
som gir mest informasjon: Θ\Theta foran OO, og O(n2)O(n^2) foran O(n3)O(n^3).

Løsningsforslagene forventer det strammeste uttrykket. 6n2+3n+9=O(n3)6n^2 + 3n + 9 = O(n^3)
er sant, men et svar som kaster bort informasjon — dette er felle #4, altså å
oppgi en løs grense der en strammere finnes.

Konstanter og lavere ordens ledd

Konstantfaktorer og alle ledd av lavere orden forsvinner i et asymptotisk
uttrykk: 5n2+100n+3000=Θ(n2)5n^2 + 100n + 3000 = \Theta(n^2).

Begrunnelsen ligger i definisjonen: konstanten 55 kan absorberes i c1c_1 og
c2c_2, og leddene 100n100n og 30003000 blir små i forhold til n2n^2 når nn er stor
nok. Det er nettopp derfor asymptotisk analyse ikke avhenger av maskinen.

Logaritmens grunntall er en konstant
logbn=lgn/lgb\log_b n = \lg n / \lg b, og lgb\lg b er en konstant. Derfor er alle logaritmer
Θ\Theta av hverandre: log10n=Θ(lgn)=Θ(lnn)\log_{10} n = \Theta(\lg n) = \Theta(\ln n).

Av samme grunn er lg(n3)=3lgn=Θ(lgn)\lg(n^3) = 3\lg n = \Theta(\lg n). En potens inne i en
logaritme blir en konstantfaktor utenfor — det er en fast liten felle i
klassifiseringsoppgaver.

Kjøretidsfunksjonen T(n)T(n)
T(n)T(n) er antall grunnoperasjoner en algoritme utfører på input av størrelse nn.
Det er denne funksjonen de asymptotiske symbolene beskriver.

nn må alltid være definert: for sortering er det antall elementer, for grafer
antall noder og kanter, for et tall som skal faktoriseres antall bit. Et
kjøretidssvar uten en klar nn er ikke et fullstendig svar.

Beste, verste og forventet tilfelle

Kjøretiden avhenger ofte av hvilke data algoritmen får. Verste tilfelle er
den største kjøretiden over alle input av størrelse nn, beste tilfelle den
minste, og forventet tilfelle et gjennomsnitt over tilfeldige valg eller
tilfeldig input.

De tre er uavhengige av valget mellom OO, Ω\Omega og Θ\Theta. Insertion-Sort
har for eksempel Θ(n)\Theta(n) i beste tilfelle og Θ(n2)\Theta(n^2) i verste — begge er
tette grenser, hver for sitt tilfelle.

Polynomisk mot eksponentiell vekst

Enhver potens nkn^k med fast kk vokser strengt saktere enn 2n2^n: nk=o(2n)n^k = o(2^n)
for hver konstant kk. Og 2n=o(n!)2^n = o(n!).

Tallene viser hvor brutalt skillet er. Ved n=32n = 32 er n3n^3 omtrent 3300033\,000,
mens 2n2^n er over fire milliarder. Det er dette skillet som gjør at et
eksponentielt program er ubrukelig lenge før et kubisk begynner å svette.

Hvorfor OO alene ikke er nok
OO gir bare et tak. Sier du at en algoritme bruker O(n2)O(n^2) tid, har du ikke
utelukket at den er ferdig på Θ(n)\Theta(n) — påstanden er sann uansett.

Derfor krever et fullstendig kjøretidssvar Θ\Theta der den tette grensen er
kjent. Bruk OO bevisst, når bare den øvre grensen er vist, og «forventet» der
kjøretiden er et gjennomsnitt over tilfeldige valg.

Repetisjonsoppgaver

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 Norges teknisk-naturvitenskapelige universitet. Dette er ikke offisielt studiemateriell. Les mer.