logo

Hva er Dijkstras algoritme? | Introduksjon til Dijkstras Shortest Path Algorithm

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

dijkstra-algoritme-(1)



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:

  1. Merk kildenoden med en gjeldende avstand på 0 og resten med uendelig.
  2. Sett den ikke-besøkte noden med den minste strømavstanden som gjeldende node.
  3. 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.
  4. Merk gjeldende node 1 som besøkt.
  5. 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:

Dijkstra

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 syntaks

Som 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.

Dijkstra

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

Dijkstra

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

Dijkstra

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

Dijkstra

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 gb
Dijkstra

Dijkstras 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:

  1. Prioritetskø (heap-basert implementering):
  2. 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økke

Toppunktavstand 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:DijkstrasBellman Ford
Optimaliseringoptimalisert for å finne den korteste veien mellom en enkelt kildenode og alle andre noder i en graf med ikke-negative kantvekterBellman-Ford-algoritmen er optimalisert for å finne den korteste veien mellom en enkelt kildenode og alle andre noder i en graf med negative kantvekter.
AvslapningDijkstras algoritme bruker en grådig tilnærming der den velger noden med den minste avstanden og oppdaterer naboene sineBellman-Ford-algoritmen slapper av alle kanter i hver iterasjon, og oppdaterer avstanden til hver node ved å vurdere alle mulige veier til den noden
TidskompleksitetDijkstras 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 vekterDijkstras 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:DijkstrasFloyd-Warshall-algoritmen
OptimaliseringOptimalisert for å finne den korteste veien mellom en enkelt kildenode og alle andre noder i en graf med ikke-negative kantvekterFloyd-Warshall-algoritmen er optimalisert for å finne den korteste veien mellom alle nodepar i en graf.
TeknikkDijkstras 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.
TidskompleksitetDijkstras 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 vekterDijkstras 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øketeknikkOptimalisert for å finne den korteste veien mellom en enkelt kildenode og alle andre noder i en graf med ikke-negative kantvekterA*-algoritme er en informert søkealgoritme som bruker en heuristisk funksjon for å lede søket mot målnoden.
Heuristisk funksjonDijkstras 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
TidskompleksitetDijkstras 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.
applikasjonDijkstras 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:

  1. Dijkstras korteste vei-algoritme | Grådig Algo-7
  2. Dijkstras algoritme for representasjon av nabolister | Grådig Algo-8
  3. Dijkstras algoritme – prioritert kø og array-implementering
  4. Dijkstras korteste vei-algoritme bruker satt i STL
  5. Dijkstras korteste vei-algoritme bruker STL i C++
  6. Dijkstras korteste vei-algoritme ved hjelp av priority_queue av STL
  7. Dijkstras korteste vei-algoritme ved hjelp av matrise i C++
  8. Dijkstras algoritme for en kildes korteste vei i en DAG
  9. Dijkstras algoritme ved hjelp av Fibonacci Heap
  10. Dijkstras korteste veialgoritme for rettet graf med negative vekter
  11. Utskriftsveier i Dijkstras korteste veialgoritme
  12. Dijkstras korteste veialgoritme med prioritetskø i Java