Tilbake
8.2

8.2 DRILL — Åpen algoritmedesign via reduksjon

Den tverrgående designdrillen (sjanger H): gjenkjenn det klassiske problemet i en innpakning og reduser til det — maks-flyt, DP, Gale-Shapley, BFS.

90 min
10 oppgaver
DRILLÅpen algoritmedesign via reduksjon
Din fremgang i kapitlet
0 / 10 oppgaver

Forkunnskaper

Dette kapitlet bruker hele boka, men to oppskrifter må ligge klare i hånden.
De står ferdig oppfrisket her:

Flytmodellen fra kap. 5.3. Fire lag: kilde ss, ett
nodesett for det som skal tildeles, ett for det de tildeles til, og sluk tt.
Kapasiteten fra ss til en venstre node er hvor mange den kan ta;
kapasiteten fra en høyre node til tt er hvor mange den har plass til. En
kant i midten betyr at nettopp den tildelingen er tillatt — ikke en grense.
Kjør Edmonds-Karp, O(VE2)O(VE^2). Tildelingen leses av som de midtkantene som
bærer flyt, og heltallsteoremet garanterer at flyten kan velges heltallig,
slik at avlesningen er entydig.

DP-oppskriften fra kap. 6.3. Seks steg: gjenkjenn
mønsteret, definér delproblemet med ord, skriv rekurrensen med
grunntilfeller, oppgi fylleorden, rekonstruér fra lagrede valg, oppgi
kjøretiden som antall delproblemer ganger arbeid per delproblem. De tre
grunnformene:

r[j]=max1ij(pi+r[ji])(oppdeling)r[j] = \max_{1 \le i \le j}\big(p_i + r[j-i]\big) \qquad\text{(oppdeling)}

