Dijkstras er en grådig korteste vei algoritme som finner distanser til alle noder fra startnoden (single source shortest path). Man holder orden på hvilken node som har det laveste estimatet underveis.
Dijkstra håndterer sykler, men negative kanter er forbudt.
Den eneste forskjellen på DAG-shortest-path og Dijkstra er hvordan vi velger den neste noden.
I DAG-shortest-path kan vi finne rekkefølgen på nodene som skal slakkes i lineær tid
Dijkstra krever at alle kanter er ikke-negative. Hvis det finnes negative sykler vil den ikke terminere som normalt.
Dijkstra er mest effektiv når brukt i en heap. Andre datastrukturer kan gi høyere kjøretid og er ikke dekket i pensum.
- La
$Q$ være en min-prioritetskø - Legg alle noder i
$Q$ - Så lenge
$Q$ ikke er tom:-
$u = Q$ .pop() - for hver nabo
$v$ av$u$ :
Relax(u,v)
-
Alternativt
Dijkstra(G,q,s):
1 INITIALIZE-SINGLE-SOURCE(G,s)
2 S = ∅
3 Q = G.V
4 while Q != ∅
5 u = EXTRACT-MIN(Q)
6 S = S U {u}
7 for hver node v i G.Adj[u]
8 RELAX(u,v,w)
- Setup: Alle avstander = uendelig, alle innkanter = NIL og avstanden til startnoden = 0
- S: ettet med ferdige noder = tomt
- Q: Pri-kø er satt til alle noder (tenk på det som en traverseringskø, bare setter det inn med en gang som i Prim)
- Så lenge det er igjen noder i pri-kø
- Hent ut det minste elemenentet fra køen. Den minste utnoden. Priorteten er avstandsestimatet, ikke den korteste kanten inn til traverseringstreet.
- S brukes bare for forklaring her. Trengs ikke, men kan brukes fint i bevis.
- For hver nabonode, kjør Relax. Vi finner en ny lengde til
$u$ , "reklamer" dette til alle naboer.
Når vi kjører pop
på
Altså: Når vi velger å besøke node
Optimal substruktur. Gitt ingen negative kanter vil det umulig kunne være noen kortere vei, da du alltid henter den veien det er kortest til nå.
- Dijkstra bruker ideer tilsvarende breadth-first search og MST-Prim.
- Bruker avstandsestimat istedenfor kantlengde(pulling vs reaching)
- Lavere kjøretid enn Bellman-Ford algoritmen
- Takler ikke negative kantvekter
Innsetting | Pop | Oppdater | |
---|---|---|---|
Array | 1 | V | 1 |
Binary Heap | log(V) |
Dijkstra kjøretid basert på tabellen over:
Array:
Binary heap:
Operasjon | Antall | Kjøretid |
---|---|---|
Initialisering | 1 | |
BUILD-HEAP | 1 | |
EXTRACT-MIN | V | |
DECREASE-KEY* | E |
*Nødvendig i RELAX
Dette gir total kjøretid $O(V\space lg(V) + E\space lg (V)$)
Kjøretiden avhenger av hvordan min-prioritetskøen er implementert.
Datastruktur | Tidskompleksitet |
---|---|
Fibonacci heap | |
Binary min-heap | |
Array |