6.5 DRILL — Korteste-vei-matrisen og MST-modellering
Drill på sjanger F (korteste-avstander-matrisen, kjøretid per grafalgoritme) og H (MST-modellering, reversert Dijkstra) — velg alltid lavest kjøretid.
Dette er drillkapitlet for hele Del 6, og det trener tre sjangre samtidig:
- Sjanger F — matriseavkryssing, altså at du kobler graftype til algoritme.
Denne kommer i 4 av 7 sett, og den er blant de sikreste Del 1-poengene som
finnes. Korteste-vei-matrisen og kjøretidstabellen er de to faste variantene.
- Sjanger H — grafalgoritme i pseudokode, altså at du gjenkjenner problemet,
skriver algoritmen og oppgir kjøretiden. Her ligger modelleringen: «koble
billigst», «nærmeste kilde», «hvilken rekkefølge».
- Sjanger E — håndkjøring, altså at du utfører algoritmen steg for steg og
oppgir sluttilstanden. Huffman er den vanligste håndkjøringen fra Del 6.
Prioritet: høyeste for matrisen (den kommer, og den er ren poengsanking),
kunne for modelleringen (nivå 2 — den avgjør A mot B, ikke bestått).
Slik er kapitlet lagt opp (85 min): løsningsoppskrift, ett gjennomkjørt
eksamenscase med sensor-margnotater, og deretter tolv oppgaver på eksamensnivå.
Regn med rundt 7 minutter per oppgave, og ta gjerne kapitlet over to økter — det er
et naturlig pausepunkt etter oppgave 6.
Sist du var her — forkunnskaper i kortform
Fire resultater fra Del 6 brukes i hver eneste oppgave her. De står ferdig
oppfrisket:
1. Korteste-avstander-matrisen. Uvektet gir BFS; vektet DAG gir topologisk
sortering; ingen negative kanter gir Dijkstra; negative kanter uten negativ sykel
gir Bellman-Ford. Se kap. 6.2.
2. Kjøretidene, som må sitte hjelpemiddelfritt.
| Algoritme | Kjøretid |
|---|---|
| BFS, DFS-full, topologisk sortering, DAG-korteste-vei | |
| Dijkstra og Prim med binær prioritetskø | |
| Kruskal | |
| Bellman-Ford | |
| Huffman | , = antall symboler |
3. BFS og DFS finner ikke minimale spenntrær. De leser ikke kantvektene i det
hele tatt. Se kap. 6.3.
4. Reversert Dijkstra. Flere mulige utgangspunkt og ett mål: snu grafen, kjør
én Dijkstra fra målet. Se kap. 6.2.
Alle oppgavene i Del 6 kan angripes med den samme faste framgangsmåten.
Steg 1 — hva slags problem er dette? Les oppgaveteksten og finn signalordene:
| Ser du … | Er problemet … | Bruk |
|---|---|---|
| «raskest fram», «korteste rute», «minst tid» | korteste vei | BFS / topsort / Dijkstra / Bellman-Ford |
| «koble alt sammen billigst», «minst mulig graving totalt» | minimalt spenntre | Prim eller Kruskal |
| «må gjøres før», «avhengigheter», «sirkulær» | topologisk sortering | Kahn |
| «hvilket av flere utgangspunkt er nærmest» | korteste vei, reversert | én Dijkstra i |
| «korteste vei i det ferdige nettet» | traversering i et tre | BFS eller DFS |
| «kort kode til vanlige tegn», «færrest bits» | optimal prefikskode | Huffman |
Steg 2 — hvilken variant? For korteste vei: still de to spørsmålene i
rekkefølge. Har grafen vekter? Er den asyklisk? Finnes en negativ kant? Velg den
øverste raden i matrisen som passer.
Steg 3 — skriv svaret i fire ledd. Dette er sensors faktiske krav, og mangler
ett av dem, trekkes det:
1. Navngi problemet — «dette er et minimalt spenntre».
2. Oppgi antagelser om representasjon — nabolister, kantliste, hvilke felt en
node har.
3. Algoritmen — pseudokode eller en klar forklaring i naturlig språk. Begge
gir full uttelling; kravet er at svaret er entydig, ikke at det er syntaks.
4. Kjøretid som matcher algoritmen du faktisk ga, med og definert —
og én setning om hvorfor dette er lavest mulig.
Poengtrappen, som ligger under alt: «lavere kjøretidskompleksitet er mer
poenggivende». På samme oppgave gir full pott,
mindre, og eller
minst. Å velge riktig algoritme er å velge
poeng.
Et sensornettverk har seks målestasjoner. Meldinger sendes langs faste,
enveiskjørte radiolenker, og hver lenke har en forsinkelse i millisekunder:A -> B 6, A -> C 1, C -> B 2, C -> D 5, B -> D 3, B -> E 9,D -> E 2, D -> F 7, E -> F 1.
a) Hvor lang tid tar det før en melding fra når hver av de andre
stasjonene? Oppgi algoritme og kjøretid.
b) Stasjonene skal i tillegg kobles sammen med kabel. Alle par kan kobles, og
hver kabelstrekning har en kjent anleggspris. Hvilket problem er det, og hvilken
algoritme velger du?
c) En kollega foreslår å bruke Bellman-Ford i deloppgave a), «for sikkerhets
skyld». Hva blir konsekvensen?
signalordene for korteste vei fra én kilde.
Sensor-margnotat: å navngi problemet er hovedmomentet, og det gir mest av alt.
En besvarelse som starter med å skrive kode uten å si hva problemet er, mister
typisk et helt poeng selv om koden er riktig.
Steg 2 — hvilken variant? Kantene har vekter, så BFS er ute. Grafen har ingen
negative vekter, og selv om alle kantene her går «framover» alfabetisk, sier ikke
oppgaven noe om at nettet er asyklisk — radiolenker kan gå begge veier i andre
oppsett. Vi velger derfor Dijkstra, som er raden «ingen negative kanter».
Sensor-margnotat: hadde oppgaven eksplisitt sagt at grafen er en DAG, ville
topologisk sortering vært det øverste trinnet i trappen () og
Dijkstra gitt noe mindre. Les oppgaveteksten svært nøye — det er det mest
gjentatte rådet i hele arkivet.
Steg 3 — svaret i fire ledd.
Problemet navngitt: korteste vei fra én kilde i en rettet, vektet graf med
ikke-negative vekter.
Antagelser om representasjon: grafen er gitt som nabolister, derG.naboer(v) gir parene (w, vekt). Prioritetskøen er en binær min-heap medRemoveMin og DecreaseKey i .
Algoritmen: Dijkstra. Kjøringen på tallene:
| Steg | Ferdig (tatt ut av køen) | Relakserte kanter | avstand-tabell etter | Prioritetskø etter (heap-array) |
|---|---|---|---|---|
| 1 | A (avstand 0) | B: ∞ -> 6, C: ∞ -> 1 | A=0, B=6, C=1, D=∞, E=∞, F=∞ | (1, C), (∞, F), (6, B), (∞, D), (∞, E) |
| 2 | C (avstand 1) | B: 6 -> 3, D: ∞ -> 6 | A=0, B=3, C=1, D=6, E=∞, F=∞ | (3, B), (6, D), (∞, E), (∞, F) |
| 3 | B (avstand 3) | E: ∞ -> 12 | A=0, B=3, C=1, D=6, E=12, F=∞ | (6, D), (∞, F), (12, E) |
| 4 | D (avstand 6) | E: 12 -> 8, F: ∞ -> 13 | A=0, B=3, C=1, D=6, E=8, F=13 | (8, E), (13, F) |
| 5 | E (avstand 8) | F: 13 -> 9 | A=0, B=3, C=1, D=6, E=8, F=9 | (9, F) |
| 6 | F (avstand 9) | ingen | A=0, B=3, C=1, D=6, E=8, F=9 | tom |
Sluttilstand:
A=0, B=3, C=1, D=6, E=8, F=9Kjøretid: , der er antall målestasjoner oger antall radiolenker. uttak fra prioritetskøen à ,
pluss opptil
DecreaseKey à .Sensor-margnotat: kjøretiden må matche algoritmen du faktisk ga. Skriver du
Dijkstra og oppgir , trekkes det — ikke fordi tallet er lavt, menfordi det er feil for koden din.
Merk hva som skjedde med . Den direkte lenken A -> B tar 6 ms, men veien
via tar . I steg 2 senkes avstanden, og forgjenger[B] blir .
Og se på : først 13 via , så 9 via . Den nest siste relakseringen avgjorde
svaret.
b) Steg 1 — hva slags problem? «Kobles sammen» og «anleggspris» er signalordene
for et minimalt spenntre. Vekten er en kostnad ved å ha kabelen, ikke ved å
bruke den.
Algoritmen: Prim med binær prioritetskø. Siden alle par kan kobles, er grafen
komplett, og . Kjøretiden blir da .
Sensor-margnotat: «alle par kan kobles» er et signal som er verdt et halvt
poeng i seg selv — det er invitasjonen til å oppgi kjøretiden i-form. Kruskal med er like riktig.
Merk at dette er et helt annet problem enn a), på det samme nodesettet.
Korteste vei minimerer avstander fra én node; MST minimerer summen av kantene. Å
levere Dijkstra på b) er blant de dyreste enkeltfeilene i Del 6.
c) Bellman-Ford gir riktig svar, men koster i stedet for
. Det er en tregere algoritme på et problem der en raskere
finnes, og poengtrappen straffer det direkte: typisk full pott for Dijkstra, klart
mindre for Bellman-Ford, på samme oppgave.
Sensor-margnotat: «for sikkerhets skyld» er aldri en god strategi i dette
faget. Den tregeste korrekte algoritmen er nesten alltid den som gir færrest
poeng. Bruk heller ti sekunder på å stille de to spørsmålene i matrisen.
Feilkatalogen for Del 6, samlet. Alle er hentet fra bokas feilregister:
- Felle #1 — full gjennomgang der ett grep holdt. Å kjøre Dijkstra fra hvert
utgangspunkt i stedet for én kjøring i den reverserte grafen. Koster typisk halve
poengsummen på Del 2.
- Dijkstra på en graf med en negativ kant. Kravet er at ingen kant er
negativ. «Ingen negativ sykel» er Bellman-Fords krav — å blande dem er den
dyreste enkeltfeilen i Del 6.
- BFS eller DFS som MST-algoritme. De leser ikke kantvektene. Fast
avkryssingsfelle på sjanger F.
- Dijkstra i et ferdig spenntre. Der finnes bare én vei mellom to noder, og
vektene er byggekostnader. Bruk BFS eller DFS, .
- Å oppgi en kjøretid som ikke matcher algoritmen. Det trekkes for manglende
kjøretid, for feil kjøretid, og for å bruke uten å si hva er (felle
#10).
- Å ikke melde fra om sykel i en topologisk sortering. Sammenlign alltid
lengden på rekkefølgen med .
- Å gi kortest Huffman-kode til det sjeldneste symbolet. Kontrollen: sorter
etter frekvens og sjekk at kodelengdene går motsatt vei.
- Å levere et spenntre med feil antall kanter. Nøyaktig , alltid.
Tolv oppgaver på eksamensnivå
Oppgavene roterer de tre sjangrene: matriseavkryssing (F), håndkjøring (E) og
modellering i pseudokode (H). Alle har full fasit med poengfordeling. Ta dem på
tid — rundt 7 minutter hver.
(Innstegsoppgave, sjanger F — matriseavkryssing, altså at du kobler graftype til
algoritme.) Fyll inn den raskeste korrekte algoritmen og dens kjøretid i hver rad.
| Grafen er … | Algoritme | Kjøretid |
|---|---|---|
| uvektet | ? | ? |
| vektet DAG | ? | ? |
| vektet, ingen negative kanter | ? | ? |
| vektet med negative kanter, ingen negativ sykel | ? | ? |
Fyll inn kjøretiden for hver grafalgoritme, med binær prioritetskø
der det er relevant.
a) Full dybde-først-traversering (DFS-full)
b) Topologisk sortering med Kahns algoritme
c) Prims algoritme
d) Bellman-Ford
e) Kruskals algoritme
Sett kryss for hver algoritme: finner den et minimalt spenntre?
a) Prim
b) Bredde-først-søk
c) Kruskal
d) Dijkstra
e) Borůvka
f) Dybde-først-søk
En urettet vektet graf har kantene – 5, – 9,
– 3, – 8, – 2, – 7, – 4, – 6, – 1.
a) Kjør Prim fra . Oppgi kantene i treet og totalvekten.
b) Kontrollér antall kanter.
c) Hvilke kanter ble aldri med, og hvorfor ikke?
Kjør Kruskals algoritme på den samme grafen som i oppgave 4:
– 5, – 9, – 3, – 8, – 2, – 7, – 4,
– 6, – 1.
a) Sett opp kantene i sortert rekkefølge.
b) Vis kjøringen med union-find-tilstanden underveis.
c) Sammenlign med Prim-svaret fra oppgave 4.
Fem statuskoder har frekvensene 11, 7, 5, 3, 2.
a) Bygg Huffman-treet og oppgi kodelengden per symbol.
b) Hvor mange bits trengs totalt?
c) Hvor mye spares mot en fast koding?
— naturlig pausepunkt —
De seks første oppgavene var Del 1-stoff: avkryssinger og håndkjøringer. De seks
siste er Del 2 — modellering i pseudokode, der karakteren avgjøres. Ta dem gjerne
i en egen økt, og gi deg selv 8 til 10 minutter per oppgave.
Et bibliotek av programmoduler har
avhengighetene A -> C, B -> C, C -> D, C -> E, D -> F, E -> F,F -> G, B -> E.
a) Hvilket problem er dette, og hvilken algoritme velger du?
b) Håndkjør algoritmen og oppgi rekkefølgen.
c) Skriv algoritmen i pseudokode, med kjøretid.
En vektet DAG har kantene A -> B 2, A -> C 6, B -> C 3,B -> D 9, C -> D 1, C -> E 4, D -> F 2, E -> F 5.
a) Hvilken algoritme gir korteste vei fra med lavest kjøretid, og hvorfor?
b) Kjør den og oppgi avstandstabellen.
c) Hva ville Dijkstra kostet på samme graf?
Et distribusjonsnett har fire lagre og ett mottak . Reisetidene er
enveiskjørte: P -> C 5, Q -> C 8, Q -> D 2, R -> D 4, C -> T 3,D -> T 6.
a) Hvilket lager er nærmest ? Vis hvordan du finner det med én
algoritmekjøring.
b) Oppgi kjøretiden, og sammenlign med den naive løsningen.
c) Hvorfor gir metoden også svaret for lagre som legges til senere?
Etter at spenntreet fra oppgave 4 er bygget — kantene –,
–, –, –, – — skal en tekniker gå fra til
gjennom nettet.
a) Hvilken algoritme velger du, og hvorfor ikke Dijkstra?
b) Kjør den og oppgi antall strekk fra til hver node.
c) Hva blir kjøretiden, uttrykt i ?
En kommune har adressepunkter og mulige
grøfter, hver med en gravekostnad. De vil ha svar på tre ting:
a) Billigste nett som kobler alle adressene sammen.
b) Hvilken av tre mulige sentraler som ligger nærmest en bestemt adresse, målt
i kjøretid langs veinettet (en annen graf, med reisetider).
c) Om et sett med rekkefølgekrav for gravearbeidet lar seg gjennomføre.
For hver deloppgave: navngi problemet, oppgi algoritme og kjøretid, og si hva den
naive løsningen ville kostet.
En kollega leverer denne besvarelsen på oppgaven «finn
korteste reisetid fra depotet til alle utsalgssteder i et veinett med
enveiskjøring og positive reisetider»:
«Jeg bruker Bellman-Ford. Den relakserer alle kantene ganger og gir korteste
vei. Kjøretiden er .»
a) Hva er riktig ved besvarelsen?
b) Finn de tre problemene med den.
c) Skriv en besvarelse som ville fått full uttelling.
Begrepsbank
Begrepsbanken er flashcard-/repetisjonsstoff — den gjentar det du nettopp har
lest. Hopp trygt over ved førstegangslesing; tidsanslaget for kapitlet gjelder
kjernestoffet.
Still to spørsmål: har grafen vekter, og er den asyklisk?
Ingen vekter gir BFS. Asyklisk gir topologisk sortering. Ellers: ingen negativ
kant gir Dijkstra, negativ kant gir Bellman-Ford. Velg alltid den øverste
raden som passer — den er raskest.
: Dijkstra og Prim med binær prioritetskø.
: Kruskal.
: Bellman-Ford.
Merk at DFS fra én node er , mens DFS-full er —
felle #6.
«Raskest fram» gir korteste vei. «Koble alt sammen billigst» gir minimalt
spenntre. «Må gjøres før» gir topologisk sortering. «Hvilket av flere utgangspunkt»
gir reversert Dijkstra. «Korteste vei i det ferdige nettet» gir BFS eller DFS.
«Færrest bits» gir Huffman.
Halve jobben på Del 2 er å kjenne igjen mønsteret; resten er å skrive ned
algoritmen du allerede kan.
1. Navngi problemet. 2. Oppgi antagelser om representasjon. 3. Algoritmen, som
pseudokode eller klar forklaring. 4. Kjøretid som matcher koden, med og
definert.
Mangler ett av leddene, trekkes det. En klar naturlig-språk-forklaring gir like
mye som pseudokode — kravet er entydighet, ikke syntaks.
«Lavere kjøretidskompleksitet er mer poenggivende.» På samme oppgave gir
full pott, mindre, og
minst.
Å velge riktig algoritme er å velge poeng. Den tregeste korrekte løsningen er
nesten alltid den som gir færrest poeng — «for sikkerhets skyld» er ingen
strategi.
Full eller naiv gjennomgang der ett grep holdt: Dijkstra fra hvert utgangspunkt i
stedet for én kjøring i den reverserte grafen, eller søk fra hver node i stedet for
én SCC-kjøring.
Koster typisk halve poengsummen på Del 2, og det er dokumentert som A/B-skillet på
korteste-vei-oppgaver.
Topologisk sortering: antall prosesserte noder mot .
Dijkstra: avstandene på nodene du tar ut skal aldri synke.
Huffman: sammenslåinger, og kodelengder motsatt vei av frekvensene.
Hver av dem tar under ti sekunder og fanger de fleste håndkjøringsfeil.
En eksamensoppgave gir ofte to helt forskjellige grafer over det samme nodesettet:
én med anleggskostnader (som gir et spenntreproblem) og én med reisetider
(som gir et korteste-vei-problem).
Spørsmålet som skiller dem: måler vekten en kostnad ved å ha kanten, eller ved
å bruke den?
Begge tar ut den minste noden fra en prioritetskø og relakserer naboene. Prim
sammenligner med vekt, Dijkstra med avstand[u] + vekt.
Derfor har de identisk kjøretid, — og derfor er det så
lett å skrive den ene når man mente den andre.
Manglende kjøretid. Kjøretid som ikke matcher algoritmen du ga. brukt uten
definisjon. Manglende antagelser om representasjon. Pseudokode som ikke er
forståelig etter to gjennomlesninger.
De fem punktene er de mest gjentatte i arkivet, og alle fem er gratis å unngå — de
handler om form, ikke om fag.
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 Universitetet i Oslo. Dette er ikke offisielt studiemateriell. Les mer.