Tilbake
7.1

7.1 P, NP og co-NP — sertifikat og verifikasjon

Klassene P, NP og co-NP, verifikasjonsalgoritme og sertifikat, og skillet avgjørelses- vs. optimeringsproblem.

50 min
8 oppgaver
co-NPsertifikatverifikasjon
Din fremgang i kapitlet
0 / 8 oppgaver

Forkunnskaper

Dette kapitlet bygger på fire ting du har møtt tidligere i boka:

- Asymptotisk notasjon fra kap. 1.1 og kap. 1.2. Du må kunne lese O(n3)O(n^3) og Θ(nlgn)\Theta(n\lg n) og vite at lgn\lg n betyr log2n\log_2 n.
- Grafer og grafnotasjonen G=(V,E)G=(V,E) fra kap. 4.1 — noder, kanter, nabolister og nabomatrise.
- Maks-flyt fra kap. 5.1 og kap. 5.2. Vi bruker Edmonds-Karp som eksempel på et problem vi kan løse raskt.
- Mengdelære — union, snitt og delmengde. Trenger du en oppfriskning, ligger den i Mengdelære.

Du trenger ingen forkunnskaper om reduksjoner, NP-komplette problemer eller SAT. Alt det kommer i kap. 7.2 og kap. 7.3, og bygger på nettopp det du leser her.

Notasjons- og pseudokodeliste

Å lage en løsning mot å kontrollere en (~10 min)

På en sengepost settes vaktlista for neste måned. Reglene er mange: ingen jobber to nattevakter på rad, hver vakt trenger minst én sykepleier med spesialkompetanse, og ingen skal over 160 timer. Å lage en slik liste fra bunnen kan ta en avdelingsleder flere dager. Å kontrollere en ferdig liste tar en halvtime: du går gjennom vaktene én etter én og krysser av mot reglene.

Denne forskjellen — vanskelig å lage, lett å kontrollere — er hele grunnlaget for kapitlet. Kompleksitetsteorien tar den intuisjonen og gjør den presis. Klassen PP handler om hva vi klarer å lage. Klassen NPNP handler om hva vi klarer å kontrollere.

Før vi kan definere klassene, må vi rydde i én ting: hva slags spørsmål de handler om.

Avgjørelsesproblem

Et problem der svaret alltid er ja eller nei — ingenting annet. «Finnes det en vaktliste som oppfyller alle reglene?» er et avgjørelsesproblem; «hvilken vaktliste er best?» er det ikke.

Hele kompleksitetsteorien er bygd på avgjørelsesproblemer, fordi et ja/nei-svar er lett å sammenligne på tvers av problemer. Når du ser PP og NPNP definert, er det alltid mengder av avgjørelsesproblemer.

En instans av problemet er én konkret input — den konkrete grafen, den konkrete tallmengden. Instansen kalles en ja-instans hvis svaret er ja, og en nei-instans hvis svaret er nei.

Optimeringsproblem

Et problem der du søker den beste løsningen etter et mål: den korteste ruta, det letteste spenntreet, den største flyten. Svaret er en løsning eller en verdi, ikke ja/nei.

De fleste problemene du har møtt i boka så langt er optimeringsproblemer: korteste vei, minimalt spenntre, maksimal flyt. Kompleksitetsteorien håndterer dem indirekte, gjennom avgjørelsesvarianten under.

Avgjørelsesvarianten av et optimeringsproblem

Du gjør et optimeringsproblem om til et avgjørelsesproblem ved å legge til en terskelverdi kk i inputen og spørre om målet kan nås:

- optimering: «hva er den korteste rundturen?»
- avgjørelse: «finnes det en rundtur med lengde høyst kk

Koblingen går begge veier og er poenget med grepet: er avgjørelsesvarianten vanskelig, er optimeringsvarianten minst like vanskelig. Kunne du regne ut den korteste rundturen raskt, ville du også kunne svare på terskelspørsmålet raskt — bare sammenlign svaret med kk. Derfor holder det å studere avgjørelsesvarianten.

✏️Eksempel 1: Fra optimering til avgjørelse

En budbil skal innom tre utleveringspunkter og tilbake til hovedlageret. Avstandene i kilometer er:

HovedlageretNordbakkenSjøkantenVestmarka
Hovedlageret9013070
Nordbakken9060150
Sjøkanten13060110
Vestmarka70150110

