logo

Vad är Dijkstras algoritm? | Introduktion till Dijkstras Shortest Path Algorithm

I den här artikeln kommer vi att diskutera en av de mest kända algoritmerna för kortaste vägen, dvs. Dijkstra's Shortest Path Algorithm som utvecklades av den holländska datavetaren Edsger W. Dijkstra 1956. Dessutom kommer vi att göra en komplexitetsanalys för denna algoritm och även se hur det skiljer sig från andra algoritmer för kortaste vägen.

Innehållsförteckning



dijkstra-algoritm-(1)

Dijkstras algoritm:

Dijkstras algoritm är en populär algoritm för att lösa många problem med den kortaste vägen från en källa som har en icke-negativ kantvikt i graferna, dvs det är att hitta det kortaste avståndet mellan två hörn på en graf. Det skapades av en holländsk datavetare Edsger W. Dijkstra år 1956.

Algoritmen upprätthåller en uppsättning besökta hörn och en uppsättning obesökta hörn. Den börjar vid källpunkten och väljer iterativt den obesökta hörn med det minsta preliminära avståndet från källan. Den besöker sedan grannarna till denna vertex och uppdaterar deras preliminära avstånd om en kortare väg hittas. Denna process fortsätter tills målpunkten nås, eller tills alla nåbara hörn har besökts.



Behov av Dijkstras algoritm (syfte och användningsfall)

Behovet av Dijkstras algoritm uppstår i många applikationer där det är avgörande att hitta den kortaste vägen mellan två punkter.

Till exempel , Den kan användas i routingprotokollen för datornätverk och även användas av kartsystem för att hitta den kortaste vägen mellan startpunkten och destinationen (som förklaras i Hur fungerar Google Maps? )

Kan Dijkstras algoritm fungera på både riktade och oriktade grafer?

Ja , Dijkstras algoritm kan fungera på både riktade grafer och oriktade grafer eftersom denna algoritm är designad för att fungera på alla typer av grafer så länge den uppfyller kraven för att ha icke-negativa kantvikter och vara ansluten.



  • I en riktad graf, varje kant har en riktning som indikerar färdriktningen mellan de hörn som är förbundna med kanten. I det här fallet följer algoritmen kanternas riktning när man söker efter den kortaste vägen.
  • I en oriktad graf, kanterna har ingen riktning, och algoritmen kan gå både framåt och bakåt längs kanterna när man söker efter den kortaste vägen.

Algoritm för Dijkstras algoritm:

  1. Markera källnoden med ett aktuellt avstånd på 0 och resten med oändlighet.
  2. Ställ in den icke-besökta noden med det minsta strömavståndet som aktuell nod.
  3. För varje granne adderar N av den aktuella noden det aktuella avståndet för den intilliggande noden med vikten av kanten som ansluter 0->1. Om det är mindre än nodens nuvarande avstånd, ställ in det som det nya aktuella avståndet för N.
  4. Markera aktuell nod 1 som besökt.
  5. Gå till steg 2 om det finns några noder som är obesökta.

Hur fungerar Dijkstras algoritm?

Låt oss se hur Dijkstras algoritm fungerar med ett exempel nedan:

Dijkstras algoritm kommer att generera den kortaste vägen från nod 0 till alla andra noder i grafen.

Tänk på nedanstående graf:

Dijkstra

Dijkstras algoritm

Algoritmen kommer att generera den kortaste vägen från nod 0 till alla andra noder i grafen.

För denna graf kommer vi att anta att vikten av kanterna representerar avståndet mellan två noder.

c-kod abs

Som vi kan se att vi har den kortaste vägen från,
Nod 0 till Nod 1, från
Nod 0 till Nod 2, från
Nod 0 till Nod 3, från
Nod 0 till Nod 4, från
Nod 0 till Nod 6.

Till en början har vi en uppsättning resurser som anges nedan:

  • Avståndet från källnoden till sig själv är 0. I det här exemplet är källnoden 0.
  • Avståndet från källnoden till alla andra noder är okänt så vi markerar dem alla som oändliga.