c[i,j]={c[i1,j1]+1xi=yjmax(c[i1,j],  c[i,j1])ellers(to sekvenser)c[i,j] = \begin{cases} c[i-1,j-1]+1 & x_i = y_j \\ \max(c[i-1,j],\; c[i,j-1]) & \text{ellers}\end{cases} \qquad\text{(to sekvenser)}

c[i,w]=max(c[i1,w],  vi+c[i1,wwi])(velg eller ikke)c[i,w] = \max\big(c[i-1,w],\; v_i + c[i-1,\,w-w_i]\big) \qquad\text{(velg eller ikke)}

Øvrige forkunnskaper:

- kap. 4.1BFS gir færrest kanter, ikke minst
vekt, i Θ(V+E)\Theta(V+E).
- kap. 4.3Dijkstra O(ElgV)O(E\lg V) krever ikke-negative
vekter; Bellman-Ford Θ(VE)\Theta(VE) tåler negative.
- kap. 6.5Gale-Shapley O(n2)O(n^2), frier-optimal,
begge orienteringer rammer inn hva som er mulig.
- kap. 7.2 — reduksjonsretningen, når oppgaven ber deg
argumentere for at et problem er vanskelig i stedet for å løse det.

Notasjons- og pseudokodeliste
📜Løsningsoppskriften og mønsterkatalogen
Steg 1 — les oppgaven én gang, og let etter mønsteret, ikke etter
detaljene.
Innpakningen er alltid ny; strukturen er alltid en av en håndfull.

Innpakningen sierParadigmetKjøretid
«fordel A på B, med grenser for hvor mange hver kan ta»maks-flyt, firelagsnettO(VE2)O(VE^2)
«hvor mange kan tildeles samtidig»maksimal matching = maks-flyt, alle kapasiteter 1O(VE2)O(VE^2)
«billigste barriere som gjør det umulig å komme fra X til Y»min-snitt, lest av etter maks-flytO(VE2)O(VE^2)
«del opp i biter, hver bit har en verdi eller kostnad»DP, oppdelingsformentypisk Θ(n2)\Theta(n^2)
«finn den lengste felles / mest like sekvensen»DP, LCS-formenΘ(nm)\Theta(nm)
«velg eller ikke velg, med en samlet grense»DP, ryggsekkformenΘ(nW)\Theta(nW), pseudopolynomisk
«færrest ledd / korteste kjede / minst antall steg»BFSΘ(V+E)\Theta(V+E)
«korteste vei etter vekt, ikke-negative vekter»DijkstraO(ElgV)O(E\lg V)
«korteste vei i en syklusfri graf, eller med negative vekter»DAG-Shortest-Path eller Bellman-FordΘ(V+E)\Theta(V+E) / Θ(VE)\Theta(VE)
«stabil parvis tilordning der begge sider har preferanser»Gale-ShapleyO(n2)O(n^2)
«billigste nett som henger sammen, uten ringer»MST, Kruskal eller PrimO(ElgV)O(E\lg V)
«vis at problemet er vanskelig»reduksjon, FRA kjent vanskelig TIL ditt

Steg 2 — skriv de to første leddene som to setninger. «Dette er et
tilordningsproblem med kapasiteter. Det løses med maks-flyt.» De to setningene
er billige, og de gir uttelling.
Steg 3 — bygg konstruksjonen presist. For flyt: hvilke noder, hvilke
kanter, hvilke kapasiteter, og hva hver kapasitet koder. For DP:
delproblemet med ord, rekurrensen, grunntilfellene, fylleorden.
Steg 4 — rekonstruér selve løsningen. Hvilke midtkanter bærer flyt? Hvilke
valg står i valgtabellen? Skriv den ene setningen: avlesningen koster O(E)O(E)
og øker ikke den asymptotiske kjøretiden.
Ved flyt: nevn
heltallsteoremet.
Steg 5 — oppgi kjøretiden i problemets egne størrelser. «O(VE2)O(VE^2) med
V=n+m+2V = n + m + 2 og E=O(n+m+k)E = O(n + m + k)» er et helt svar; «O(VE2)O(VE^2)» alene er et
halvt.

Steg 6 — stopp. Fem til ti linjer. Lange svar teller ikke positivt, og de
nitten andre oppgavene venter.
Kontrollen før du leverer: tell leddene. Fem?

✏️Eksempel 1: Gjennomkjørt eksamenscase med margnotater

En kommune skal fordele nn hjemmehjelpere på mm besøksruter i løpet av en
uke. Hver hjelper har oppgitt hvilke ruter hun har sertifisering for, og kan ta
høyst tre ruter. Hver rute må dekkes av nøyaktig én hjelper.

a) Beskriv en algoritme som avgjør om alle rutene kan dekkes, og som finner
en konkret fordeling.
b) Kommunen vurderer å kreve at hver hjelper tar minst én rute. Endrer
det noe?

a)

Ledd 1 — det klassiske problemet. Ruter skal fordeles på hjelpere, hver part
har en øvre grense, og bare visse par er tillatt. Dette er et
tilordningsproblem med kapasiteter.

Margnotat. Denne setningen alene er verdt et ledd. Den som skriver «jeg lager
et flytnett» uten å si hvilket problem det er, mister det.

Ledd 2 — paradigmet. Maksimal flyt i et firelagsnett.

Ledd 3 — konstruksjonen.

- Kilde ss og sluk tt.
- Én node per hjelper, med kant shjelpers \to \text{hjelper} og kapasitet 3
denne kapasiteten koder «høyst tre ruter hver».
- Én node per rute, med kant rutet\text{rute} \to t og kapasitet 1 — denne
koder «nøyaktig én hjelper per rute».
- Kant hjelperrute\text{hjelper} \to \text{rute} med kapasitet 1 for hvert par der
hjelperen er sertifisert. At kanten finnes, koder at tildelingen er
tillatt.

Kjør Edmonds-Karp. Alle rutene kan dekkes hvis og bare hvis maksimal flyt er
mm.

Margnotat. Legg merke til at de tre kapasitetene koder tre forskjellige ting.
Å sette 3-eren på midtkantene i stedet for på kildekanten er den vanligste
modelleringsfeilen, og den gir et nett som tillater tre enheter til samme
rute.