a) Skriv optimeringsproblemet «finn den korteste rundturen» om til et avgjørelsesproblem.
b) Er instansen med terskel k=350k = 350 en ja-instans? Er den med k=320k = 320 det?

a) Avgjørelsesvarianten: gitt avstandstabellen og et tall kk — finnes det en rundtur som besøker hvert punkt nøyaktig én gang, ender der den startet, og har samlet lengde høyst kk? Inputen er tabellen pluss terskelen kk; svaret er ja eller nei.

b) De tre distinkte rundturene har lengdene 330 km, 410 km og 480 km (de seks rekkefølgene faller sammen to og to, siden en rundtur og dens speilvending er like lange). Korteste rundtur er altså 330 km, via Hovedlageret – Nordbakken – Sjøkanten – Vestmarka – Hovedlageret.

- k=350k = 350: ja-instans, fordi 330350330 \le 350.
- k=320k = 320: nei-instans, fordi ingen rundtur er kortere enn 330 km.

Legg merke til hva svaret ikke er: oppgaven spør om ja eller nei, ikke om hvilken rute som er kortest. Ja/nei er hele svaret på et avgjørelsesproblem.

📝Oppgave 1
Eksamensnivå, sjanger D

Fem målestasjoner skal knyttes sammen med kabel. Kabelstrekkene som er mulige, har lengdene: 1–2: 4 km, 1–3: 7 km, 2–3: 3 km, 2–4: 9 km, 3–4: 5 km, 3–5: 8 km, 4–5: 6 km.

a) Skriv om optimeringsproblemet «finn det billigste nettet som knytter alle fem stasjonene sammen» til et avgjørelsesproblem.
b) Det minimale spenntreet har samlet lengde 18 km. Er instansen med terskel k=20k = 20 en ja-instans? Hva med k=17k = 17?

Klassen P — det vi klarer å regne ut (~8 min)

Nesten alle algoritmene i denne boka er raske i en helt bestemt forstand: kjøretiden er begrenset av inputstørrelsen opphøyd i en fast potens. Merge-Sort bruker Θ(nlgn)\Theta(n\lg n), MST-Kruskal bruker O(ElgV)O(E\lg V), Edmonds-Karp bruker O(VE2)O(VE^2). Alle tre vokser som et polynom i inputstørrelsen. Det er nettopp den egenskapen klassen PP fanger.

Polynomisk tid

En algoritme kjører i polynomisk tid hvis kjøretiden er O(nk)O(n^k) for en konstant kk som ikke avhenger av inputen. Her er nn størrelsen på inputen, altså hvor mange symboler den fyller — ikke hvor store tallene i den er.

nn, nlgnn\lg n, n2n^2 og n3n^3 er polynomiske. 2n2^n og n!n! er det ikke: der vokser kjøretiden raskere enn et hvilket som helst polynom. Forskjellen er ikke akademisk. For n=50n = 50 er n3=125000n^3 = 125\,000, mens 2n2^n er over 1,110151{,}1 \cdot 10^{15} — en faktor på mer enn ni milliarder.

Faggrensen mellom «håndterbart» og «ikke håndterbart» settes ved polynomisk tid. Det er en tommelfingerregel, ikke en naturlov: en algoritme på n100n^{100} er polynomisk og likevel ubrukelig. Men i praksis har de polynomiske algoritmene vi faktisk finner, små eksponenter, og skillet har vist seg å være det nyttigste vi har.

Klassen P

Mengden av alle avgjørelsesproblemer som kan løses av en algoritme i polynomisk tid. «Løses» betyr her at algoritmen selv finner ja/nei-svaret — den får ingen hjelp.

Alle grafalgoritmene i Del 4 og flytalgoritmene i Del 5 vitner om problemer i PP: «finnes det en vei fra s til t med lengde høyst kk?» ligger i PP fordi Dijkstra løser optimeringsvarianten i O(ElgV)O(E\lg V). Tilsvarende for spenntre og maksimal flyt.

PP er den klassen som svarer til det vi vil kalle en effektiv algoritme.

✏️Eksempel 2: Hvorfor tre kjente problemer ligger i P

Begrunn kort at hvert av disse avgjørelsesproblemene ligger i PP:

a) Finnes det et spenntre med samlet vekt høyst kk?
b) Finnes det en flyt fra s til t med verdi minst kk?
c) Er arrayet A[1..n] sortert stigende?