Exempel: 0 -> 0, 1-> ∞,2-> ∞,3-> ∞,4-> ∞,5-> ∞,6-> ∞.

  • vi kommer också att ha en rad obesökta element som kommer att hålla reda på obesökta eller omarkerade noder.
  • Algoritmen kommer att slutföras när alla noder markerade som besökta och avståndet mellan dem läggs till i sökvägen. Obesökta noder:- 0 1 2 3 4 5 6.

Steg 1: Börja från nod 0 och markera nod som besökt eftersom du kan checka in nedanstående bild besökt Nod är rödmarkerad.

Dijkstra

Dijkstras algoritm

Steg 2: Kontrollera om det finns angränsande noder, nu måste vi välja (välj antingen Nod1 med avstånd 2 eller välj antingen Nod 2 med avstånd 6) och välj Nod med minsta avstånd. I detta steg Nod 1 är Minsta avstånd intill noden, så markera den som besökt och addera avståndet.

Avstånd: Nod 0 -> Nod 1 = 2

Dijkstra

Dijkstras algoritm

Steg 3: Gå sedan framåt och kolla efter intilliggande nod som är nod 3, så markera den som besökt och summera avståndet, nu blir avståndet:

Avstånd: Nod 0 -> Nod 1 -> Nod 3 = 2 + 5 = 7

mini verktygsfält excel
Dijkstra

Dijkstras algoritm

Steg 4: Återigen har vi två val för intilliggande noder (antingen kan vi välja nod 4 med avstånd 10 eller antingen kan vi välja nod 5 med avstånd 15) så välj nod med minsta avstånd. I detta steg Nod 4 är Minsta avstånd intill noden, så markera den som besökt och addera avståndet.

Avstånd: Nod 0 -> Nod 1 -> Nod 3 -> Nod 4 = 2 + 5 + 10 = 17

Dijkstra

Dijkstras algoritm

Steg 5: Återigen, gå framåt och kolla efter intilliggande nod som är Nod 6 , så markera det som besökt och addera avståndet, nu blir avståndet:

Avstånd: Nod 0 -> Nod 1 -> Nod 3 -> Nod 4 -> Nod 6 = 2 + 5 + 10 + 2 = 19

Dijkstra

Dijkstras algoritm

resursallokeringsdiagram

Så det kortaste avståndet från källpunkten är 19 vilket är optimalt

Pseudokod för Dijkstras algoritm

funktion Dijkstra(Graf, källa):
// Initiera avstånd till alla noder som oändlighet och till källnoden som 0.

avstånd = karta (alla noder -> oändlighet)

avstånd = 0

// Initiera en tom uppsättning besökta noder och en prioritetskö för att hålla reda på de noder som ska besökas.
besökt = tom uppsättning
kö = ny PriorityQueue()
queue.enqueue(källa, 0)

// Slinga tills alla noder har besökts.
medan kön inte är tom:
// Ta bort noden med det minsta avståndet från prioritetskön.
aktuell = queue.dequeue()

// Om noden redan har besökts, hoppa över den.
om aktuellt besökt:
Fortsätta

// Markera noden som besökt.
visited.add(current)

// Kontrollera alla närliggande noder för att se om deras avstånd behöver uppdateras.
för granne i Graph.neighbors(aktuell):
// Beräkna det preliminära avståndet till grannen genom den aktuella noden.
tentative_distance = avstånd[aktuell] + Graph.distance(aktuell, granne)

// Om det preliminära avståndet är mindre än det aktuella avståndet till grannen, uppdatera avståndet.
om preliminärt_avstånd
avstånd[granne] = preliminärt_avstånd

// Ställ grannen i kö med sitt nya avstånd för att komma i fråga för umgänge i framtiden.
queue.enqueue(granne, avstånd[granne])

// Returnera de beräknade avstånden från källan till alla andra noder i grafen.
retursträckor

Implementering av Dijkstras algoritm:

Det finns flera sätt att implementera Dijkstras algoritm, men de vanligaste är:

  1. Prioritetskö (heap-baserad implementering):
  2. Matrisbaserad implementering:

1. Dijkstras Shortest Path Algorithm använder priority_queue (Heap)

I den här implementeringen får vi en graf och en källpunkt i grafen, som hittar de kortaste vägarna från källan till alla hörn i den givna grafen.

Exempel:

Inmatning: Källa = 0

Exempel

Produktion: Vertex

Vertex Avstånd från källa

