TDT4120 Algoritmer og datastrukturer Interaktivt kompendium · H2026
Fremgang
0/15

02b

Problemer og reduksjoner

Kjernepensum

«Du skal velge ut flest mulig blant nn personer slik at alle kjenner minst kk av de andre.» Det var en eksamensoppgave i august 2010. En oppgave fra august 2011 byttet ut ett ord: velg ut færrest mulig. Den første har en enkel, effektiv løsning. Den andre er, så vidt noen vet, ikke mulig å løse effektivt i det hele tatt. Ordlyden røper ikke forskjellen. Den blir synlig når du vet hva et problem er, hvilke typer problemer som finnes og hvordan du sammenligner vanskegrad med en reduksjon, som oversetter ett problem til et annet.

Hva et problem er

Et spesifikt problem er en beskrivelse av akseptable løsninger for én bestemt input, som å sortere ⟨5,2,4,6,1,3⟩\langle 5, 2, 4, 6, 1, 3 \rangle. Et generelt problem er en familie av spesifikke problemer, og det er et slikt problem ordet vanligvis betyr. Hvert medlem av familien er en instans.

Formelt er et problem en binær relasjon R⊆I×OR \subseteq I \times O mellom en mengde inputs II og en mengde outputs OO: RR angir hvilke outputs som er riktige svar på hvilke inputs. Én instans kan ha mange riktige svar, og noen instanser har ingen, og de kan regnes som ugyldige. Skal input og output være helt konkrete, kodes de som bitstrenger, altså R⊆{0,1}∗×{0,1}∗R \subseteq \{0,1\}^* \times \{0,1\}^*.

To kolonner med punkter, inputs I til venstre og outputs O til høyre. Grønnblå streker kobler input x1 til to outputs og x2 til ett, og ett av parene er merket som medlem av R. Input x3 er nedtonet og har ingen strek, med merknaden ingen akseptable svar.
Figur 1. Et problem som relasjon: strekene er parene i RR. Instansen x1x_1 har to riktige svar, x2x_2 har ett, og x3x_3 har ingen.

Verifisering er ofte langt billigere enn søk. Å sjekke at en foreslått permutasjon π\pi sorterer tabellen AA er én gjennomgang: sammenlign A[π[i]]A[\pi[i]] med A[π[i+1]]A[\pi[i+1]] for hver ii. Det tar lineær tid. Å finne π\pi krever derimot Ω(nlg⁡n)\Omega(n \lg n) sammenligninger i verste fall. Den foreslåtte løsningen som verifiseres, kalles et sertifikat.

Klikkproblemet CLIQUE viser alle variantene på én gang. En instans er en urettet graf GG og et positivt heltall kk; en akseptabel løsning er en komplett delgraf med kk noder, en klikk.

Søkeproblem

Finn en klikk med kk noder i GG. Søket feiler hvis ingen finnes.

Beslutningsproblem

Har GG en klikk med kk noder? Svaret er ja eller nei, og et nei tilsvarer at søket feiler.

Optimeringsproblem

Finn en størst mulig klikk i GG. Beslutningsvarianten spør om optimum er minst kk.

Verifiseringen er enkel i søke- og beslutningsvarianten: gitt et sertifikat HH, sjekk at HH består av kk noder fra GG og at alle par er naboer. Å finne en klikk virker derimot svært vanskelig, og det er et åpent spørsmål om å finne en klikk egentlig er vanskeligere enn å verifisere en. I optimeringsvarianten kan du sjekke at HH er en klikk på samme måte, men ikke at ingen større klikk finnes.

Reduksjoner

Oppgaven er å avgjøre om alle elementene i en tabell er forskjellige. I stedet for å løse den direkte kan du omforme problemet:

def unique(A, n):
    insertion_sort(A, n)
    for i in range(n - 1):
        if A[i] == A[i + 1]:
            return False
    return True

Etter sorteringen står like verdier ved siden av hverandre, så det holder å sjekke naboene. Unikhet er da løst med én sortering og én lineær gjennomgang. Slik kan du tenke helt generelt: gjør noe arbeid som omformer instansen, og overlat resten til en subrutine du later som du har. En slik hypotetisk subrutine kalles et orakel, og konstruksjonen er en reduksjon fra det ene problemet til det andre, her fra unikhet til sortering. Reduksjonene deles inn etter hvor mye de får lov til å gjøre:

Cook

Turing-reduksjon i polynomisk tid: løs XX med vilkårlig eget arbeid og så mange orakelkall for YY du vil. Dette er den minst restriktive formen.

Levin

Omform instansen, gjør ett orakelkall, og oversett løsningen tilbake til en løsning for XX.

Karp

For beslutningsproblemer: omform instansen og gjør ett orakelkall. Ja/nei-svaret går uendret gjennom.

Hver type er et spesialtilfelle av den forrige. En Karp-reduksjon er en Levin-reduksjon der oversettelsen tilbake er triviell, og en Levin-reduksjon er en Cook-reduksjon med nøyaktig ett kall.

unique er en Levin-reduksjon. Den kaller sorteringen én gang, og nabosjekken oversetter den sorterte tabellen til ja eller nei. Den er ingen Karp-reduksjon, for oraklet svarer med en tabell og ikke med ja eller nei. Skal du derimot finne en klikk med kk noder med et orakel for beslutningsvarianten, trenger du mange kall. Fjern én node om gangen, og spør om grafen fortsatt har en klikk med kk noder. Er svaret nei, legger du noden tilbake. Hadde grafen en klikk med kk noder fra starten, har de gjenværende nodene etter nn kall fortsatt en. Hver gjenværende node er med i hver klikk med kk noder blant dem, for uten noden fantes ingen, så de gjenværende nodene er selve klikken. Det er en Cook-reduksjon.

Vanskegrad

Reduksjoner er mer enn gjenbruk av kode; de sammenligner problemer. Å åpne en skattekiste kan reduseres til å dirke opp låsen: får du opp låsen, får du opp kista. Er låsen rusten og lett å dirke, er kista lett å åpne. Kista kan også være lett å åpne selv med en solid lås, hvis hengslene sitter løst og gir en annen vei inn. Det eneste umulige er at kista er vanskeligere enn låsen, for gjennom låsen går det alltid én vei inn.

Prinsippet virker begge veier. Reduserer du til noe du vet er lett, har du funnet en algoritme. Reduserer du fra noe du vet er vanskelig, har du vist at målet er minst like vanskelig.

Regneeksempel Flest mulig og færrest mulig

Velg ut flest mulig blant nn personer slik at alle i utvalget kjenner minst kk av de andre i utvalget. Deretter: velg ut færrest mulig, men minst én, med samme krav. Hvorfor er den første oppgaven lett og den andre vanskelig?

Vis løsning Skjul løsning

Flest mulig: stryk en person som kjenner færre enn kk av de gjenværende, og gjenta til ingen flere kan strykes. Én stryking kan gjøre at en nabo kjenner færre enn kk av de gjenværende, så du teller på nytt etter hver stryking. Ingen gyldig gruppe mister noe medlem på veien: så lenge hele gruppa står, kjenner hvert medlem minst kk innenfor gruppa, og dermed minst kk blant de gjenværende, så ingen av dem strykes først. Når ingen flere kan strykes, kjenner alle som står igjen minst kk av de gjenværende, så de gjenværende er selv en gyldig gruppe. De er altså en gyldig gruppe som inneholder alle andre gyldige grupper, og dermed den største. Det strykes høyst nn personer, og hver stryking finnes ved å telle bekjentskaper blant de gjenværende, så hele prosessen er polynomisk.

Færrest mulig: alle i gruppa skal kjenne minst kk andre i gruppa, så gruppa må ha minst k+1k + 1 personer. En gruppe på k+1k + 1 personer er gyldig nøyaktig når alle kjenner alle, ettersom hver av dem må kjenne de kk andre og gruppa ikke har flere. Svaret er altså k+1k + 1 hvis og bare hvis bekjentskapsgrafen har en klikk med k+1k + 1 noder, så en algoritme for færrest-varianten avgjør CLIQUE. Klikkproblemet er redusert til færrest-varianten, så den er minst like vanskelig.