a) Ja. Kjør MST-Kruskal i O(ElgV)O(E\lg V), som gir det minimale spenntreets vekt, og sammenlign med kk. Er minimum høyst kk, er svaret ja; ellers nei. Sammenligningen er ett steg, så totalen er fortsatt O(ElgV)O(E\lg V) — polynomisk.

b) Ja. Kjør Edmonds-Karp i O(VE2)O(VE^2), som gir maksimal flytverdi, og sammenlign med kk. Edmonds-Karp velger alltid korteste forøkende sti, og det er nettopp derfor kjøretiden er polynomisk og ikke avhenger av kapasitetenes tallverdi.

c) Ja. Én gjennomgang som sammenligner A[i] med A[i+1] for i=1,,n1i = 1, \ldots, n-1 avgjør det i Θ(n)\Theta(n).

Fellesnevneren er formen på svaret: oppgi algoritmen, oppgi kjøretiden, og si at den er polynomisk. Det er hele begrunnelsen en slik oppgave ber om.

Sertifikat, verifikasjon og klassen NP (~15 min)

Tilbake til vaktlista. Den som skal kontrollere den, får to ting: reglene og bemanningsbehovet (selve problemet) og den ferdige lista (den foreslåtte løsningen). Kontrolløren trenger ikke gjenskape arbeidet — hun trenger bare å krysse av.

Kompleksitetsteorien gir de to tingene navn. Den første er instansen xx. Den andre er sertifikatet yy. Og den som krysser av, er en verifikasjonsalgoritme.

Sertifikat

Et sertifikat er den foreslåtte løsningen som følger med instansen når svaret skal kontrolleres — beviset for at svaret er ja.

For «finnes det en rundtur som besøker hver by én gang?» er sertifikatet selve rekkefølgen av byer. For «finnes det en delmengde med sum 45?» er sertifikatet delmengden. For vaktlista er sertifikatet den ferdige lista.

Sertifikatet må ha polynomisk lengde i inputstørrelsen. Uten det kravet ville definisjonen av NPNP vært tom for innhold: du kunne levert en tabell over alle mulige svar som «sertifikat», og kontrollen ville vært et oppslag. Det er kravet om kort sertifikat som gjør at kontrollen faktisk er billigere enn søket.

Merk at et sertifikat bare finnes for ja-instanser. Er svaret nei, er det ingenting å legge fram.

Verifikasjonsalgoritme

En algoritme A(x,y)A(x,y) som tar to argumenter — instansen xx og et sertifikat yy — og svarer 1 hvis yy beviser at xx er en ja-instans, ellers 0.

Algoritmen verifiserer problemet hvis det gjelder: xx er en ja-instans nøyaktig når det finnes minst ett sertifikat yy slik at A(x,y)=1A(x,y) = 1.

En verifikasjonsalgoritme løser ikke problemet. Den avgjør bare om et foreslått svar holder. Det er hele forskjellen mellom å planlegge vaktlista og å kontrollere den.

Klassen NP

Mengden av alle avgjørelsesproblemer der et ja-svar kan verifiseres i polynomisk tid, gitt et sertifikat av polynomisk lengde.

Les den setningen én gang til, og legg merke til hva som ikke står der. Det står ingenting om hvor lang tid det tar å finne løsningen. NPNP handler om kontroll, ikke om søk. Et problem kan ligge i NPNP og samtidig ha en lynrask løsningsalgoritme — sortering er et banalt eksempel.

Navnet forvirrer med vilje dårlig: N-en står ikke for «not». Den står for nondeterministisk, fra en eldre, likeverdig definisjon der en tenkt maskin gjetter sertifikatet og kontrollerer det. Utfallet er det samme; verifikasjonsformen er den du skal kunne skrive ned.

📜P er en delmengde av NP
PNPP \subseteq NP

Hvorfor: la et problem ligge i PP, med en algoritme som avgjør det i polynomisk tid. Lag en verifikasjonsalgoritme A(x,y)A(x,y) som rett og slett kaster sertifikatet og kjører løsningsalgoritmen på xx. Den svarer 1 nøyaktig for ja-instansene, og den bruker samme polynomiske tid som løsningsalgoritmen. Kravet om sertifikat er oppfylt av det tomme sertifikatet, som åpenbart har polynomisk lengde.

Altså: alt som kan løses raskt, kan verifiseres raskt. Motsatt vei er det store åpne spørsmålet — om alt som kan verifiseres raskt, også kan løses raskt. Det er nøyaktig spørsmålet «er P=NPP = NP?», og det er ubesvart.