0 -> 0
1 -> 2
2 -> 6
3 -> 7
4 -> 17
5 -> 22
6 -> 19

Nedan är algoritmen baserad på ovanstående idé:

  • Initiera avståndsvärdena och prioritetskön.
  • Infoga källnoden i prioritetskön med avstånd 0.
  • Medan prioritetskön inte är tom:
    • Extrahera noden med minsta avstånd från prioritetskön.
    • Uppdatera avstånden för sina grannar om en kortare väg hittas.
    • Infoga uppdaterade grannar i prioritetskön.

Nedan är C++-implementeringen av ovanstående tillvägagångssätt:

C++
// Program to find Dijkstra's shortest path using // priority_queue in STL #include  using namespace std; #define INF 0x3f3f3f3f // iPair ==>Heltal Par typdef par iPair; // Denna klass representerar en riktad graf som använder // adjacency list representation class Graph { int V; // Antal hörn // I en viktad graf måste vi lagra vertex // och viktpar för varje kantlista>* adj; public: Graph(int V); // Constructor // funktion för att lägga till en kant till grafen void addEdge(int u, int v, int w);  // skriver ut kortaste vägen från s void shortestPath(int s); }; // Tilldelar minne för angränsande lista Graph::Graph(int V) { this->V = V;  adj = ny lista [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 kortaste vägarna från källan till alla andra hörn void Graph::shortestPath(int src) { // Skapa en prioritetskö för att lagra hörn som // håller på att förbehandlas. Detta är konstig syntax i C++.  // Se länken nedan för information om denna syntax // https://www.techcodeview.com priority_queue , större > pq;  // Skapa en vektor för avstånd och initiera alla // avstånd som oändlig (INF) vektor dist(V, INF);  // Infoga själva källkoden i prioritetskön och initiera // dess avstånd som 0. pq.push(make_pair(0, src));  dist[källa] = 0;  /* Looping tills prioritetskön blir tom (eller alla avstånd är inte slutförda) */ while (!pq.empty()) { // Den första vertexen i par är det minsta avståndet // vertex, extrahera den från prioritetskön.  // vertexetiketten lagras i andra av paret (det // måste göras på detta sätt för att hålla hörnen // sorterat avstånd (avståndet måste vara första objektet // i par) int u = pq.top().second; pq.pop(); // 'i' används för att få alla intilliggande hörn av en // vertexlista>::iterator i;  for (i = adj[u].begin(); i != adj[u].end(); ++i) { // Få vertexetikett och vikt av nuvarande // intill u.  int v = (*i).först;  int vikt = (*i).sekund;  // Om det är kortad väg till v genom u.  if (avstånd[v]> dist[u] + vikt) { // Uppdatering av avstånd för v dist[v] = dist[u] + vikt;  pq.push(make_pair(avstånd[v], v));  } } } // Skriv ut kortaste avstånd lagrade i dist[] printf('Vertexavstånd från källa
');  för (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{  på tv;  int avstånd;  public Node(int v, int avstånd) { this.v = v;  this.distance = avstånd;  } @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 nod(S, 0));  q.add(ny nod(S, 0));  while (!q.isEmpty()) { Nod n = q.poll();  int v = n.v;  int avstånd = n.avstånd;  besökt[v] = sant;  ArrayList > adjList = adj.get(v);  för (ArrayList adjLink : adjList) { if (besökt[adjLink.get(0)] == false) { if (!map.containsKey(adjLink.get(0))) { map.put( adjLink.get(0), new Node (v, avstånd + adjLink.get(1)));  } else { Node sn = map.get(adjLink.get(0));  if (avstånd + 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 = new 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};  för (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(edge);  map.put(u[i], adjList);  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]);  } adjList2.add(edge2);  map.put(v[i], adjList2);  } för (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));  } }>
Pytonorm
# 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 public Graph(int v) { V = v;  adj = ny lista>[v];  för (int i = 0; i< v; ++i)  adj[i] = new List>();  } // funktion för att lägga till en kant till grafen public void addEdge(int u, int v, int w) { adj[u].Add(Tuple.Create(v, w));  adj[v].Add(Tuple.Create(u, w));  } // skriver ut kortaste vägen från s public void shortestPath(int s) { // Skapa en prioritetskö för att lagra hörn som // förbearbetas.  var pq = ny PriorityQueue>();  // Skapa en vektor för avstånd och initiera alla // avstånd som oändliga (INF) var dist = new int[V];  för (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] + vikt) { // Uppdatering av avstånd för v dist[v] = dist[u] + vikt;  pq.Enqueue(Tuple.Create(dist[v], v));  } } } // Skriv ut kortaste avstånd lagrade i dist[] Console.WriteLine('Vertex Distance from Source');  för (int i = 0; i< V; ++i)  Console.WriteLine('{0}		{1}', i, dist[i]);  } } public class PriorityQueue{ privat skrivskyddad lista_data;  privat skrivskyddad jämförelse_jämfört;  public PriorityQueue(): this(Compare.Default) { } public PriorityQueue(IComparercompare): this(compare.Compare) { } public PriorityQueue(Comparisonjämförelse) { _data = ny lista();  _jämför = jämförelse;  } 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 att pq inte är tomt; upp till anropskoden 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; // End of tree var rightChild = childIndex + 1;  om (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;  } returnera this.queue.shift().element;  } isEmpty() { return this.queue.length === 0;  } } class Graph { constructor(V) { this.V = V;  this.adj = ny Array(V);  för (låt 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();>

