logo

Hvad er Dijkstras algoritme? | Introduktion til Dijkstra's Shortest Path Algorithm

I denne artikel vil vi diskutere en af ​​de mest almindeligt kendte shortest-path algoritmer, dvs. Dijkstra's Shortest Path Algorithm, som blev udviklet af den hollandske datalog Edsger W. Dijkstra i 1956. Desuden vil vi lave en kompleksitetsanalyse for denne algoritme og også se, hvordan den adskiller sig fra andre korteste vej-algoritmer.

Indholdsfortegnelse

dijkstra-algoritme-(1)



Dijkstras algoritme:

Dijkstras algoritme er en populær algoritme til at løse mange enkelt-kilde korteste vej problemer med ikke-negativ kantvægt i graferne, dvs. det er at finde den korteste afstand mellem to hjørner på en graf. Det blev udtænkt af hollandsk datalog Edsger W. Dijkstra i 1956.

Algoritmen opretholder et sæt besøgte hjørner og et sæt ubesøgte hjørner. Den starter ved kildepunktet og vælger iterativt det ubesøgte toppunkt med den mindste foreløbige afstand fra kilden. Den besøger derefter naboerne til dette vertex og opdaterer deres foreløbige afstande, hvis der findes en kortere vej. Denne proces fortsætter, indtil destinationens toppunkt er nået, eller alle tilgængelige toppunkter er blevet besøgt.

Behov for Dijkstras algoritme (formål og anvendelsesmuligheder)

Behovet for Dijkstras algoritme opstår i mange applikationer, hvor det er afgørende at finde den korteste vej mellem to punkter.

For eksempel , Den kan bruges i routingprotokollerne til computernetværk og også bruges af kortsystemer til at finde den korteste vej mellem startpunktet og destinationen (som forklaret i Hvordan fungerer Google Maps? )

Kan Dijkstras algoritme arbejde på både rettet og urettet grafer?

Ja , Dijkstras algoritme kan arbejde på både rettede grafer og urettede grafer, da denne algoritme er designet til at fungere på enhver type graf, så længe den opfylder kravene til at have ikke-negative kantvægte og være forbundet.

  • I en rettet graf, hver kant har en retning, der angiver kørselsretningen mellem de hjørner, der er forbundet med kanten. I dette tilfælde følger algoritmen retningen af ​​kanterne, når der søges efter den korteste vej.
  • I en urettet graf, kanterne har ingen retning, og algoritmen kan krydse både frem og tilbage langs kanterne, når man søger efter den korteste vej.

Algoritme til Dijkstras algoritme:

  1. Markér kildenoden med en aktuel afstand på 0 og resten med uendelig.
  2. Indstil den ikke-besøgte node med den mindste aktuelle afstand som den aktuelle node.
  3. For hver nabo tilføjer N af den aktuelle node den aktuelle afstand af den tilstødende node med vægten af ​​kanten, der forbinder 0->1. Hvis den er mindre end nodens aktuelle afstand, skal den indstilles som den nye aktuelle afstand for N.
  4. Marker den aktuelle node 1 som besøgt.
  5. Gå til trin 2, hvis der er nogen noder, der ikke er besøgt.

Hvordan virker Dijkstras algoritme?

Lad os se, hvordan Dijkstras algoritme fungerer med et eksempel nedenfor:

Dijkstras algoritme vil generere den korteste vej fra node 0 til alle andre noder i grafen.

Overvej nedenstående graf:

Dijkstra

Dijkstras algoritme

Algoritmen vil generere den korteste vej fra node 0 til alle de andre noder i grafen.

For denne graf vil vi antage, at vægten af ​​kanterne repræsenterer afstanden mellem to noder.

autocad stretch kommando

Som vi kan se, har vi den korteste vej 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 første omgang har vi et sæt ressourcer, der er angivet nedenfor:

  • Afstanden fra kildenoden til sig selv er 0. I dette eksempel er kildenoden 0.
  • Afstanden fra kildenoden til alle andre knudepunkter er ukendt, så vi markerer dem alle som uendelige.

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

  • Vi har også en række ubesøgte elementer, der vil holde styr på ubesøgte eller umarkerede noder.
  • Algoritmen fuldføres, når alle noder markeret som besøgte og afstanden mellem dem tilføjet til stien. Ubesøgte noder:- 0 1 2 3 4 5 6.