📜Pseudokode-kontrakt: `Verify-Ham-Cycle`

En hamiltonsykel i en graf er en sykel som besøker hver node nøyaktig én gang og ender der den startet. Avgjørelsesproblemet «har GG en hamiltonsykel?» kalles HAM-CYCLE og får sin formelle definisjon i kap. 7.3. Her bruker vi det bare til å vise hvordan en verifikasjonsalgoritme ser ut.

1. Antagelser om representasjon. Grafen G=(V,E)G=(V,E) er urettet og gitt som nabomatrise, slik at «finnes kanten (u,v)(u,v)?» er ett oppslag i konstant tid. Sertifikatet y[1..V] er en sekvens av noder, indeksert fra 1.

2. Pre-/postbetingelse. Før: y er en vilkårlig nodesekvens — den kan være hva som helst, også søppel. Etter: returverdien er 1 nøyaktig når y er en hamiltonsykel i G, ellers 0. Grafen endres ikke.

3. Pseudokoden.

Verify-Ham-Cycle(G, y)
  Input:  graf G = (V, E) som nabomatrise; sekvens y[1..V] av noder
  Output: 1 hvis y er en hamiltonsykel i G, ellers 0
  if y.length != |V|
      return 0
  la sett[1..|V|] vaere en boolsk tabell med alle verdier FALSE
  for i = 1 to |V|
      if sett[y[i]] == TRUE
          return 0                  // node besoekt to ganger
      sett[y[i]] = TRUE
  for i = 1 to |V| - 1
      if (y[i], y[i+1]) not in E
          return 0                  // manglende kant i stien
  if (y[|V|], y[1]) not in E
      return 0                      // sykelen lukkes ikke
  return 1

4. Grunnideen i én setning. En nodesekvens er en hamiltonsykel nøyaktig når den inneholder hver node én gang og hvert nabopar i sekvensen — inkludert paret som lukker sykelen — er en kant.

5. Kjøretid. Den første løkka gjør V|V| oppslag i en boolsk tabell, den andre gjør V|V| oppslag i nabomatrisen, alle i konstant tid, så kontrollen er Θ(V)\Theta(V) — polynomisk i inputstørrelsen. Til sammenligning ville et uttømmende søk måtte prøve (V1)!(|V|-1)! sekvenser.

✏️Eksempel 3: Sertifikat og verifikasjon i praksis
Et vedlikeholdsnett har seks stasjoner nummerert 1–6, og disse ni forbindelsene:

{1,2}, {1,3}, {1,6}, {2,3}, {2,4}, {3,5}, {4,5}, {4,6}, {5,6}\{1,2\},\ \{1,3\},\ \{1,6\},\ \{2,3\},\ \{2,4\},\ \{3,5\},\ \{4,5\},\ \{4,6\},\ \{5,6\}

En inspektør skal kjøre en runde som innom hver stasjon nøyaktig én gang og ender der hun startet.

a) Oppgi et sertifikat for at en slik runde finnes, og vis at Verify-Ham-Cycle godtar det.
b) En kollega foreslår runden 1–2–3–4–5–6–1. Hva svarer verifikatoren, og hvorfor?
c) Hva ville et uttømmende søk kostet på samme instans?

a) Sertifikatet er sekvensen y=(1,2,3,5,4,6)y = (1, 2, 3, 5, 4, 6).

Verifikatoren kontrollerer først at alle seks stasjonene forekommer nøyaktig én gang — det gjør de. Deretter slår den opp de seks nabo-parene: {1,2}\{1,2\}, {2,3}\{2,3\}, {3,5}\{3,5\}, {5,4}\{5,4\}, {4,6}\{4,6\} og til slutt {6,1}\{6,1\} som lukker sykelen. Alle seks står i kantlista, så den returnerer 1. Til sammen 6 distinkthetssjekker og 6 kantoppslag: 12 konstanttidsoperasjoner.

b) Verifikatoren returnerer 0. Kontrollen av nabo-parene stopper på {3,4}\{3,4\}, som ikke er en forbindelse i nettet. At de fem andre parene er kanter, hjelper ikke — ett brudd er nok.

c) Et uttømmende søk ville måttet prøve alle rekkefølger av de fem øvrige stasjonene etter stasjon 1, altså 5!=1205! = 120 sekvenser. Med 20 stasjoner ville tallet vært 19!19!, som er over 101710^{17}. Det er nettopp dette gapet klassen NPNP setter ord på: kontrollen er lineær, søket er eksponentielt.

