1.1 Asymptotisk notasjon — de fem symbolene
De fem asymptotiske symbolene `O, Ω, Θ, o, ω` med formelle definisjoner — grunnlaget alle kjøretidssvar hviler på.
De fem symbolene , , , og er tema i
100 % (17 av de 17 settene i grunnlaget). Ingen annen enkeltbit av pensum er
like forutsigbar, og ingen annen er like billig å sikre seg.
Symbolene kommer i tre sjangre, og alle tre skrives ut i klarspråk her:
- Sjanger D — definisjon, altså at du blir bedt om å skrive ned den presise
definisjonen av ett av symbolene. Dette er et fast, direkte krav.
- Sjanger A — asymptotisk forenkling, altså at du skal koke et sammensatt
uttrykk ned til ett strammeste svar. Den trenes for fullt i neste kapittel,
men hviler helt på definisjonene du lærer her.
- Sjanger E — kjøretid, altså at du skal oppgi kjøretiden til en algoritme i
ett uttrykk. Her avgjør det om du velger eller .
Alle tre er kortsvarsoppgaver: du får noen få linjer til rådighet, og det er
svaret som teller, ikke veien dit. Eksamen har dessuten hjelpemiddelkode E,
som er kodeordet for at ingen hjelpemidler er tillatt — verken bok, formelark
eller kalkulator. Definisjonene under må derfor kunnes utenat, ordrett nok til at
du kan skrive dem ned uten å tenke deg om.
Prioritet: høyeste prioritet — dette må sitte.
Slik er kapitlet lagt opp (45 min): først et konkret anker for hva
«asymptotisk» egentlig betyr, så de fem definisjonene én etter én med en oppgave
rett etter hver bit, deretter vekstordningen du bruker til å sammenligne
funksjoner i hodet, og til slutt de tre reglene som lar deg kombinere påstander.
Begrepsbanken helt nederst er repetisjonsstoff.
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 hele veien.
- Mengdelære — 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 før, er
Algoritmedefinisjon, pseudokode og kompleksitet (Big-O)
et mykere første møte. Den boka nøyer seg med ; her skal du lære alle fem.
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 .
Arbeidet skriver vi som en funksjon . Å gå gjennom et array med
elementer én gang gir sammenligninger, kanskje 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 dobles, og det er
den egenskapen som overlever bytte av maskin.
Ordet asymptotisk betyr «når 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
som lar oss se bort fra hvor rask maskinen er, og en grense som lar oss se
bort fra alt som skjer for under den grensen. Kravet er at ulikheten holder
for alle — ikke bare for noen få.
A[1..n] med indeks fra 1, slikCLRS 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 , 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 runder uansett hvordan tallene ligger,
og hver runde koster en fast mengde arbeid, altså .
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 . Du vil si
noe kort og sant om det. Den svakeste, men mest brukte påstanden er: det vokser
høyst like fort som .
Presist betyr det at du kan finne en konstant å gange med, slik at
holder seg under den fra et punkt av. Med er større enn
så snart : og , og for større
vokser fortest. Det er hele innholdet i .
, når vi først har fått lov til å gange med en konstant. Det er en
øvre grense — et tak — og ikke noe mer.
Formelt: betyr at det finnes konstanter og
slik at
Det holder å finne én som virker, og du får selv velge etterpå.
Merk hva ikke lover: den sier ingenting om at faktisk er like stor
som . er en helt sann, men helt ubrukelig påstand.
Å vise en asymptotisk påstand er å legge fram et vitne: ett konkret tallpar
som gjør ulikheten sann for alle .
Vitnet trenger ikke være det minste eller peneste mulige. For
virker , men og virker like godt. På
eksamen holder det å oppgi ett par og vise at ulikheten holder — du skal ikke
lete etter det optimale.
(Innstegsoppgave, sjanger D — definisjon, altså at du skriver ned den presise
definisjonen av et symbol.)
a) Skriv definisjonen av med egne ord, og få med både
og .
b) Vis at ved å oppgi ett gyldig vitne .
De to neste: et gulv, og begge deler samtidig
alene er ofte for lite. Sier du at en algoritme bruker tid, har du
ikke utelukket at den egentlig er ferdig på — 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 , og det er den samme definisjonen med ulikheten snudd. Har
du både tak og gulv med samme , sier du at vokser nøyaktig som — og
det symbolet heter .
, når vi først har fått lov til å gange med en konstant. Det er en
nedre grense — et gulv.
Formelt: betyr at det finnes konstanter og
slik at
Også her holder det med én . Legg merke til : betyr ikke at
for hver eneste — bare fra et punkt av, og bare opp til en
konstant faktor. Å definere som « er minst like stor som » uten
er et av de vanligste trekkene som koster poeng.
: de klemmes inne mellom to konstantganger av . Dette er det strammeste
av de tre «vanlige» symbolene, og det er det du skal svare når du kan.
Formelt: betyr at det finnes konstanter ,
og slik at
Ekvivalent, og ofte lettere å bruke: hvis og bare hvis
og . Å vise en tett grense er altså å
gjøre to jobber, ikke én.
Vis at ved å oppgi konkrete konstanter , og
.
Nedre grense. Leddet er positivt for alle , så
Det gir og .
Øvre grense. Vi vil ha . Prøv : ulikheten
blir , altså . Så
Sett sammen. Med , og gjelder begge ulikhetene
samtidig:
Altså er .
Kortsvarsformen: på eksamen skriver du én linje — , med
, , — og ikke hele utledningen. Utregningen over er
undervisning, ikke svar.
Intuisjon: legg merke til at ikke er noe magisk tall. Hadde vi
valgt , ville holdt allerede fra . Konstantene og
grensen henger sammen, og du får velge dem som passer deg.
Avgjør for hver av påstandene om den er sann eller gal, og begrunn hver med én
setning.
a)
b)
c)
De to strenge: og
De tre symbolene så langt sammenligner opp til en konstant. og er
av hverandre — konstanten 3 mot 5 spiller ingen rolle. Noen ganger vil
du si noe sterkere: at virkelig blir liten i forhold til , uansett hvor
mye du får lov til å gange ned med.
Det er nettopp der og kommer inn, og forskjellen fra og
ligger i ett eneste ord. Der sier «det finnes en », sier «for hver
». Klarer du å holde de to fra hverandre, har du sikret deg mot den vanligste
feilen i sjanger D.
uansett hvor kraftig du krymper , blir til slutt mindre.
Formelt: betyr at det for hver konstant finnes en
grense slik at
Legg merke til to ting. For det første: kvantoren er «for hver », ikke «det
finnes en ». For det andre: får lov til å avhenge av — jo mindre
er, jo lenger ut må du gå. krever for
, men for .
: uansett hvor kraftig du blåser opp , blir til slutt større.
Formelt: betyr at det for hver konstant finnes
en grense slik at
er speilbildet av : hvis og bare hvis
. Og som for er kravet «for hver » — det er dette som
gjør strengere enn .
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.
- og krever bare at én konstant virker. Du får lov til å
velge den etter at du har sett på og .
- og krever at ulikheten holder for hver , uansett hvor
liten eller stor. Til gjengjeld får avhenge av .
Konsekvensen er at og aldri kan være sant
samtidig, og at ingen funksjon er eller av seg selv. er
, men ikke .
krever gulv i tillegg. Skriver du etter bare å ha vist
, har du påstått mer enn du har belegg for.
Å gi en løsere grense enn nødvendig — felle #4, altså å oppgi en løs
asymptotisk grense der en strammere finnes. er sant,
men et svar som kaster bort informasjon. Kan du vise , er det
som er svaret. Regelen er kort: oppgi alltid det strammeste
uttrykket du kan forsvare.
Å glemme «for hver » i og . En definisjon av som bare
sier «det finnes en » beskriver , ikke , og gir ikke uttelling som
definisjon av .
Å definere uten . « er minst like stor som » er ikke
definisjonen. Ulikheten kreves bare for , og bare opp til konstanten
. Uten ville vært galt, siden er usant bare
for og — grensen finnes nettopp for å slippe å tenke på slike
tilfeller.
Å bytte om venstre- og høyreside. Du skriver , aldri
. Notasjonen leses fra venstre mot høyre og kan ikke snus.
La . Avgjør for hver av , og
hvilke av de fem symbolene som gjelder.
mot null, er . Går det mot uendelig, er . Holder det seg
mellom to positive konstanter, er .
Mot . Forholdet er , som nærmer seg 3. Det er verken
null eller uendelig, så
Verken eller gjelder — de utelukkes av .
Mot . Forholdet er , som går mot null. Da er
, og er alle gale.
Mot . Forholdet er , som vokser uten grense. Da er
, og er alle gale.
Legg merke til mønsteret. trekker alltid med seg, og trekker
alltid med seg — men aldri motsatt vei. Det strammeste svaret er alltid
der finnes, og her finnes den bare mot .
Bruk forholdet til å avgjøre påstandene.
a) Er ?
b) Er ?
c) Er ?
d) Er ?
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 og :
| Symbol | Leses som | Ulikhetstegnet det minner om |
|---|---|---|
| « vokser høyst like fort som » | mindre enn eller lik | |
| « vokser minst like fort som » | større enn eller lik | |
| « vokser nøyaktig like fort som » | lik | |
| « vokser strengt saktere enn » | strengt mindre enn | |
| « vokser strengt fortere enn » | strengt større enn |
Tabellen er en huskeregel, ikke en definisjon, og den har én viktig svakhet: for
tall gjelder at enten er eller . For funksjoner finnes det par
der ingen av delene gjelder — og 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 -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:
Ligger til venstre for , er . Ligger de på samme plass, er
. Ligger til høyre, er .
Tallene gjør poenget tydelig. For :
| Funksjon | Verdi ved |
|---|---|
| 1 | |
| 10 | |
| 1 024 | |
| 10 240 | |
| 1 048 576 | |
| 1 073 741 824 | |
| astronomisk | |
| enda større |
Tre ting er verdt å merke seg. Konstanter forsvinner: , og
er alle . Grunntallet i en logaritme forsvinner også:
, og er bare en konstant, så
. Og en logaritme inne i en potens blir en
konstantfaktor: .
oppgi for hvert nabopar hvilket symbol som knytter dem sammen.
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.
, så er . Det samme gjelder for , , og
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 og . Det gjelder at
Samme sak sett fra hver sin side. Tilsvarende er det samme som
.
er en ekvivalensrelasjon. Den er refleksiv (),
symmetrisk (er , så er ) og transitiv. Praktisk
betyr det at «vokser like fort som» deler funksjonene inn i klasser: ,
og 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 og ikke er symmetriske: er sant, mens
er galt.
at 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 , aldri
.
- Den kan ikke snus som en vanlig likhet. At og gir
deg ikke lov til å konkludere at .
konvensjonen, og den notasjonen oppgavene og fasitene i dette faget bruker. Skriv
, ikke , når du svarer.
Asymptotisk spiller grunntallet ingen rolle, fordi
og er en konstant. Derfor er
. 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.
Avgjør om hver påstand stemmer.
a) Hvis og , så er .
b) Hvis , så er .
c) Hvis , så er .
d) Hvis , så er .
det fra .
b) Avgjør om og om .
c) En algoritme har kjøretid , og du har vist at for
alle . Hvilket av de fem symbolene har du belegg for?
grense slik at for alle .
Forskjellen fra : krever bare at ulikheten holder for én
konstant , mens krever at den holder for hver eneste , uansett hvor
stor.
b) er sant: forholdet er , som vokser uten grense,
så uansett hvor stor er finnes det en der passerer den.
er galt. Ingen funksjon er av seg selv —
allerede gir ulikheten , som aldri holder.
c) Du har belegg for , med vitnet , og
ingenting mer. En øvre grense alene gir ikke : den utelukker ikke at
algoritmen egentlig er ferdig på . For måtte du i tillegg
ha vist en nedre grense .
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) « —
bare øvre grense er vist.» Ikke mer.
Skriv ned de formelle definisjonene av ,
og , slik du ville gjort det på et ark uten
hjelpemidler.
Forklar deretter med én setning hvorfor alltid er det svaret du bør gi
når du kan.
Vis at ved å oppgi
eksplisitte konstanter, og avgjør deretter om uttrykket også er og om
det er .
Et forslag til svar på et definisjonsspørsmål lyder
slik:
« betyr at det finnes en konstant og en slik at
for alle .»
a) Er dette definisjonen av ? 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 .
Begrepsbank
Begrepsbanken er flashcard- og repetisjonsstoff — den gjentar det du nettopp har
lest. Hopp trygt over ved førstegangslesing; tidsanslaget for kapitlet gjelder
kjernestoffet.
De fem symbolene oppfører seg som fem ulikhetstegn mellom vekstratene: svarer
til «mindre enn eller lik», til «større enn eller lik», til
«lik», til «strengt mindre enn» og til «strengt større enn».
Tabellen er en huskeregel for klassifisering, ikke en definisjon. På et
definisjonsspørsmål er det -og--formen som gir uttelling.
Ligger til venstre for i denne kjeden, er ; ligger den til
høyre, er ; ligger de på samme plass, er . Ved
er , og litt over en million.
Alle fem symbolene er transitive: er og , så er ,
og tilsvarende for , , og .
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.
klasser av «vokser like fort».
Praktisk konsekvens: inne i et asymptotisk uttrykk kan du bytte med ,
med og med uten at noe endres. og er
derimot ikke symmetriske — er sant, mens er galt.
hvis og bare hvis .
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.
Blant flere sanne asymptotiske påstander om samme funksjon er den strammeste den
som gir mest informasjon: foran , og foran .
Løsningsforslagene forventer det strammeste uttrykket.
er sant, men et svar som kaster bort informasjon — dette er felle #4, altså å
oppgi en løs grense der en strammere finnes.
Konstantfaktorer og alle ledd av lavere orden forsvinner i et asymptotisk
uttrykk: .
Begrunnelsen ligger i definisjonen: konstanten kan absorberes i og
, og leddene og blir små i forhold til når er stor
nok. Det er nettopp derfor asymptotisk analyse ikke avhenger av maskinen.
av hverandre: .
Av samme grunn er . En potens inne i en
logaritme blir en konstantfaktor utenfor — det er en fast liten felle i
klassifiseringsoppgaver.
Det er denne funksjonen de asymptotiske symbolene beskriver.
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 er ikke et fullstendig svar.
Kjøretiden avhenger ofte av hvilke data algoritmen får. Verste tilfelle er
den største kjøretiden over alle input av størrelse , beste tilfelle den
minste, og forventet tilfelle et gjennomsnitt over tilfeldige valg eller
tilfeldig input.
De tre er uavhengige av valget mellom , og . Insertion-Sort
har for eksempel i beste tilfelle og i verste — begge er
tette grenser, hver for sitt tilfelle.
Enhver potens med fast vokser strengt saktere enn :
for hver konstant . Og .
Tallene viser hvor brutalt skillet er. Ved er omtrent ,
mens er over fire milliarder. Det er dette skillet som gjør at et
eksponentielt program er ubrukelig lenge før et kubisk begynner å svette.
utelukket at den er ferdig på — påstanden er sann uansett.
Derfor krever et fullstendig kjøretidssvar der den tette grensen er
kjent. Bruk bevisst, når bare den øvre grensen er vist, og «forventet» der
kjøretiden er et gjennomsnitt over tilfeldige valg.
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.