Trin 1: Start fra Node 0 og marker Node som besøgt, da du kan tjekke ind nedenfor billede besøgt Node er markeret med rødt.

Dijkstra

Dijkstras algoritme

Trin 2: Tjek for tilstødende noder, nu skal vi vælge (Vælg enten Node1 med afstand 2 eller vælg enten Node 2 med afstand 6) og vælg Node med minimumsafstand. I dette trin Node 1 er Minimumsafstand ved siden af ​​Node, så marker den som besøgt og læg afstanden sammen.

Afstand: Node 0 -> Node 1 = 2

Dijkstra

Dijkstras algoritme

Trin 3: Gå derefter fremad og tjek for tilstødende node, som er node 3, så marker den som besøgt og læg afstanden sammen, nu bliver afstanden:

Afstand: Node 0 -> Node 1 -> Node 3 = 2 + 5 = 7

Dijkstra

Dijkstras algoritme

Trin 4: Igen har vi to valgmuligheder for tilstødende noder (enten kan vi vælge node 4 med afstand 10 eller enten kan vi vælge node 5 med afstand 15), så vælg node med minimum afstand. I dette trin Node 4 er Minimumsafstand ved siden af ​​Node, så marker den som besøgt og læg afstanden sammen.

Afstand: Node 0 -> Node 1 -> Node 3 -> Node 4 = 2 + 5 + 10 = 17

Dijkstra

Dijkstras algoritme

Trin 5: Igen, bevæg dig fremad og kontroller for tilstødende node, som er Node 6 , så marker det som besøgt og læg afstanden sammen. Nu bliver afstanden:

Afstand: Node 0 -> Node 1 -> Node 3 -> Node 4 -> Node 6 = 2 + 5 + 10 + 2 = 19

streng tilføje
Dijkstra

Dijkstras algoritme

Så den korteste afstand fra kildepunktet er 19, hvilket er optimalt

Pseudokode for Dijkstras algoritme

funktion Dijkstra(Graf, kilde):
// Initialiser afstande til alle noder som uendeligt og til kildenoden som 0.

afstande = kort (alle noder -> uendelig)

afstande = 0

// Initialiser et tomt sæt af besøgte noder og en prioritetskø for at holde styr på de noder, der skal besøges.
besøgt = tomt sæt
kø = ny PriorityQueue()
queue.enqueue(kilde, 0)

// Loop indtil alle noder er besøgt.
mens køen ikke er tom:
// Sæt den node i kø med den mindste afstand fra prioritetskøen.
nuværende = queue.dequeue()

np polstring

// Hvis noden allerede er besøgt, skal du springe den over.
hvis aktuelle i besøgt:
Blive ved

// Marker noden som besøgt.
visited.add(aktuel)

// Tjek alle tilstødende noder for at se, om deres afstande skal opdateres.
for nabo i Graph.neighbors(nuværende):
// Beregn den foreløbige afstand til naboen gennem den aktuelle knude.
tentative_distance = distancer[aktuel] + Graph.distance(aktuel, nabo)

// Hvis den foreløbige afstand er mindre end den aktuelle afstand til naboen, skal du opdatere afstanden.
hvis foreløbig_afstand
afstande[nabo] = foreløbig_afstand

// Stil naboen i kø med sin nye afstand for at komme i betragtning til samvær i fremtiden.
queue.enqueue(nabo, afstande[nabo])

// Returner de beregnede afstande fra kilden til alle andre knudepunkter i grafen.
returafstande

Implementering af Dijkstras algoritme:

Der er flere måder at implementere Dijkstras algoritme på, men de mest almindelige er:

  1. Prioritetskø (heap-baseret implementering):
  2. Array-baseret implementering:

1. Dijkstra's Shortest Path Algorithm ved hjælp af priority_queue (Heap)

I denne implementering får vi en graf og et kildepunkt i grafen, der finder de korteste veje fra kilden til alle hjørner i den givne graf.