📝Oppgave 2
Eksamensnivå, sjanger D
a) Hva er et sertifikat?
b) Hva vil det si at et problem ligger i NPNP?
📝Oppgave 3
Eksamensnivå, sjanger D

Tallene 7, 11, 15, 23 og 31 er gitt, sammen med målet 45. Spørsmålet er om noen delmengde av tallene summerer nøyaktig til målet.

a) Oppgi et sertifikat for at 45 er en ja-instans.
b) Beskriv verifikasjonsalgoritmen og oppgi kjøretiden dens.
c) Er 44 en ja-instans? Begrunn.

📝Oppgave 4
Eksamensnivå, sjanger F
a) «Et problem i NPNP kan ikke løses i polynomisk tid.»
b) «Sortering av nn tall ligger i NPNP
c) «Hvis et problem ligger i PP, ligger det også i NPNP

co-NP og det åpne spørsmålet (~10 min)

Sertifikatet i forrige avsnitt beviste alltid et ja. Inspektøren la fram en runde, og verifikatoren sa «denne holder». Men hva med nei-svaret? Hvordan beviser du kort at det ikke finnes noen slik runde?

Det er ikke opplagt at det går an. Å legge fram alle rundene som ikke virker, er ikke et kort bevis. Denne asymmetrien har fått sitt eget navn.

Komplementproblem

Komplementet til et avgjørelsesproblem er det samme spørsmålet med ja og nei byttet om. Komplementet til «har grafen en hamiltonsykel?» er «har grafen ingen hamiltonsykel?».

Instansene er de samme; det er svarene som snus. En ja-instans i det opprinnelige problemet er en nei-instans i komplementet, og omvendt.

Klassen co-NP

Mengden av avgjørelsesproblemer der komplementet ligger i NPNP — altså der nei-svaret kan verifiseres i polynomisk tid med et sertifikat.

Et eksempel: «er dette logiske uttrykket sant for alle mulige tilordninger av sannhetsverdier?» ligger i co-NP\text{co-}NP. Er svaret nei, kan du bevise det kort ved å legge fram én tilordning som gjør uttrykket usant — den tilordningen er sertifikatet for nei-svaret.

NPNP og co-NP\text{co-}NP er ikke det samme som «NPNP og alt utenfor NPNP». De er to klasser som overlapper: alt i PP ligger i begge. Om NP=co-NPNP = \text{co-}NP, er et åpent spørsmål, akkurat som P=NPP = NP.

Intuisjon: de to klassene måler hvor lett det er å bevise hvert av de to svarene. I NPNP er ja-et lett å bevise. I co-NP\text{co-}NP er nei-et lett å bevise. Ligger et problem i begge, har du korte bevis uansett hva svaret blir.

Alt i PP ligger i begge, og begrunnelsen er den samme som for PNPP \subseteq NP: kan du regne ut svaret raskt, trenger du ikke noe sertifikat i noen retning. Det gir

PNPco-NPP \subseteq NP \cap \text{co-}NP

Utover dette er kartet uferdig. Vi vet ikke om P=NPP = NP. Vi vet ikke om NP=co-NPNP = \text{co-}NP. Én sammenheng er derimot lett å se: hvis P=NPP = NP, så er NP=co-NPNP = \text{co-}NP. Grunnen er at PP er lukket under komplement — snu bare svaret fra løsningsalgoritmen — så en likhet mellom PP og NPNP ville dratt begge klassene sammen.

Dette er ikke pynt. På eksamen kommer det som ja/nei-utsagn av typen «det er bevist at PNPP \ne NP» (nei) eller «PP ligger i co-NP\text{co-}NP» (ja).

✏️Eksempel 4: Fem utsagn om klassene

(Eksamensnivå.) Avgjør for hvert utsagn om det er sant eller usant, og begrunn med én setning.

a) PNPP \subseteq NP.
b) Det er bevist at PNPP \ne NP.
c) Et problem i NPNP har alltid et kort bevis for nei-svaret.
d) Hvis et problem ligger i PP, ligger komplementet også i PP.
e) Klassen NPNP inneholder bare problemer som er vanskelige å løse.

a) Sant. En verifikator kan kaste sertifikatet og kjøre den polynomiske løsningsalgoritmen.