Svar
Flest-varianten løses i polynomisk tid ved stryking. Færrest-varianten er minst like vanskelig som CLIQUE.
Flest mulig ved stryking
0 / 0

Bekjentskapsgrafen med kravet k=2k = 2. Oransje er en person som kjenner færre enn to av de gjenværende, stiplet grått er strøket, og grønt er gruppa som står igjen.

Eksamensoppgave Hvilken vei reduserer du?
Ordinær eksamen, desember 2025, oppgave 9

Du studerer et problem PP, og vil sammenligne det med et annet, kjent problem QQ ved å finne en effektiv reduksjon. Hvilken vei vil du redusere for å vise hva? Forklar kort.

Vis løsning Skjul løsning

Det kommer an på hva du vet om QQ. Er QQ vanskelig, reduserer du fra QQ til PP: da kan enhver instans av QQ løses ved hjelp av PP, så PP er minst like vanskelig. Er QQ lett, reduserer du fra PP til QQ: da har du en algoritme for PP som går veien om QQ, så PP er også lett.

Svar
Fra QQ til PP for å vise at PP er vanskelig, fra PP til QQ for å vise at PP er lett.

Dekomponering

Reduksjonen fra unikhet til sortering oversetter mellom to forskjellige problemer. Like ofte reduserer du et problem til mindre instanser av seg selv: du dekomponerer. Insertion-Sort er den enkleste bruken, det læreboka kaller den inkrementelle metoden. Dekomponer ved å kutte av det siste elementet, og anta at resten kan sorteres. Kombiner ved å sette det siste elementet inn på rett plass i den sorterte resten. Dekomponeringen er nesten gratis, så alt arbeidet ligger i kombinasjonen. Speilbildet er sortering ved utvelgelse, selection sort: ta ut det største elementet, sorter resten og legg det største bakerst. Da ligger arbeidet i dekomponeringen, og kombinasjonen er triviell. Rikere dekomponeringer, som å dele instansen i to halvdeler, er grunnlaget for splitt og hersk.

En rekursiv prosedyre dekomponerer på samme måte, for den bruker seg selv som orakel på mindre delinstanser. Beviset for at den gir riktige svar, er et induksjonsbevis over delinstansene. Grunntilfellet er instansene som løses direkte, uten dekomponering. For Insertion-Sort er grunntilfellet en tabell med ett element, som allerede er sortert. Induksjonshypotesen er antagelsen om at delinstansene kan løses, her at resten av tabellen kan sorteres. Induksjonssteget viser at kombinasjonen av riktige delsvar gir et riktig svar for hele instansen: settes det siste elementet inn på rett plass i en sortert rest, er hele tabellen sortert. Og dekomponeringen må krympe instansen, slik at rekursjonen ender i grunntilfellet. Hvert kutt i Insertion-Sort fjerner ett element.

Fire bokser i en firkant: instans øverst til venstre, svar øverst til høyre, delinstans og delsvar nederst. En stiplet grå pil fra instans til svar er merket løsning. En heltrukken pil ned fra instans til delinstans er merket dekomponer, en stiplet pil fra delinstans til delsvar er merket antatt delløsning, induksjonshypotesen, og en heltrukken pil opp fra delsvar til svar er merket kombiner.
Figur 2. Én runde i dekomponeringen: dekomponer instansen, anta at delinstansen kan løses (stiplet), og kombiner delsvaret til et svar. Det samme skjer på hvert nivå nedover, helt til grunntilfellet.

Er grunntilfellet riktig, og bevarer hvert trinn riktigheten, forplanter riktigheten seg oppover nivåene. En løkkeinvariant er det samme beviset sett fra en løkke: initialisering er grunntilfellet, og vedlikehold er induksjonssteget.

Sjekk deg selv

Du vil avgjøre om grafen GG har en klikk med kk noder, og har et orakel som finner en størst mulig klikk. Du kaller oraklet én gang på GG og svarer ja hvis klikken det gir, har minst kk noder. Hvilken reduksjonstype er den strammeste beskrivelsen?
Oppdatert 27. september 2026 Foreslå endring