Ledd 4 — rekonstruksjonen. Midtkantene som bærer flyt 1, er
fordelingen: hjelper ii tar rute jj. Heltallsteoremet garanterer at en
maksimal flyt kan velges heltallig når alle kapasitetene er heltall, så hver
midtkant bærer 0 eller 1 og avlesningen er entydig. Den koster O(E)O(E) og
øker ikke den asymptotiske kjøretiden.

Margnotat. Dette leddet er det som skiller topp fra midtsjikt. Oppgaven ba om
en fordeling, ikke om et ja eller nei — og et svar som stopper ved
flytverdien, er felle #6.

Ledd 5 — kjøretiden. Nettet har V=n+m+2V = n + m + 2 noder og
E=O(n+m+k)E = O(n + m + k) kanter, der kk er antall sertifiseringer. Edmonds-Karp
gir O(VE2)O(VE^2).

Margnotat. «O(VE2)O(VE^2)» uten å si hva VV og EE er i denne
konstruksjonen, er et halvt svar. Én linje til koster ingenting.

b) Endrer minstekravet noe?

Ja — og det er ikke lenger et rent maks-flyt-problem. Kapasiteter setter
øvre grenser; en nedre grense på hver kildekant kan ikke uttrykkes i
standardmodellen fra kap. 5.1.

Det ærlige svaret er å si nettopp det, og deretter peke på hva som kan gjøres:
enten flyt med nedre grenser på kantene, som er en utvidelse utenfor
pensum, eller en enkel forbehandling der hver hjelper først tildeles én rute
via en maksimal matching, og resten fordeles med nettet over.

Margnotat. Å si «dette faller utenfor standardmodellen, og her er grunnen»
gir uttelling. Å late som om kapasiteten 3 plutselig koder et minstekrav, gir
det ikke.

Hele svaret på a), i eksamensform:

Dette er et tilordningsproblem med kapasiteter, og løses med maks-flyt. Bygg
et nett med kilde ss, én node per hjelper (kant fra ss, kapasitet 3), én
node per rute (kant til tt, kapasitet 1), og en kant med kapasitet 1 fra
hjelper til rute for hver sertifisering. Kjør Edmonds-Karp. Alle rutene
dekkes hvis og bare hvis maksimal flyt er mm. Fordelingen leses av som de
midtkantene som bærer flyt; heltallsteoremet gir en heltallig flyt, og
avlesningen koster O(E)O(E) uten å øke kjøretiden. Kjøretid O(VE2)O(VE^2) med
V=n+m+2V = n+m+2 og E=O(n+m+k)E = O(n+m+k).

Sju linjer. Det er lengden.

Drill: flyt og min-snitt (~18 min)

Fire oppgaver. Kjenn igjen mønsteret først, bygg nettet etterpå.

📝Oppgave 1
Eksamensnivå, sjanger H

Et bibliotek har nn ledige leseplasser og mm studenter som har meldt seg på.
Hver student har oppgitt hvilke plasser hun kan bruke, og skal ha nøyaktig én.
Hver plass tar én student.

Beskriv hvordan du avgjør om alle får plass, og hvordan du finner
fordelingen.

📝Oppgave 2
Eksamensnivå, sjanger H

En by planlegger flomsikring. Kartet er et rutenett; noen ruter er elvebredd,
noen er sykehusområde. Å sette opp en barriere i en rute koster et oppgitt
beløp. Byen vil finne den billigste samlingen ruter som gjør det umulig å
komme fra elvebredden til sykehusområdet.

Beskriv en løsning.

📝Oppgave 3
Eksamensnivå, sjanger…

Et datasenter skal fordele nn beregningsjobber på mm maskiner. Jobb jj
krever rjr_j kjernetimer, og maskin ii har kik_i ledige kjernetimer. En jobb
kan splittes på flere maskiner, men bare på dem som har riktig programvare.

Beskriv hvordan du avgjør om alle jobbene kan kjøres.