Slutligt svar:

Produktion

Komplexitetsanalys av Dijkstra-algoritmen :

  • Tidskomplexitet: O((V + E) log V) , där V är antalet hörn och E är antalet kanter.
  • Hjälputrymme: O(V), där V är antalet hörn och E är antalet kanter i grafen.

2.Array-baserad implementering av Dijkstras algoritm (naiv metod):

Dijkstras algoritm kan också implementeras med hjälp av arrayer utan att använda en prioritetskö. Denna implementering är enkel men kan vara mindre effektiv, särskilt på stora grafer.

Algoritmen fortsätter enligt följande:

sträng till int i java
  • Initiera en array för att lagra avstånd från källan till varje nod.
  • Markera alla noder som obesökta.
  • Ställ in avståndet till källnoden som 0 och oändligt för alla andra noder.
  • Upprepa tills alla noder har besökts:
    • Hitta den obesökta noden med det minsta kända avståndet.
    • För den aktuella noden uppdaterar du avstånden för dess obesökta grannar.
    • Markera den aktuella noden som besökt.

Komplexitetsanalys:

  • Tidskomplexitet: O(V^2) i värsta fall, där V är antalet hörn. Detta kan förbättras till O(V^2) med vissa optimeringar.
  • Hjälputrymme: O(V), där V är antalet hörn och E är antalet kanter i grafen.

Dijkstras algoritmer vs Bellman-Ford algoritm

Dijkstras algoritm och Bellman-Ford algoritm används båda för att hitta den kortaste vägen i en viktad graf, men de har några viktiga skillnader. Här är de viktigaste skillnaderna mellan Dijkstras algoritm och Bellman-Fords algoritm:

Funktion:DijkstrasBellman Ford
Optimeringoptimerad för att hitta den kortaste vägen mellan en enskild källnod och alla andra noder i en graf med icke-negativa kantvikterBellman-Fords algoritm är optimerad för att hitta den kortaste vägen mellan en enskild källnod och alla andra noder i en graf med negativa kantvikter.
AvslappningDijkstras algoritm använder ett girigt tillvägagångssätt där den väljer noden med det minsta avståndet och uppdaterar sina grannarBellman-Ford-algoritmen slappnar av alla kanter i varje iteration och uppdaterar avståndet för varje nod genom att överväga alla möjliga vägar till den noden
TidskomplexitetDijkstras algoritm har en tidskomplexitet på O(V^2) för en tät graf och O(E log V) för en gles graf, där V är antalet hörn och E är antalet kanter i grafen.Bellman-Fords algoritm har en tidskomplexitet av O(VE), där V är antalet hörn och E är antalet kanter i grafen.
Negativa vikterDijkstras algoritm fungerar inte med grafer som har negativa kantvikter, eftersom den antar att alla kantvikter är icke-negativa.Bellman-Fords algoritm kan hantera negativa kantvikter och kan upptäcka negativa viktcykler i grafen.

