I denne artikkelen skal vi diskutere en av de mest kjente algoritmene for korteste vei, dvs. Dijkstras korteste veialgoritme som ble utviklet av den nederlandske dataforskeren Edsger W. Dijkstra i 1956. Dessuten vil vi gjøre en kompleksitetsanalyse for denne algoritmen og også se hvordan den skiller seg fra andre korteste vei-algoritmer.
Innholdsfortegnelse
- Dijkstras algoritme
- Behov for Dijkstras algoritme (formål og brukstilfeller)
- Kan Dijkstras algoritme fungere på både rettet og urettet grafer?
- Algoritme for Dijkstras algoritme
- Hvordan fungerer Dijkstras algoritme?
- Pseudokode for Dijkstras algoritme
- Implementering av Dijkstras algoritme:
- Dijkstras algoritmer vs Bellman-Ford algoritme
- Dijkstras algoritme vs Floyd-Warshall-algoritme
- Dijkstras algoritme vs A* algoritme
- Øv problemer på Dijkstras algoritme
- Konklusjon:

Dijkstras algoritme:
Dijkstras algoritme er en populær algoritme for å løse mange enkelt-kilde korteste vei problemer med ikke-negativ kantvekt i grafene, dvs. det er å finne den korteste avstanden mellom to toppunkter på en graf. Den ble unnfanget av en nederlandsk dataforsker Edsger W. Dijkstra i 1956.
Algoritmen opprettholder et sett med besøkte toppunkter og et sett med ubesøkte toppunkter. Den starter ved kildetoppunktet og velger iterativt det ubesøkte toppunktet med den minste tentative avstanden fra kilden. Den besøker deretter naboene til dette toppunktet og oppdaterer deres tentative avstander hvis en kortere vei blir funnet. Denne prosessen fortsetter til destinasjonspunktet er nådd, eller alle nåbare toppunkter er besøkt.
Behov for Dijkstras algoritme (formål og bruksområder)
Behovet for Dijkstras algoritme oppstår i mange applikasjoner der det er avgjørende å finne den korteste veien mellom to punkter.
For eksempel , Den kan brukes i rutingprotokollene for datanettverk og også brukes av kartsystemer for å finne den korteste veien mellom startpunktet og destinasjonen (som forklart i Hvordan fungerer Google Maps? )
Kan Dijkstras algoritme fungere på både rettet og urettet grafer?
Ja , Dijkstras algoritme kan fungere på både rettede grafer og urettede grafer, da denne algoritmen er designet for å fungere på alle typer grafer så lenge den oppfyller kravene til å ha ikke-negative kantvekter og være tilkoblet.
- I en rettet graf, hver kant har en retning, som indikerer kjøreretningen mellom toppunktene forbundet med kanten. I dette tilfellet følger algoritmen retningen til kantene når man søker etter den korteste veien.
- I en urettet graf, kantene har ingen retning, og algoritmen kan gå både forover og bakover langs kantene når man søker etter den korteste veien.
Algoritme for Dijkstras algoritme:
- Merk kildenoden med en gjeldende avstand på 0 og resten med uendelig.
- Sett den ikke-besøkte noden med den minste strømavstanden som gjeldende node.
- For hver nabo legger N av den nåværende noden til den nåværende avstanden til den tilstøtende noden med vekten av kanten som forbinder 0->1. Hvis den er mindre enn den nåværende avstanden til Node, sett den som den nye gjeldende avstanden til N.
- Merk gjeldende node 1 som besøkt.
- Gå til trinn 2 hvis det er noen noder som ikke er besøkt.
Hvordan fungerer Dijkstras algoritme?
La oss se hvordan Dijkstras algoritme fungerer med et eksempel gitt nedenfor:
Dijkstras algoritme vil generere den korteste veien fra node 0 til alle andre noder i grafen.
Tenk på grafen nedenfor:
Dijkstras algoritme
Algoritmen vil generere den korteste veien fra node 0 til alle de andre nodene i grafen.
For denne grafen vil vi anta at vekten av kantene representerer avstanden mellom to noder.
git pull syntaksSom vi kan se at vi har den korteste veien fra,
Node 0 til Node 1, fra
Node 0 til Node 2, fra
Node 0 til Node 3, fra
Node 0 til Node 4, fra
Node 0 til Node 6.I utgangspunktet har vi et sett med ressurser gitt nedenfor:
- Avstanden fra kildenoden til seg selv er 0. I dette eksemplet er kildenoden 0.
- Avstanden fra kildenoden til alle andre noder er ukjent, så vi markerer alle som uendelig.
Eksempel: 0 -> 0, 1-> ∞,2-> ∞,3-> ∞,4-> ∞,5-> ∞,6-> ∞.
- vi vil også ha en rekke ubesøkte elementer som vil holde styr på ubesøkte eller umerkede noder.
- Algoritmen fullføres når alle nodene merket som besøkt og avstanden mellom dem lagt til banen. Ubesøkte noder:- 0 1 2 3 4 5 6.
Trinn 1: Start fra Node 0 og merk Node som besøkt som du kan sjekke inn under bildet besøkt Node er merket rødt.
Dijkstras algoritme
Steg 2: Se etter tilstøtende noder, nå må vi velge (velg enten Node1 med avstand 2 eller velg Node 2 med avstand 6) og velg Node med minimumsavstand. I dette trinnet Node 1 er Minimumsavstand tilstøtende node, så merk den som besøkt og legg sammen avstanden.
Avstand: Node 0 -> Node 1 = 2
Dijkstras algoritme
Trinn 3: Gå deretter fremover og se etter tilstøtende node som er node 3, så merk den som besøkt og legg sammen avstanden, nå vil avstanden være:
Avstand: Node 0 -> Node 1 -> Node 3 = 2 + 5 = 7
Dijkstras algoritme
Trinn 4: Igjen har vi to valg for tilstøtende noder (enten kan vi velge node 4 med avstand 10 eller enten kan vi velge node 5 med avstand 15) så velg node med minimumsavstand. I dette trinnet Node 4 er Minimumsavstand tilstøtende node, så merk den som besøkt og legg sammen avstanden.
Avstand: Node 0 -> Node 1 -> Node 3 -> Node 4 = 2 + 5 + 10 = 17
Dijkstras algoritme
Trinn 5: Igjen, gå fremover og se etter tilstøtende node som er Node 6 , så merk den som besøkt og legg sammen avstanden, nå blir avstanden:
Avstand: Node 0 -> Node 1 -> Node 3 -> Node 4 -> Node 6 = 2 + 5 + 10 + 2 = 19
hvor mange mb i en gbDijkstras algoritme
Så den korteste avstanden fra kildevertexet er 19, som er optimal
Pseudokode for Dijkstras algoritme
funksjon Dijkstra(Graf, kilde):
// Initialiser avstander til alle noder som uendelig, og til kildenoden som 0.avstander = kart (alle noder -> uendelig)
avstander = 0
// Initialiser et tomt sett med besøkte noder og en prioritert kø for å holde styr på nodene som skal besøkes.
besøkt = tomt sett
kø = ny PriorityQueue()
queue.enqueue(kilde, 0)// Loop til alle noder er besøkt.
mens køen ikke er tom:
// Sett noden i kø med den minste avstanden fra prioritetskøen.
gjeldende = queue.dequeue()algoritmedybde første søk// Hvis noden allerede er besøkt, hopp over den.
hvis aktuelle i besøkt:
Fortsette// Merk noden som besøkt.
visited.add(current)// Sjekk alle nabonoder for å se om avstandene deres må oppdateres.
for nabo i Graph.neighbors(gjeldende):
// Beregn den tentative avstanden til naboen gjennom gjeldende node.
tentative_distance = avstander[strøm] + Graph.distance(strøm, nabo)// Hvis den tentative avstanden er mindre enn gjeldende avstand til naboen, oppdater avstanden.
hvis tentativ_avstand
avstander[nabo] = tentativ_avstand// Still naboen i kø med sin nye avstand for å vurderes for samvær i fremtiden.
queue.enqueue(nabo, avstander[nabo])// Returner de beregnede avstandene fra kilden til alle andre noder i grafen.
returavstander
Implementering av Dijkstras algoritme:
Det er flere måter å implementere Dijkstras algoritme på, men de vanligste er:
- Prioritetskø (heap-basert implementering):
- Matrisebasert implementering:
1. Dijkstras korteste vei-algoritme ved hjelp av priority_queue (Heap)
I denne implementeringen får vi en graf og et kildepunkt i grafen, og finner de korteste veiene fra kilden til alle toppunktene i den gitte grafen.
Eksempel:
Inndata: Kilde = 0
Eksempel
Produksjon: Vertex
uendelig løkkeToppunktavstand fra kilde
0 -> 0
1 -> 2
2 -> 6
3 -> 7
4 -> 17
5 -> 22
6 -> 19
Nedenfor er algoritmen basert på ideen ovenfor:
- Initialiser avstandsverdiene og prioritetskøen.
- Sett inn kildenoden i prioritetskøen med avstand 0.
- Mens prioritetskøen ikke er tom:
- Trekk ut noden med minimumsavstanden fra prioritetskøen.
- Oppdater avstandene til naboene hvis en kortere vei blir funnet.
- Sett inn oppdaterte naboer i prioritetskøen.
Nedenfor er C++-implementeringen av tilnærmingen ovenfor:
C++ // Program to find Dijkstra's shortest path using // priority_queue in STL #include using namespace std; #define INF 0x3f3f3f3f // iPair ==>Heltallspar typedef-par iPair; // Denne klassen representerer en rettet graf som bruker // adjacency list representation class Graph { int V; // Antall toppunkter // I en vektet graf må vi lagre toppunkt // og vektpar for hver kantliste>* adj; offentlig: Graph(int V); // Konstruktør // funksjon for å legge til en kant til grafen void addEdge(int u, int v, int w); // skriver ut korteste vei fra s void shortestPath(int s); }; // Tildeler minne for tilstøtende liste Graph::Graph(int V) { this->V = V; adj = ny liste [V]; } void Graph::addEdge(int u, int v, int w) { adj[u].push_back(make_pair(v, w)); adj[v].push_back(make_pair(u, w)); } // Skriver ut korteste veier fra src til alle andre toppunkter void Graph::shortestPath(int src) { // Opprett en prioritetskø for å lagre toppunkter som // blir forhåndsbehandlet. Dette er merkelig syntaks i C++. // Se lenken nedenfor for detaljer om denne syntaksen // https://www.techcodeview.com priority_queue , større > pq; // Lag en vektor for avstander og initialiser alle // avstander som uendelig (INF) vektor dist(V, INF); // Sett inn selve kilden i prioritetskøen og initialiser // dens avstand som 0. pq.push(make_pair(0, src)); dist[kilde] = 0; /* Looping til prioritetskøen blir tom (eller alle avstander er ikke fullført) */ while (!pq.empty()) { // Det første toppunktet i par er minimumsavstanden // vertex, trekk det ut fra prioritetskøen. // toppunktetiketten er lagret i andre av paret (det // må gjøres på denne måten for å holde toppunktene // sortert avstand (avstand må være første element // i par) int u = pq.top().second; pq.pop(); // 'i' brukes til å få alle tilstøtende hjørner av en // toppunktliste>::iterator i; for (i = adj[u].begin(); i != adj[u].end(); ++i) { // Få toppunktetikett og vekt av gjeldende // ved siden av u. int v = (*i).først; int vekt = (*i).sekund; // Hvis det er kortsluttet vei til v gjennom u. if (avstand[v]> dist[u] + vekt) { // Oppdatering av avstand til v dist[v] = dist[u] + vekt; pq.push(make_pair(avstand[v], v)); } } } // Skriv ut korteste avstander lagret i dist[] printf('Vertex Distance from Source
'); for (int i = 0; i< V; ++i) printf('%d %d
', i, dist[i]); } // Driver program to test methods of graph class int main() { // create the graph given in above figure int V = 7; Graph g(V); // making above shown graph g.addEdge(0, 1, 2); g.addEdge(0, 2, 6); g.addEdge(1, 3, 5); g.addEdge(2, 3, 8); g.addEdge(3, 4, 10); g.addEdge(3, 5, 15); g.addEdge(4, 6, 2); g.addEdge(5, 6, 6); g.shortestPath(0); return 0; }>
Java import java.util.ArrayList; import java.util.Arrays; import java.util.HashMap; import java.util.PriorityQueue; public class DijkstraAlgoForShortestDistance { static class Node implements Comparable{ int v; int avstand; offentlig Node(int v, int avstand) { this.v = v; this.distance = avstand; } @Override public int compareTo(Node n) { if (this.distance<= n.distance) { return -1; } else { return 1; } } } static int[] dijkstra( int V, ArrayList >> adj, int S) { boolean[] besøkt = new boolean[V]; HashMap map = new HashMap(); Prioritetskøq = new PriorityQueue(); map.put(S, ny node(S, 0)); q.add(ny node(S, 0)); while (!q.isEmpty()) { Node n = q.poll(); int v = n.v; int avstand = n.avstand; besøkt[v] = sant; ArrayList > adjList = adj.get(v); for (ArrayList adjLink : adjList) { if (besøkt[adjLink.get(0)] == usant) { if (!map.containsKey(adjLink.get(0))) { map.put( adjLink.get(0), ny node (v, avstand + adjLink.get(1))); } else { Node sn = map.get(adjLink.get(0)); if (avstand + adjLink.get(1)< sn.distance) { sn.v = v; sn.distance = distance + adjLink.get(1); } } q.add(new Node(adjLink.get(0), distance + adjLink.get(1))); } } } int[] result = new int[V]; for (int i = 0; i < V; i++) { result[i] = map.get(i).distance; } return result; } public static void main(String[] args) { ArrayList >> adj = ny ArrayList(); HashMap >> map = new HashMap(); int V = 6; int E = 5; int[] u = { 0, 0, 1, 2, 4 }; int[] v = { 3, 5, 4, 5, 5 }; int[] w = { 9, 4, 4, 10, 3 }; for (int i = 0; i< E; i++) { ArrayList edge = new ArrayList(); edge.add(v[i]); edge.add(w[i]); ArrayList > adjList; if (!map.containsKey(u[i])) { adjList = new ArrayList(); } else { adjList = map.get(u[i]); } adjList.add(kant); map.put(u[i], adjListe); ArrayList edge2 = new ArrayList(); edge2.add(u[i]); edge2.add(w[i]); ArrayList > adjList2; if (!map.containsKey(v[i])) { adjList2 = new ArrayList(); } else { adjList2 = map.get(v[i]); } adjListe2.add(kant2); map.put(v[i], adjListe2); } for (int i = 0; i< V; i++) { if (map.containsKey(i)) { adj.add(map.get(i)); } else { adj.add(null); } } int S = 1; // Input sample //[0 [[3, 9], [5, 4]], // 1 [[4, 4]], // 2 [[5, 10]], // 3 [[0, 9]], // 4 [[1, 4], [5, 3]], // 5 [[0, 4], [2, 10], [4, 3]] //] int[] result = DijkstraAlgoForShortestDistance.dijkstra( V, adj, S); System.out.println(Arrays.toString(result)); } }> Python # Python implementation of Dijkstra Algorithm import heapq class Node: def __init__(self, v, distance): self.v = v self.distance = distance def __lt__(self, other): return self.distance < other.distance def dijkstra(V, adj, S): visited = [False] * V map = {} q = [] map[S] = Node(S, 0) heapq.heappush(q, Node(S, 0)) while q: n = heapq.heappop(q) v = n.v distance = n.distance visited[v] = True adjList = adj[v] for adjLink in adjList: if not visited[adjLink[0]]: if adjLink[0] not in map: map[adjLink[0]] = Node(v, distance + adjLink[1]) else: sn = map[adjLink[0]] if distance + adjLink[1] < sn.distance: sn.v = v sn.distance = distance + adjLink[1] heapq.heappush(q, Node(adjLink[0], distance + adjLink[1])) result = [0] * V for i in range(V): result[i] = map[i].distance return result def main(): adj = [[] for _ in range(6)] V = 6 E = 5 u = [0, 0, 1, 2, 4] v = [3, 5, 4, 5, 5] w = [9, 4, 4, 10, 3] for i in range(E): edge = [v[i], w[i]] adj[u[i]].append(edge) edge2 = [u[i], w[i]] adj[v[i]].append(edge2) S = 1 result = dijkstra(V, adj, S) print(result) if __name__ == '__main__': main() # This code is contributed by ragul21> C# // C# Code: using System; using System.Collections.Generic; public class Graph { // No. of vertices private int V; // adjacency list private List>[] adj; // Konstruktør offentlig Graph(int v) { V = v; adj = ny liste>[v]; for (int i = 0; i< v; ++i) adj[i] = new List>(); } // funksjon for å legge til en kant til grafen offentlig void addEdge(int u, int v, int w) { adj[u].Add(Tuple.Create(v, w)); adj[v].Add(Tuple.Create(u, w)); } // skriver ut korteste vei fra s public void shortestPath(int s) { // Opprett en prioritetskø for å lagre hjørner som // blir forhåndsbehandlet. var pq = ny PriorityQueue>(); // Lag en vektor for avstander og initialiser alle // avstander som uendelig (INF) var dist = new int[V]; for (int i = 0; i< V; i++) dist[i] = int.MaxValue; // Insert source itself in priority queue and // initialize its distance as 0. pq.Enqueue(Tuple.Create(0, s)); dist[s] = 0; /* Looping till priority queue becomes empty (or all distances are not finalized) */ while (pq.Count != 0) { // The first vertex in pair is the minimum // distance vertex, extract it from priority // queue. vertex label is stored in second of // pair (it has to be done this way to keep the // vertices sorted distance (distance must be // first item in pair) var u = pq.Dequeue().Item2; // 'i' is used to get all adjacent vertices of a // vertex foreach(var i in adj[u]) { // Get vertex label and weight of current // adjacent of u. int v = i.Item1; int weight = i.Item2; // If there is shorted path to v through u. if (dist[v]>dist[u] + vekt) { // Oppdatering av avstand til v dist[v] = dist[u] + vekt; pq.Enqueue(Tuple.Create(dist[v], v)); } } } // Skriv ut korteste avstander lagret i dist[] Console.WriteLine('Vertex Distance from Source'); for (int i = 0; i< V; ++i) Console.WriteLine('{0} {1}', i, dist[i]); } } public class PriorityQueue{ privat skrivebeskyttet liste_data; privat skrivebeskyttet sammenligning_sammenlignet; offentlig PriorityQueue(): dette(Sammenlign.Standard) { } offentlig PriorityQueue(IComparercompare): this(compare.Compare) { } public PriorityQueue(Comparisonsammenligning) { _data = ny liste(); _sammenlign = sammenligning; } public void Enqueue(T item) { _data.Add(item); var childIndex = _data.Count - 1; while (childIndex> 0) { var parentIndex = (childIndex - 1) / 2; if (_compare(_data[childIndex], _data[parentIndex])>= 0) break; T tmp = _data[childIndex]; _data[childIndex] = _data[parentIndex]; _data[parentIndex] = tmp; childIndex = parentIndex; } } public T Dequeue() { // antar at pq ikke er tom; opp til kallekoden var lastElement = _data.Count - 1; var frontItem = _data[0]; _data[0] = _data[lastElement]; _data.RemoveAt(lastElement); --lastElement; var parentIndex = 0; while (true) { var childIndex = parentIndex * 2 + 1; if (childIndex> lastElement) break; // Slutt på treet var rightChild = childIndex + 1; hvis (rightChild<= lastElement && _compare(_data[rightChild], _data[childIndex]) < 0) childIndex = rightChild; if (_compare(_data[parentIndex], _data[childIndex]) <= 0) break; // Correct position T tmp = _data[parentIndex]; _data[parentIndex] = _data[childIndex]; _data[childIndex] = tmp; parentIndex = childIndex; } return frontItem; } public T Peek() { T frontItem = _data[0]; return frontItem; } public int Count { get { return _data.Count; } } } class Program { // Driver program to test methods of graph class static void Main(string[] args) { // create the graph given in above figure int V = 7; Graph g = new Graph(V); // making above shown graph g.addEdge(0, 1, 2); g.addEdge(0, 2, 6); g.addEdge(1, 3, 5); g.addEdge(2, 3, 8); g.addEdge(3, 4, 10); g.addEdge(3, 5, 15); g.addEdge(4, 6, 2); g.addEdge(5, 6, 6); g.shortestPath(0); } }> Javascript class PriorityQueue { constructor() { this.queue = []; } enqueue(element, priority) { this.queue.push({ element, priority }); this.queue.sort((a, b) =>a.prioritet - b.prioritet); } dequeue() { if (this.isEmpty()) { return null; } returner this.queue.shift().element; } isEmpty() { return this.queue.length === 0; } } class Graph { constructor(V) { this.V = V; this.adj = ny Array(V); for (la i = 0; i< V; i++) { this.adj[i] = []; } } addEdge(u, v, w) { this.adj[u].push({ v, w }); this.adj[v].push({ v: u, w }); } shortestPath(src) { const pq = new PriorityQueue(); const dist = new Array(this.V).fill(Infinity); const visited = new Array(this.V).fill(false); pq.enqueue(src, 0); dist[src] = 0; while (!pq.isEmpty()) { const u = pq.dequeue(); if (visited[u]) continue; visited[u] = true; for (const { v, w } of this.adj[u]) { if (!visited[v] && dist[u] + w < dist[v]) { dist[v] = dist[u] + w; pq.enqueue(v, dist[v]); } } } console.log('Vertex Distance from Source'); for (let i = 0; i < this.V; i++) { console.log(`${i} ${dist[i] === Infinity ? 'Infinity' : dist[i]}`); } } } function main() { const V = 7; const g = new Graph(V); g.addEdge(0, 1, 2); g.addEdge(0, 2, 6); g.addEdge(1, 3, 5); g.addEdge(2, 3, 8); g.addEdge(3, 4, 10); g.addEdge(3, 5, 15); g.addEdge(4, 6, 2); g.addEdge(5, 6, 6); g.shortestPath(0); } main();> Endelig svar:

Produksjon
Kompleksitetsanalyse av Dijkstra-algoritmen :
- Tidskompleksitet: O((V + E) log V) , hvor V er antall toppunkter og E er antall kanter.
- Hjelpeplass: O(V), der V er antall toppunkter og E er antall kanter i grafen.
2.Array-basert implementering av Dijkstras algoritme (naiv tilnærming):
Dijkstras algoritme kan også implementeres ved hjelp av arrays uten å bruke en prioritetskø. Denne implementeringen er enkel, men kan være mindre effektiv, spesielt på store grafer.
Algoritmen fortsetter som følger:
- Initialiser en matrise for å lagre avstander fra kilden til hver node.
- Merk alle noder som ubesøkte.
- Sett avstanden til kildenoden til 0 og uendelig for alle andre noder.
- Gjenta til alle noder er besøkt:
- Finn den ubesøkte noden med den minste kjente avstanden.
- For gjeldende node, oppdater avstandene til ubesøkte naboer.
- Merk gjeldende node som besøkt.
Kompleksitetsanalyse:
- Tidskompleksitet: O(V^2) i verste fall, hvor V er antall toppunkter. Dette kan forbedres til O(V^2) med noen optimaliseringer.
- Hjelpeplass: O(V), der V er antall toppunkter og E er antall kanter i grafen.
Dijkstras algoritmer vs Bellman-Ford algoritme
Dijkstras algoritme og Bellman-Ford algoritme brukes begge til å finne den korteste veien i en vektet graf, men de har noen viktige forskjeller. Her er hovedforskjellene mellom Dijkstras algoritme og Bellman-Ford-algoritmen:
| Trekk: | Dijkstras | Bellman Ford |
|---|---|---|
| Optimalisering | optimalisert for å finne den korteste veien mellom en enkelt kildenode og alle andre noder i en graf med ikke-negative kantvekter | Bellman-Ford-algoritmen er optimalisert for å finne den korteste veien mellom en enkelt kildenode og alle andre noder i en graf med negative kantvekter. |
| Avslapning | Dijkstras algoritme bruker en grådig tilnærming der den velger noden med den minste avstanden og oppdaterer naboene sine | Bellman-Ford-algoritmen slapper av alle kanter i hver iterasjon, og oppdaterer avstanden til hver node ved å vurdere alle mulige veier til den noden |
| Tidskompleksitet | Dijkstras algoritme har en tidskompleksitet på O(V^2) for en tett graf og O(E log V) for en sparsom graf, der V er antall toppunkter og E er antall kanter i grafen. | Bellman-Ford-algoritmen har en tidskompleksitet på O(VE), der V er antall hjørner og E er antall kanter i grafen. |
| Negative vekter | Dijkstras algoritme fungerer ikke med grafer som har negative kantvekter, da den antar at alle kantvekter er ikke-negative. | Bellman-Ford-algoritmen kan håndtere negative kantvekter og kan oppdage negative vektsykluser i grafen. |
Dijkstras algoritme vs Floyd-Warshall-algoritme
Dijkstras algoritme og Floyd-Warshall algoritme brukes begge til å finne den korteste veien i en vektet graf, men de har noen viktige forskjeller. Her er hovedforskjellene mellom Dijkstras algoritme og Floyd-Warshall-algoritmen:
| Trekk: | Dijkstras | Floyd-Warshall-algoritmen |
|---|---|---|
| Optimalisering | Optimalisert for å finne den korteste veien mellom en enkelt kildenode og alle andre noder i en graf med ikke-negative kantvekter | Floyd-Warshall-algoritmen er optimalisert for å finne den korteste veien mellom alle nodepar i en graf. |
| Teknikk | Dijkstras algoritme er en enkeltkildes korteste vei-algoritme som bruker en grådig tilnærming og beregner den korteste veien fra kildenoden til alle andre noder i grafen. | Floyd-Warshall-algoritmen, på den annen side, er en korteste vei-algoritme med alle par som bruker dynamisk programmering for å beregne den korteste veien mellom alle par av noder i grafen. |
| Tidskompleksitet | Dijkstras algoritme har en tidskompleksitet på O(V^2) for en tett graf og O(E log V) for en sparsom graf, der V er antall toppunkter og E er antall kanter i grafen. | Floyd-Warshall-algoritmen, på den annen side, er en korteste vei-algoritme med alle par som bruker dynamisk programmering for å beregne den korteste veien mellom alle par av noder i grafen. |
| Negative vekter | Dijkstras algoritme fungerer ikke med grafer som har negative kantvekter, da den antar at alle kantvekter er ikke-negative. | Floyd-Warshall-algoritmen, på den annen side, er en korteste vei-algoritme med alle par som bruker dynamisk programmering for å beregne den korteste veien mellom alle par av noder i grafen. |
Dijkstras algoritme vs A* algoritme
Dijkstras algoritme og A*-algoritme brukes begge til å finne den korteste veien i en vektet graf, men de har noen viktige forskjeller. Her er hovedforskjellene mellom Dijkstras algoritme og A*-algoritme:
| Trekk: | A* Algoritme | |
|---|---|---|
| Søketeknikk | Optimalisert for å finne den korteste veien mellom en enkelt kildenode og alle andre noder i en graf med ikke-negative kantvekter | A*-algoritme er en informert søkealgoritme som bruker en heuristisk funksjon for å lede søket mot målnoden. |
| Heuristisk funksjon | Dijkstras algoritme, bruker ingen heuristisk funksjon og vurderer alle nodene i grafen. | A*-algoritmen bruker en heuristisk funksjon som estimerer avstanden fra gjeldende node til målnoden. Denne heuristiske funksjonen er tillatt, noe som betyr at den aldri overvurderer den faktiske avstanden til målnoden |
| Tidskompleksitet | Dijkstras algoritme har en tidskompleksitet på O(V^2) for en tett graf og O(E log V) for en sparsom graf, der V er antall toppunkter og E er antall kanter i grafen. | Tidskompleksiteten til A*-algoritmen avhenger av kvaliteten på den heuristiske funksjonen. |
| applikasjon | Dijkstras algoritme brukes i mange applikasjoner som rutingalgoritmer, GPS-navigasjonssystemer og nettverksanalyse | . A*-algoritme brukes ofte i problemer med stifinning og grafovergang, for eksempel videospill, robotikk og planleggingsalgoritmer. |
Øv problemer på Dijkstras algoritme:
- Dijkstras korteste vei-algoritme | Grådig Algo-7
- Dijkstras algoritme for representasjon av nabolister | Grådig Algo-8
- Dijkstras algoritme – prioritert kø og array-implementering
- Dijkstras korteste vei-algoritme bruker satt i STL
- Dijkstras korteste vei-algoritme bruker STL i C++
- Dijkstras korteste vei-algoritme ved hjelp av priority_queue av STL
- Dijkstras korteste vei-algoritme ved hjelp av matrise i C++
- Dijkstras algoritme for en kildes korteste vei i en DAG
- Dijkstras algoritme ved hjelp av Fibonacci Heap
- Dijkstras korteste veialgoritme for rettet graf med negative vekter
- Utskriftsveier i Dijkstras korteste veialgoritme
- Dijkstras korteste veialgoritme med prioritetskø i Java