📝Oppgave 4
Eksamensnivå, sjanger H…

Samme datasenter som i forrige oppgave, men nå kan ikke en jobb splittes:
hver jobb må kjøres i sin helhet på én maskin.

a) Virker flytmodellen fortsatt?
b) Hva kan du si om problemets vanskelighet?

Drill: dynamisk programmering (~16 min)

Tre oppgaver. Delproblemet skal defineres med ord før rekurrensen kommer.

📝Oppgave 5
Eksamensnivå, sjanger H

Et museum skal sette opp en utstillingsrekke langs en korridor med nn
posisjoner. Å plassere en montre på posisjon ii gir besøksverdien gig_i, men
to montre kan ikke stå på naboposisjoner. Samlet besøksverdi skal
maksimeres.

Beskriv en DP-løsning, og oppgi kjøretiden.

📝Oppgave 6
Eksamensnivå, sjanger H

To laboratorier har hver sin logg over hvilke målinger de har utført, i
kronologisk rekkefølge. Kvalitetsavdelingen vil finne den lengste rekken av
måletyper begge har utført, i samme rekkefølge — men ikke nødvendigvis
rett etter hverandre.

Beskriv en løsning.

📝Oppgave 7
Eksamensnivå, sjanger…

En transportør skal fylle en container med kapasitet WW kilo. Det finnes nn
kolli, hvert med en vekt og en verdi, og hvert kolli kan tas med eller ikke —
ikke deles.

a) Beskriv en DP-løsning som finner høyest mulig verdi og hvilke kolli
som velges.
b) En kollega sier at algoritmen er polynomisk siden kjøretiden er
Θ(nW)\Theta(nW). Stemmer det?

Drill: grafsøk og stabil matching (~16 min)

Tre oppgaver. Her er fellen å velge feil søkealgoritme.

📝Oppgave 8
Eksamensnivå, sjanger H

Et regelverk består av nn paragrafer. Noen paragrafer viser til andre. En
saksbehandler vil vite: hva er den korteste kjeden av henvisninger fra
paragraf aa til paragraf bb, målt i antall ledd?

Beskriv en løsning, og oppgi kjøretiden.

📝Oppgave 9
Eksamensnivå, sjanger H

En studieadministrasjon skal fordele nn studenter på nn prosjektgrupper.
Studentene har rangert gruppene, og gruppene har rangert studentene. Fordelingen
skal være slik at ingen student og gruppe begge heller vil ha hverandre enn det
de fikk.

a) Hvilket problem er dette, og hvordan løser du det?
b) En student spør om hun kunne fått gruppe GG i stedet. Hvordan svarer
du?

📝Oppgave 10
Eksamensnivå, sjanger…

Et logistikkfirma har et rutenett mellom VV terminaler med EE strekninger.
Hver strekning har en kostnad, og noen kostnader er negative fordi
returlast betaler bedre enn utgiften. Nettet har ingen sykel med negativ
totalkostnad.

a) Firmaet vil ha billigste rute fra hovedterminalen til alle andre.
Hvilken algoritme, og hvorfor ikke de andre?
b) Nettet viser seg i tillegg å være syklusfritt. Endrer det svaret?

Kald bank — uten hint

Paradigmene og kjøretidene samlet