Dijkstra's Algorithm vs Floyd-Warshall Algorithm

Dijkstras algoritm och Floyd-Warshall algoritm används båda för att hitta den kortaste vägen i en viktad graf, men de har några viktiga skillnader. Här är de viktigaste skillnaderna mellan Dijkstras algoritm och Floyd-Warshall-algoritmen:

Funktion:DijkstrasFloyd-Warshall algoritm
OptimeringOptimerad för att hitta den kortaste vägen mellan en enskild källnod och alla andra noder i en graf med icke-negativa kantvikterFloyd-Warshall-algoritmen är optimerad för att hitta den kortaste vägen mellan alla nodpar i en graf.
MetodDijkstras algoritm är en enkällas kortaste vägsalgoritm som använder ett girigt tillvägagångssätt och beräknar den kortaste vägen från källnoden till alla andra noder i grafen.Floyd-Warshall-algoritmen, å andra sidan, är en kortaste väg-algoritm för alla par som använder dynamisk programmering för att beräkna den kortaste vägen mellan alla par av noder i grafen.
TidskomplexitetDijkstras algoritm har en tidskomplexitet på O(V^2) för en tät graf och O(E log V) för en gles graf, där V är antalet hörn och E är antalet kanter i grafen.Floyd-Warshall-algoritmen, å andra sidan, är en kortaste väg-algoritm för alla par som använder dynamisk programmering för att beräkna den kortaste vägen mellan alla par av noder i grafen.
Negativa vikterDijkstras algoritm fungerar inte med grafer som har negativ kantvikt, eftersom den antar att alla kantvikter är icke-negativa.Floyd-Warshall-algoritmen, å andra sidan, är en kortaste väg-algoritm för alla par som använder dynamisk programmering för att beräkna den kortaste vägen mellan alla par av noder i grafen.

Dijkstras algoritm vs A*-algoritm

Dijkstras algoritm och A*-algoritm används båda för att hitta den kortaste vägen i en viktad graf, men de har några viktiga skillnader. Här är de viktigaste skillnaderna mellan Dijkstras algoritm och A*-algoritm:

Funktion: A* Algoritm
SökteknikOptimerad för att hitta den kortaste vägen mellan en enskild källnod och alla andra noder i ett diagram med icke-negativa kantvikterA*-algoritmen är en informerad sökalgoritm som använder en heuristisk funktion för att styra sökningen mot målnoden.
Heuristisk funktionDijkstras algoritm, använder ingen heuristisk funktion och tar hänsyn till alla noder i grafen.A*-algoritmen använder en heuristisk funktion som uppskattar avståndet från den aktuella noden till målnoden. Denna heuristiska funktion är tillåten, vilket innebär att den aldrig överskattar det faktiska avståndet till målnoden
TidskomplexitetDijkstras algoritm har en tidskomplexitet på O(V^2) för en tät graf och O(E log V) för en gles graf, där V är antalet hörn och E är antalet kanter i grafen.Tidskomplexiteten för A*-algoritmen beror på kvaliteten på den heuristiska funktionen.
AnsökanDijkstras algoritm används i många applikationer som routingalgoritmer, GPS-navigeringssystem och nätverksanalys. A*-algoritmen används ofta i problem med sökvägssökning och grafkorsning, såsom videospel, robotik och planeringsalgoritmer.

Öva problem på Dijkstras algoritm:

  1. Dijkstras algoritm för kortaste vägen | Girig Algo-7
  2. Dijkstras algoritm för representation av grannlistor | Girig Algo-8
  3. Dijkstras algoritm – Priority Queue and Array Implementation
  4. Dijkstras kortaste vägsalgoritm använder set i STL
  5. Dijkstras kortaste vägsalgoritm använder STL i C++
  6. Dijkstras Shortest Path Algorithm använder priority_queue av STL
  7. Dijkstras kortaste vägsalgoritm använder matris i C++
  8. Dijkstras algoritm för enskild källas kortaste väg i en DAG
  9. Dijkstras algoritm med Fibonacci Heap
  10. Dijkstras kortaste vägsalgoritm för riktad graf med negativa vikter
  11. Utskriftsvägar i Dijkstras Shortest Path Algorithm
  12. Dijkstras kortaste vägalgoritm med prioritetskö i Java