Eksempel:

Input: Kilde = 0

Eksempel

Produktion: Vertex

forudbestil traversering

Toppunkt afstand fra kilde

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

Nedenfor er algoritmen baseret på ovenstående idé:

  • Initialiser afstandsværdierne og prioritetskøen.
  • Indsæt kildenoden i prioritetskøen med afstand 0.
  • Mens prioritetskøen ikke er tom:
    • Udpak noden med den mindste afstand fra prioritetskøen.
    • Opdater afstandene til sine naboer, hvis der findes en kortere vej.
    • Indsæt opdaterede naboer i prioritetskøen.

Nedenfor er C++-implementeringen af ​​ovenstående tilgang:

C++
// Program to find Dijkstra's shortest path using // priority_queue in STL #include  using namespace std; #define INF 0x3f3f3f3f // iPair ==>Heltal Par typedef par iPair; // Denne klasse repræsenterer en rettet graf ved hjælp af // adjacency list repræsentationsklasse Graph { int V; // Antal hjørner // I en vægtet graf skal vi gemme toppunkter // og vægtpar for hver kantliste>* adj; public: Graph(int V); // Konstruktør // funktion til at tilføje en kant til grafen void addEdge(int u, int v, int w);  // udskriver korteste vej fra s void shortestPath(int s); }; // Tildeler hukommelse til tilgrænsende 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)); } // Udskriver korteste stier fra src til alle andre vertices void Graph::shortestPath(int src) { // Opret en prioritetskø for at gemme vertices, der // er ved at blive forbehandlet. Dette er mærkelig syntaks i C++.  // Se nedenstående link for detaljer om denne syntaks // https://www.techcodeview.com priority_queue , større > pq;  // Opret en vektor for afstande og initialiser alle // afstande som uendelig (INF) vektor dist(V, INF);  // Indsæt selve kilden i prioritetskøen og initialiser // dens afstand som 0. pq.push(make_pair(0, src));  dist[kilde] = 0;  /* Looping indtil prioritetskøen bliver tom (eller alle afstande er ikke afsluttet) */ while (!pq.empty()) { // Det første vertex i par er minimumafstanden // vertex, udtræk det fra prioritetskøen.  // vertex label er gemt i anden af ​​par (det // skal gøres på denne måde for at holde hjørnerne // sorteret afstand (afstand skal være første element // i par) int u = pq.top().second; pq.pop(); // 'i' bruges til at få alle tilstødende hjørner af en // vertexliste>::iterator i;  for (i = adj[u].begin(); i != adj[u].end(); ++i) { // Få toppunkts-etiket og vægten af ​​nuværende // ved siden af ​​u.  int v = (*i).først;  int vægt = (*i).sekund;  // Hvis der er kort vej til v gennem u.  if (dist[v]> dist[u] + vægt) { // Opdatering af afstand af v dist[v] = dist[u] + vægt;  pq.push(make_pair(dist[v], v));  } } } // Udskriv korteste afstande gemt i dist[] printf('Handpunktsafstand fra kilde
');  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 afstand;  public Node(int v, int distance) { this.v = v;  denne.afstand = afstand;  } @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[] visited = 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 afstand = n.afstand;  besøgt[v] = sand;  ArrayList > adjList = adj.get(v);  for (ArrayList adjLink : adjList) { if (besøgt[adjLink.get(0)] == falsk) { if (!map.containsKey(adjLink.get(0))) { map.put( adjLink.get(0), new Node (v, distance + adjLink.get(1)));  } andet { Node sn = map.get(adjLink.get(0));  if (afstand + 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};  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();  } andet { adjList = map.get(u[i]);  } adjList.add(kant);  map.put(u[i], adjList);  ArrayList kant2 = ny ArrayList();  kant2.add(u[i]);  kant2.add(w[i]);  ArrayList > adjList2;  if (!map.containsKey(v[i])) { adjList2 = new ArrayList();  } andet { adjList2 = map.get(v[i]);  } adjList2.add(kant2);  map.put(v[i], adjList2);  } 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>();  } // funktion til at tilføje en kant til graf public void addEdge(int u, int v, int w) { adj[u].Add(Tuple.Create(v, w));  adj[v].Add(Tuple.Create(u, w));  } // udskriver den korteste sti fra s public void shortestPath(int s) { // Opret en prioritetskø for at gemme hjørner, der // er ved at blive forbehandlet.  var pq = ny PriorityQueue>();  // Opret en vektor for afstande og initialiser alle // afstande som uendelige (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] + vægt) { // Opdatering af afstand af v dist[v] = dist[u] + vægt;  pq.Enqueue(Tuple.Create(dist[v], v));  } } } // Udskriv korteste afstande gemt i dist[] Console.WriteLine('Vertex afstand fra kilde');  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;  public PriorityQueue(): dette(Sammenlign.Standard) { } public 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() { // antager, at pq ikke er tom; op til kaldekode 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;  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 (lad 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();>