b) Usant. Spørsmålet er åpent. Vi vet bare at PNPP \subseteq NP.

c) Usant. NPNP garanterer et kort bevis for ja-svaret. Korte bevis for nei-svaret er det co-NP\text{co-}NP handler om, og om de to klassene er like, er ukjent.

d) Sant. Kjør løsningsalgoritmen og snu svaret; det koster ett ekstra steg, så kjøretiden er fortsatt polynomisk.

e) Usant. PP ligger inne i NPNP, så alle de raskt løsbare problemene — sortering, korteste vei, maksimal flyt — ligger også i NPNP.

Formen er verdt å legge merke til: sant/usant først, deretter én setning. Ingen av delsvarene trenger mer.

📝Oppgave 5
Eksamensnivå, sjanger D

Betrakt problemet «har grafen GG en hamiltonsykel?».

a) Formulér komplementproblemet.
b) Forklar hvorfor et sertifikat for det opprinnelige problemet er lett å oppgi, mens det ikke er opplagt hva et sertifikat for komplementet skulle være.

📝Oppgave 6
Eksamensnivå, sjanger F

«Alle problemer i PP ligger både i NPNP og i co-NP\text{co-}NP

📝Oppgave 7
Eksamensnivå, sjanger D

Definisjonen av NPNP krever at sertifikatet har polynomisk lengde i inputstørrelsen.

a) Forklar hvorfor kravet er nødvendig.
b) Beskriv hva som ville skjedd med definisjonen uten det.

Abstrakte og konkrete problemer (~5 min)

Dette avsnittet er kjenne til-stoff: det er randstoff i faget, og det er nok at du kjenner igjen ordene hvis de dukker opp i en oppgavetekst. Har du kort tid, hopp videre til begrepsbanken.

Så langt har vi snakket om «problemer» uten å si hva et problem er matematisk. Den presise varianten går slik. Et abstrakt problem er en tilordning fra instanser til svar — for et avgjørelsesproblem: fra hver instans til ja eller nei. Men en algoritme leser ikke abstrakte objekter; den leser en bitstreng. Derfor kodes instansen som en streng av symboler, og resultatet kalles et konkret problem. Da blir et avgjørelsesproblem det samme som mengden av alle strenger som koder en ja-instans, og en slik mengde kalles et formelt språk.

Det er derfor du kan se PP og NPNP definert som mengder av språk, og skrivemåten LNPL \in NP i stedet for «problemet ligger i NPNP». Det er samme sak i annen drakt.

Hvorfor det er verdt fem minutter: kodingen er ikke uskyldig. Størrelsen nn er antall symboler i den kodede instansen, og et tall som skrives binært fyller langt færre symboler enn det samme tallet skrevet som en lang strek av ettall. Den forskjellen ser harmløs ut nå, men den er selve grunnen til at 0-1-ryggsekk kalles pseudopolynomisk i kap. 7.2.

📝Oppgave 8
Eksamensnivå, sjanger F
a) «Klassen NPNP er definert som problemene som ikke kan løses i polynomisk tid.»
b) «Et sertifikat for at grafen har en hamiltonsykel, er selve nodesekvensen.»
c) «Optimeringsproblemet ‘finn den korteste rundturen’ er et avgjørelsesproblem.»
d) «Størrelsen nn i uttrykket O(nk)O(n^k) er antall objekter i inputen.»

Oppslagstabell: problemer vi vet ligger i P (~2 min)

Alle radene under er avgjørelsesvarianter av problemer du har møtt tidligere i boka. De ligger i PP fordi vi har en polynomisk algoritme som avgjør dem — og de ligger dermed også i NPNP.

Problem (avgjørelsesvariant)Algoritme som avgjør detKjøretidKrav/egenskap
Finnes en vei fra s til t?BFSΘ(V+E)\Theta(V+E)ingen
Finnes en vei fra s til t med vekt høyst kk?DijkstraO(ElgV)O(E\lg V)krever ikke-negative kantvekter
Samme, med negative kanter tillattBellman-FordΘ(VE)\Theta(VE)oppdager negative sykler
Finnes et spenntre med vekt høyst kk?MST-KruskalO(ElgV)O(E\lg V)grafen må være sammenhengende
Finnes en flyt med verdi minst kk?Edmonds-KarpO(VE2)O(VE^2)krever korteste forøkende sti
Er A[1..n] sortert stigende?én gjennomgangΘ(n)\Theta(n)ingen
Kan A[1..n] sorteres på Θ(nlgn)\Theta(n\lg n)?Merge-SortΘ(nlgn)\Theta(n\lg n)ikke på stedet, stabil