ParadigmeNårKjøretidRekonstruksjon
Maks-flytfordeling med kapasiteterO(VE2)O(VE^2)midtkanter med flyt, O(E)O(E)
Min-snittbilligste barriereO(VE2)O(VE^2)én BFS i restnettet, O(V+E)O(V+E)
Maksimal matchingén-til-én-paringO(VE2)O(VE^2)midtkanter med flyt, O(E)O(E)
DP, oppdelingdel i biter med verdiΘ(n2)\Theta(n^2)valgtabell baklengs, O(n)O(n)
DP, LCSto sekvenserΘ(nm)\Theta(nm)retningspekere baklengs, O(n+m)O(n+m)
DP, ryggsekkvelg eller ikke, med grenseΘ(nW)\Theta(nW), pseudopolynomiskrad-sammenligning baklengs, O(n)O(n)
BFSfærrest leddΘ(V+E)\Theta(V+E)π\pi baklengs, O(V)O(V)
Dijkstrakorteste vei, ikke-negative vekterO(ElgV)O(E\lg V)π\pi baklengs, O(V)O(V)
DAG-Shortest-Pathkorteste vei i DAG, negative lovΘ(V+E)\Theta(V+E)π\pi baklengs, O(V)O(V)
Bellman-Fordkorteste vei med negative vekterΘ(VE)\Theta(VE)π\pi baklengs, O(V)O(V)
Gale-Shapleystabil parvis tilordningO(n2)O(n^2)matchingen og orienteringen
MSTbilligste sammenhengende nettO(ElgV)O(E\lg V)kantene i rekkefølge, V1V-1 stk.
Reduksjon«vis at problemet er vanskelig»retning + hva den ikke viser

Én presisering som er verdt å ta med seg. Rekonstruksjonskolonnen er den
korteste i tabellen og den dyreste å glemme. I hvert eneste tilfelle er den et
lavere ledd enn selve algoritmen — og i hvert eneste tilfelle er den det
oppgaven faktisk ber om.

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 leddene i et designsvar

navngi det klassiske problemet, navngi paradigmet, bygg konstruksjonen,
rekonstruér selve løsningen, og oppgi kjøretiden.

Det fjerde glipper oftest, og det andre er det billigste å få med.

Tell leddene før du går videre til neste oppgave.

Mønstergjenkjenning

å lese innpakningen og finne strukturen: fordeling, barriere, oppdeling, to
sekvenser, velg-eller-ikke, færrest ledd, eller stabil paring.

Innpakningen er alltid ny; strukturen er alltid en av en håndfull.

Les oppgaven én gang for mønsteret, og først deretter for detaljene.

Flytmalen

kilde, venstre nodesett, høyre nodesett, sluk. Ytterkantene koder grenser;
midtkantene koder hva som er tillatt.

Kjør Edmonds-Karp, O(VE2)O(VE^2), og les tildelingen av de midtkantene som bærer
flyt.

Heltallsteoremet er det som gjør avlesningen entydig — nevn det.

Nodesplitting

å dele en node i to med en indre kant som bærer nodens kapasitet eller kostnad.

Brukes når begrensningen sitter på en node og ikke på en kant — typisk i
barriereproblemer der det koster å sperre et sted.

Alle innkommende kanter til den ene halvdelen, alle utgående fra den
andre.

Rekonstruksjon

å hente ut selve løsningen: hvilke midtkanter bærer flyt, hvilke valg står i
valgtabellen, hvilken sti gir π\pi.

Koster O(E)O(E), O(n)O(n) eller O(n+m)O(n+m) — alltid et lavere ledd.

Setningen «dette øker ikke den asymptotiske kjøretiden» hører med.

Å oppgi kjøretiden i problemets størrelser

«O(VE2)O(VE^2) med V=n+m+2V = n+m+2 og E=O(n+m+k)E = O(n+m+k)» er et helt svar.

«O(VE2)O(VE^2)» alene er et halvt: den som retter, kan ikke se om konstruksjonen
din faktisk gir den grensen.

Én linje til koster ingenting og henter et helt ledd.

Når flyt ikke virker

flytmodellen tåler ikke nedre grenser på kanter, og den hindrer ikke at
flyten fra én node splittes på flere veier.

Krever oppgaven at en enhet holdes samlet, er problemet typisk NP-hardt — en
ryggsekkvariant.

Å si at noe faller utenfor standardmodellen, og hvorfor, gir uttelling.

Sjanger H — åpen algoritmedesign

oppgavetypen der du skisserer en algoritme på fem til ti linjer.

De siste tre til fem oppgavene i hvert ordinære sett er av denne typen.

Delvis uttelling er regelen: riktig paradigme og halv konstruksjon gir
uttelling selv om detaljene halter.

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.