Endeligt svar:

Produktion

Kompleksitetsanalyse af Dijkstra-algoritmen :

  • Tidskompleksitet: O((V + E) log V) , hvor V er antallet af hjørner og E er antallet af kanter.
  • Hjælpeplads: O(V), hvor V er antallet af hjørner og E er antallet af kanter i grafen.

2.Array-baseret implementering af Dijkstras algoritme (naiv tilgang):

Dijkstras algoritme kan også implementeres ved hjælp af arrays uden brug af en prioritetskø. Denne implementering er ligetil, men kan være mindre effektiv, især på store grafer.

Algoritmen forløber som følger:

  • Initialiser et array for at gemme afstande fra kilden til hver knude.
  • Marker alle noder som ubesøgte.
  • Indstil afstanden til kildenoden til 0 og uendelig for alle andre knudepunkter.
  • Gentag indtil alle noder er besøgt:
    • Find den ubesøgte node med den mindste kendte afstand.
    • For den aktuelle node skal du opdatere afstandene for dens ubesøgte naboer.
    • Marker den aktuelle node som besøgt.

Kompleksitetsanalyse:

  • Tidskompleksitet: O(V^2) i værste fald, hvor V er antallet af hjørner. Dette kan forbedres til O(V^2) med nogle optimeringer.
  • Hjælpeplads: O(V), hvor V er antallet af hjørner og E er antallet af kanter i grafen.

Dijkstra's Algoritmer vs Bellman-Ford Algorithm

Dijkstras algoritme og Bellman-Ford algoritme bruges begge til at finde den korteste vej i en vægtet graf, men de har nogle vigtige forskelle. Her er de vigtigste forskelle mellem Dijkstras algoritme og Bellman-Ford algoritme:

Funktion:DijkstrasBellman Ford
Optimeringoptimeret til at finde den korteste vej mellem en enkelt kildeknude og alle andre knudepunkter i en graf med ikke-negative kantvægteBellman-Ford-algoritmen er optimeret til at finde den korteste vej mellem en enkelt kildeknude og alle andre knudepunkter i en graf med negative kantvægte.
LempelseDijkstras algoritme bruger en grådig tilgang, hvor den vælger noden med den mindste afstand og opdaterer sine naboerBellman-Ford-algoritmen slapper af alle kanter i hver iteration og opdaterer afstanden for hver knude ved at overveje alle mulige stier til den knude
TidskompleksitetDijkstras algoritme har en tidskompleksitet på O(V^2) for en tæt graf og O(E log V) for en sparsom graf, hvor V er antallet af hjørner og E er antallet af kanter i grafen.Bellman-Ford-algoritmen har en tidskompleksitet på O(VE), hvor V er antallet af hjørner og E er antallet af kanter i grafen.
Negative vægteDijkstras algoritme virker ikke med grafer, der har negative kantvægte, da den antager, at alle kantvægte er ikke-negative.Bellman-Ford-algoritmen kan håndtere negative kantvægte og kan registrere negative vægtcyklusser i grafen.

Dijkstra's Algorithm vs Floyd-Warshall Algorithm

Dijkstras algoritme og Floyd-Warshall algoritme bruges begge til at finde den korteste vej i en vægtet graf, men de har nogle vigtige forskelle. Her er de vigtigste forskelle mellem Dijkstras algoritme og Floyd-Warshall-algoritme:

Funktion:DijkstrasFloyd-Warshall algoritme
OptimeringOptimeret til at finde den korteste vej mellem en enkelt kildeknude og alle andre knudepunkter i en graf med ikke-negative kantvægteFloyd-Warshall-algoritmen er optimeret til at finde den korteste vej mellem alle nodepar i en graf.
TeknikDijkstras algoritme er en enkelt-kilde korteste vej-algoritme, der bruger en grådig tilgang og beregner den korteste vej fra kildenoden til alle andre knudepunkter i grafen.Floyd-Warshall-algoritmen er på den anden side en korteste vej-algoritme med alle par, der bruger dynamisk programmering til at beregne den korteste vej mellem alle par af noder i grafen.
TidskompleksitetDijkstras algoritme har en tidskompleksitet på O(V^2) for en tæt graf og O(E log V) for en sparsom graf, hvor V er antallet af hjørner og E er antallet af kanter i grafen.Floyd-Warshall-algoritmen er på den anden side en korteste vej-algoritme med alle par, der bruger dynamisk programmering til at beregne den korteste vej mellem alle par af noder i grafen.
Negative vægteDijkstras algoritme virker ikke med grafer, der har negative kantvægte, da den antager, at alle kantvægte er ikke-negative.Floyd-Warshall-algoritmen er på den anden side en korteste vej-algoritme med alle par, der bruger dynamisk programmering til at beregne den korteste vej mellem alle par af noder i grafen.

Dijkstras algoritme vs A* algoritme

Dijkstras algoritme og A* algoritme bruges begge til at finde den korteste vej i en vægtet graf, men de har nogle vigtige forskelle. Her er de vigtigste forskelle mellem Dijkstras algoritme og A*-algoritme:

Funktion: A* Algoritme
SøgeteknikOptimeret til at finde den korteste vej mellem en enkelt kildeknude og alle andre knudepunkter i en graf med ikke-negative kantvægteA*-algoritme er en informeret søgealgoritme, der bruger en heuristisk funktion til at guide søgningen mod målknuden.
Heuristisk funktionDijkstras algoritme, bruger ikke nogen heuristisk funktion og betragter alle knudepunkterne i grafen.A*-algoritmen bruger en heuristisk funktion, der estimerer afstanden fra den aktuelle knude til målknuden. Denne heuristiske funktion er tilladt, hvilket betyder, at den aldrig overvurderer den faktiske afstand til målknudepunktet
TidskompleksitetDijkstras algoritme har en tidskompleksitet på O(V^2) for en tæt graf og O(E log V) for en sparsom graf, hvor V er antallet af hjørner og E er antallet af kanter i grafen.Tidskompleksiteten af ​​A*-algoritmen afhænger af kvaliteten af ​​den heuristiske funktion.
AnsøgningDijkstras algoritme bruges i mange applikationer såsom routingalgoritmer, GPS-navigationssystemer og netværksanalyse. A*-algoritme er almindeligt anvendt i stifinding og grafgennemløbsproblemer, såsom videospil, robotteknologi og planlægningsalgoritmer.

Øv problemer på Dijkstras algoritme:

  1. Dijkstras korteste vejs algoritme | Grådige Algo-7
  2. Dijkstras algoritme for tilgrænsende listerepræsentation | Grådige Algo-8
  3. Dijkstras algoritme - Priority Queue and Array Implementation
  4. Dijkstras korteste vejs algoritme ved hjælp af sæt i STL
  5. Dijkstras korteste vejs algoritme ved hjælp af STL i C++
  6. Dijkstras Shortest Path Algorithm ved hjælp af priority_queue af STL
  7. Dijkstras korteste vejs algoritme ved hjælp af matrix i C++
  8. Dijkstras algoritme for en enkelt kildes korteste vej i en DAG
  9. Dijkstras algoritme ved hjælp af Fibonacci Heap
  10. Dijkstras korteste vejs algoritme til rettet graf med negative vægte
  11. Udskrivningsstier i Dijkstra's Shortest Path Algorithm
  12. Dijkstras korteste vej-algoritme med prioritetskø i Java