Poenget med tabellen er kontrasten som kommer: HAM-CYCLE, som du så i dette kapitlet, har ingen slik rad. Vi kan verifisere svaret i Θ(V)\Theta(V), men vi kjenner ingen polynomisk algoritme som finner det. Hvorfor det er slik — og hva vi likevel kan bevise — er kap. 7.2 og kap. 7.3.

Begrepsbank (~5 min)

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

Instans

Én konkret input til et problem: den bestemte grafen, den bestemte tallmengden, den bestemte avstandstabellen sammen med terskelen.

Problemet er regelen; instansen er tilfellet. Når vi skriver xx i definisjonene av NPNP, er xx en instans.

Ja-instans og nei-instans

En instans der svaret på avgjørelsesproblemet er ja, kalles en ja-instans; er svaret nei, er det en nei-instans.

Skillet er verktøyet du bruker når du skal vise at en transformasjon mellom to problemer er riktig: den må sende ja-instanser til ja-instanser og nei-instanser til nei-instanser. Den egenskapen heter svarbevarende og er selve kjernen i kap. 7.2.

Inputstørrelse

Antall symboler den kodede inputen fyller — ikke antall objekter i den.

For en graf gitt som nabomatrise er inputstørrelsen omtrent V2|V|^2 bits. For en liste med nn tall er den summen av tallenes bitlengder: tallet mm fyller lgm+1\lfloor \lg m \rfloor + 1 bits. Skillet virker pedantisk til du møter et problem der kjøretiden avhenger av en tallverdi i inputen framfor av antall symboler — da bestemmer det alt.

Uttømmende søk

Å prøve alle kandidatløsninger etter tur og se om noen holder. Kalles også brute force.

Uttømmende søk løser nesten alle problemene i dette kapitlet — bare altfor sakte. For hamiltonsykel i en graf med V|V| noder er det (V1)!(|V|-1)! sekvenser; for en delmengde av nn tall er det 2n2^n delmengder. Med 5 tall er 2n=322^n = 32, med 50 tall er det over 101510^{15}.

Superpolynomisk kjøretid

En kjøretid som vokser raskere enn ethvert polynom: 2n2^n, n!n!, nlgnn^{\lg n}.

Kontrasten til O(nk)O(n^k) er skarpere enn tallene antyder. For n=50n = 50 er n3=125000n^3 = 125\,000, mens 2n2^n overstiger 1,110151{,}1 \cdot 10^{15} — over ni milliarder ganger større. Det er derfor grensen mellom håndterbart og ikke settes ved polynomisk tid.

Bokstavene i NP
NPNP står for nondeterministisk polynomisk tid, ikke for «ikke polynomisk».

Den eldre definisjonen tenker seg en maskin som gjetter et sertifikat og deretter kontrollerer det i polynomisk tid. Den er likeverdig med verifikasjonsdefinisjonen, og verifikasjonsformen er den du skal kunne skrive ned. Feillesningen «N for not» er direkte årsak til den vanligste feilen på eksamen.

Abstrakt problem

En tilordning fra instanser til svar, uten noen antagelse om hvordan instansen skrives ned. For et avgjørelsesproblem: fra hver instans til ja eller nei.

Nyttig å kjenne til, men randstoff i dette faget.

Konkret problem og formelt språk

Et konkret problem er et abstrakt problem der instansene er kodet som strenger av symboler — det en algoritme faktisk kan lese.

Da blir et avgjørelsesproblem det samme som mengden av alle strenger som koder en ja-instans, og en slik mengde kalles et formelt språk, gjerne skrevet LL. Det er derfor du kan se PP og NPNP definert som mengder av språk og skrivemåten LNPL \in NP. Randstoff, men verdt å kjenne igjen.

P = NP-spørsmålet

Det åpne spørsmålet om alt som kan verifiseres raskt, også kan løses raskt.

Status i dag: PNPP \subseteq NP er bevist og enkelt. Om inklusjonen er streng — altså om det finnes et problem i NPNP som ikke er i PP — vet ingen. Skriv aldri at PNPP \ne NP er bevist, og skriv aldri at P=NPP = NP er bevist. Det eneste riktige svaret er at spørsmålet er åpent.

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.