En aquest article, parlarem d'un dels algorismes de camí més curt més coneguts, és a dir, l'algoritme de camí més curt de Dijkstra, que va ser desenvolupat per l'informàtic holandès Edsger W. Dijkstra el 1956. A més, farem una anàlisi de complexitat per a aquest algorisme i també mireu com es diferencia d'altres algorismes de camí més curt.
Taula de contingut
- Algoritme de Dijkstra
- Necessitat de l'algoritme de Dijkstra (propòsit i casos d'ús)
- L'algoritme de Dijkstra pot funcionar tant en gràfics dirigits com no dirigits?
- Algoritme per a l'algoritme de Dijkstra
- Com funciona l'algoritme de Dijkstra?
- Pseudocodi per a l'algoritme de Dijkstra
- Implementació de l'algoritme de Dijkstra:
- Algoritmes de Dijkstra vs Algoritme Bellman-Ford
- Algoritme de Dijkstra vs algorisme de Floyd-Warshall
- Algoritme de Dijkstra vs algorisme A*
- Practica problemes amb l'algoritme de Dijkstra
- Conclusió:

Algoritme de Dijkstra:
algorisme de Dijkstra és un algorismes popular per resoldre molts problemes de camí més curt d'una sola font amb pes de vora no negatiu als gràfics, és a dir, es tracta de trobar la distància més curta entre dos vèrtexs en un gràfic. Va ser concebut per un informàtic holandès Edsger W. Dijkstra el 1956.
L'algorisme manté un conjunt de vèrtexs visitats i un conjunt de vèrtexs no visitats. Comença al vèrtex font i selecciona iterativament el vèrtex no visitat amb la distància provisional més petita de la font. A continuació, visita els veïns d'aquest vèrtex i actualitza les seves distàncies provisionals si es troba un camí més curt. Aquest procés continua fins que s'arriba al vèrtex de destinació o s'han visitat tots els vèrtexs accessibles.
Necessitat de l'algoritme de Dijkstra (propòsit i casos d'ús)
La necessitat de l'algorisme de Dijkstra sorgeix en moltes aplicacions on trobar el camí més curt entre dos punts és crucial.
Per exemple , Es pot utilitzar en els protocols d'encaminament per a xarxes d'ordinadors i també l'utilitzen els sistemes de mapes per trobar el camí més curt entre el punt de partida i la destinació (tal com s'explica a Com funciona Google Maps? )
L'algoritme de Dijkstra pot funcionar tant en gràfics dirigits com no dirigits?
Sí , l'algoritme de Dijkstra pot funcionar tant en gràfics dirigits com en gràfics no dirigits, ja que aquest algorisme està dissenyat per funcionar en qualsevol tipus de gràfic sempre que compleixi els requisits de tenir pesos de vora no negatius i estar connectat.
- En un gràfic dirigit, cada aresta té una direcció, que indica la direcció del recorregut entre els vèrtexs connectats per l'aresta. En aquest cas, l'algorisme segueix la direcció de les vores quan cerca el camí més curt.
- En un gràfic no dirigit, les vores no tenen direcció, i l'algoritme pot recórrer tant cap endavant com cap enrere al llarg de les vores quan es cerca el camí més curt.
Algoritme per a l'algoritme de Dijkstra:
- Marqueu el node font amb una distància actual de 0 i la resta amb infinit.
- Estableix el node no visitat amb la distància actual més petita com a node actual.
- Per a cada veí, N del node actual afegeix la distància actual del node adjacent amb el pes de la vora que connecta 0->1. Si és menor que la distància actual de Node, establiu-la com la nova distància actual de N.
- Marqueu el node 1 actual com a visitat.
- Aneu al pas 2 si hi ha cap node no visitat.
Com funciona l'algoritme de Dijkstra?
Vegem com funciona l'algoritme de Dijkstra amb un exemple que es mostra a continuació:
L'algoritme de Dijkstra generarà el camí més curt des del node 0 fins a tots els altres nodes del gràfic.
Considereu el gràfic següent:
Algoritme de Dijkstra
L'algorisme generarà el camí més curt des del node 0 fins a tots els altres nodes del gràfic.
Per a aquest gràfic, assumirem que el pes de les arestes representa la distància entre dos nodes.
algorisme de programació round robinCom veiem que tenim el camí més curt des de,
Node 0 al node 1, des de
Node 0 al node 2, des de
Node 0 al node 3, des de
Node 0 al node 4, des de
Del node 0 al node 6.Inicialment tenim un conjunt de recursos que es detallen a continuació:
- La distància des del node font fins a si mateix és 0. En aquest exemple, el node font és 0.
- Es desconeix la distància des del node font fins a tots els altres nodes, així que els marquem tots com a infinit.
Exemple: 0 -> 0, 1-> ∞,2-> ∞,3-> ∞,4-> ∞,5-> ∞,6-> ∞.
- també tindrem una sèrie d'elements no visitats que faran un seguiment dels nodes no visitats o no marcats.
- L'algorisme es completarà quan tots els nodes marcats com a visitats i la distància entre ells s'afegeixin al camí. Nodes no visitats:- 0 1 2 3 4 5 6.
Pas 1: Comenceu des del node 0 i marqueu el node com a visitat, ja que podeu comprovar a sota de la imatge visitada. El node està marcat en vermell.
Algoritme de Dijkstra
Pas 2: Comproveu si hi ha nodes adjacents, ara hem d'opcions (trieu Node1 amb distància 2 o trieu Node 2 amb distància 6) i trieu Node amb distància mínima. En aquest pas Node 1 és la distància mínima del node adjacent, de manera que l'heu marcat com a visitat i sumeu la distància.
Distància: Node 0 -> Node 1 = 2
visualitzador javaAlgoritme de Dijkstra
Pas 3: A continuació, avança i comproveu el node adjacent que és el node 3, de manera que el marqueu com a visitat i sumeu la distància, ara la distància serà:
Distància: Node 0 -> Node 1 -> Node 3 = 2 + 5 = 7
Algoritme de Dijkstra
Pas 4: De nou, tenim dues opcions per als nodes adjacents (o podem triar el node 4 amb la distància 10 o bé podem triar el node 5 amb la distància 15), així que trieu el node amb la distància mínima. En aquest pas Node 4 és la distància mínima del node adjacent, de manera que l'heu marcat com a visitat i sumeu la distància.
Distància: Node 0 -> Node 1 -> Node 3 -> Node 4 = 2 + 5 + 10 = 17
Algoritme de Dijkstra
Pas 5: De nou, avança i comproveu si hi ha un node adjacent Node 6 , així que l'heu marcat com a visitat i sumeu la distància, ara la distància serà:
Distància: Node 0 -> Node 1 -> Node 3 -> Node 4 -> Node 6 = 2 + 5 + 10 + 2 = 19
Algoritme de Dijkstra
Per tant, la distància més curta des del vèrtex font és 19, que és l'òptima
Pseudocodi per a l'algoritme de Dijkstra
funció Dijkstra (gràfic, font):
// Inicialitzar les distàncies a tots els nodes com a infinit, i al node font com a 0.distàncies = mapa (tots els nodes -> infinit)
distàncies = 0
// Inicialitzar un conjunt buit de nodes visitats i una cua de prioritats per fer un seguiment dels nodes a visitar.
visitat = conjunt buit
cua = New PriorityQueue()
queue.enqueue(font, 0)// Bucle fins que s'hagin visitat tots els nodes.
mentre la cua no està buida:
// Treu la cua el node amb la distància més petita de la cua de prioritat.
actual = queue.dequeue()// Si el node ja s'ha visitat, ometeu-lo.
si s'està visitant:
continuar// Marca el node com a visitat.
visited.add(actual)// Comproveu tots els nodes veïns per veure si cal actualitzar les seves distàncies.
per al veí a Graph.neighbors(current):
// Calcula la distància provisional al veí a través del node actual.
prova_distància = distàncies[actual] + Graph.distance(actual, veí)// Si la distància provisional és menor que la distància actual al veí, actualitzeu la distància.
si distància_provintiva
distàncies[veïna] = distància_prova// Posa en cua el veí amb la seva nova distància per ser considerat per a la visita en el futur.
queue.enqueue(veïna, distàncies[veïna])// Retorna les distàncies calculades des de la font fins a la resta de nodes del gràfic.
distàncies de retorn
quina diferència hi ha entre un megabyte i un gigabyte
Implementació de l'algoritme de Dijkstra:
Hi ha diverses maneres d'implementar l'algorisme de Dijkstra, però les més habituals són:
- Cua de prioritats (implementació basada en munt):
- Implementació basada en matrius:
1. L'algoritme del camí més curt de Dijkstra utilitza priority_queue (muntatge)
En aquesta implementació, se'ns dóna un gràfic i un vèrtex font al gràfic, trobant els camins més curts des de la font fins a tots els vèrtexs del gràfic donat.
Exemple:
Entrada: Font = 0
Exemple
Sortida: Vèrtex
Distància del vèrtex des de la font
0 -> 0
1 -> 2
2 -> 6
3 -> 7
4 -> 17
5 -> 22
6 -> 19
A continuació es mostra l'algorisme basat en la idea anterior:
- Inicialitzar els valors de distància i la cua de prioritats.
- Inseriu el node font a la cua de prioritat amb distància 0.
- Mentre la cua de prioritats no estigui buida:
- Extraieu el node amb la distància mínima de la cua de prioritat.
- Actualitzeu les distàncies dels seus veïns si es troba un camí més curt.
- Inseriu els veïns actualitzats a la cua de prioritats.
A continuació es mostra la implementació en C++ de l'enfocament anterior:
C++ // Program to find Dijkstra's shortest path using // priority_queue in STL #include using namespace std; #define INF 0x3f3f3f3f // iPair ==>Parell enter parell typedef iPair; // Aquesta classe representa un gràfic dirigit utilitzant // classe de representació de llista d'adjacència Graph { int V; // Nombre de vèrtexs // En un gràfic ponderat, hem d'emmagatzemar el vèrtex // i el parell de pes per a cada llista d'arestes>> adj; públic: Graph(int V); // Constructor // funció per afegir una vora al gràfic void addEdge(int u, int v, int w); // imprimeix el camí més curt des de s void shortestPath(int s); }; // Assigna memòria per a la llista d'adjacència Graph::Graph(int V) { this->V = V; adj = llista nova [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)); } // Imprimeix els camins més curts des de src a tots els altres vèrtexs void Graph::shortestPath(int src) { // Crea una cua de prioritats per emmagatzemar els vèrtexs que // s'estan preprocessant. Aquesta és una sintaxi estranya en C++. // Consulteu l'enllaç següent per obtenir més informació sobre aquesta sintaxi // https://www.techcodeview.com priority_queue , més gran > pq; // Crea un vector per a distàncies i inicialitza totes les // distàncies com a vector infinit (INF). dist(V, INF); // Insereix la pròpia font a la cua de prioritats i inicialitza // la seva distància com a 0. pq.push(make_pair(0, src)); dist[src] = 0; /* Recorrent fins que la cua de prioritat es buida (o no es finalitzin totes les distàncies) */ while (!pq.empty()) { // El primer vèrtex del parell és la distància mínima // vèrtex, extreu-lo de la cua de prioritats. // L'etiqueta de vèrtex s'emmagatzema en segon de parell (s'ha de fer // d'aquesta manera per mantenir els vèrtexs // distància ordenada (la distància ha de ser el primer element // en parella) int u = pq.top().second; pq.pop(); // 'i' s'utilitza per obtenir tots els vèrtexs adjacents d'una // llista de vèrtexs>::iterador i; for (i = adj[u].begin(); i != adj[u].end(); ++i) { // Obteniu l'etiqueta del vèrtex i el pes de l'actual // adjacent a u. int v = (*i).primer; int pes = (*i).segon; // Si hi ha un camí curt a v a través de u. if (dist[v]> dist[u] + pes) { // Actualització de la distància de v dist[v] = dist[u] + pes; pq.push(make_pair(dist[v], v)); } } } // Imprimeix les distàncies més curtes emmagatzemades a dist[] printf('Distància del vèrtex des de la font
'); per (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 distància; public Node (int v, int distància) { this.v = v; això.distància = distància; } @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[] visitat = new boolean[V]; HashMap mapa = nou HashMap(); PriorityQueueq = nova PriorityQueue(); map.put(S, nou Node(S, 0)); q.add(nou Node(S, 0)); mentre que (!q.isEmpty()) { Node n = q.poll(); int v = n.v; int distància = n.distància; visitat[v] = cert; ArrayList > adjList = adj.get(v); per a (ArrayList adjLink: adjList) { if (visitat[adjLink.get(0)] == fals) { if (!map.containsKey(adjLink.get(0))) { map.put( adjLink.get(0), nou Node (v, distància + adjLink.get(1))); } else { Node sn = map.get(adjLink.get(0)); if (distància + 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 >> mapa = nou 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 }; per (int i = 0; i< E; i++) { ArrayList vora = 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); } per (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; // Constructor public Graph(int v) { V = v; adj = llista nova>[v]; per (int i = 0; i< v; ++i) adj[i] = new List>(); } // funció per afegir una vora al gràfic public void addEdge(int u, int v, int w) { adj[u].Add(Tuple.Create(v, w)); adj[v].Add(Tuple.Create(u, w)); } // imprimeix el camí més curt des de s public void shortestPath(int s) { // Crea una cua de prioritats per emmagatzemar els vèrtexs que // s'estan preprocessant. var pq = New PriorityQueue>(); // Crear un vector per a distàncies i inicialitzar totes les // distàncies com a infinit (INF) var dist = new int[V]; per (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] + pes) { // Actualització de la distància de v dist[v] = dist[u] + pes; pq.Enqueue(Tuple.Create(dist[v], v)); } } } // Imprimeix les distàncies més curtes emmagatzemades a dist[] Console.WriteLine('Vertex Distance from Source'); per (int i = 0; i< V; ++i) Console.WriteLine('{0} {1}', i, dist[i]); } } public class PriorityQueue{ llista privada de només lectura_dades; Comparació privada de només lectura_comparat; public PriorityQueue(): això (Compara.Per defecte) { } public PriorityQueue(IComparercomparar): this(compare.Compare) { } public PriorityQueue(Comparaciócomparació) { _data = llista nova(); _comparar = comparació; } public void Enqueue(T item) { _data.Add(element); var childIndex = _data.Count - 1; while (childIndex> 0) { var parentIndex = (childIndex - 1) / 2; if (_compare(_data[childIndex], _data[parentIndex])>= 0) trenca; T tmp = _data[childIndex]; _data[childIndex] = _data[parentIndex]; _data[parentIndex] = tmp; fillIndex = parentIndex; } } public T Dequeue() { // suposa que pq no està buit; fins al codi de trucada var lastElement = _data.Count - 1; var frontItem = _data[0]; _data[0] = _dades[últimElement]; _data.RemoveAt(últimElement); --últimElement; var parentIndex = 0; while (true) { var childIndex = parentIndex * 2 + 1; if (childIndex> lastElement) trenca; // Final de l'arbre var rightChild = childIndex + 1; si (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.priority - b.priority); } treu la cua () { if (this.isEmpty ()) { retorna nul; } retorna this.queue.shift().element; } isEmpty() { retorna això.queue.length === 0; } } class Graph { constructor(V) { this.V = V; this.adj = new Array (V); per (sigui 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();> Resposta final:

Sortida
característiques d'una sèrie de panda
Anàlisi de complexitat de l'algoritme Dijkstra :
- Complexitat temporal: O((V + E) log V) , on V és el nombre de vèrtexs i E és el nombre d'arestes.
- Espai auxiliar: O(V), on V és el nombre de vèrtexs i E és el nombre d'arestes del gràfic.
2.Implementació basada en matrius de l'algoritme de Dijkstra (enfocament ingenu):
L'algoritme de Dijkstra també es pot implementar mitjançant matrius sense utilitzar una cua de prioritats. Aquesta implementació és senzilla però pot ser menys eficient, especialment en gràfics grans.
L'algorisme procedeix de la següent manera:
- Inicialitzar una matriu per emmagatzemar distàncies des de la font fins a cada node.
- Marqueu tots els nodes com a no visitats.
- Estableix la distància al node font com a 0 i infinit per a la resta de nodes.
- Repetiu fins que es visitin tots els nodes:
- Trobeu el node no visitat amb la distància coneguda més petita.
- Per al node actual, actualitzeu les distàncies dels seus veïns no visitats.
- Marca el node actual com a visitat.
Anàlisi de complexitat:
- Complexitat temporal: O(V^2) en el pitjor dels casos, on V és el nombre de vèrtexs. Això es pot millorar a O(V^2) amb algunes optimitzacions.
- Espai auxiliar: O(V), on V és el nombre de vèrtexs i E és el nombre d'arestes del gràfic.
Algoritmes de Dijkstra vs Algoritme Bellman-Ford
algorisme de Dijkstra i Algorisme de Bellman-Ford ambdós s'utilitzen per trobar el camí més curt en un gràfic ponderat, però tenen algunes diferències clau. Aquestes són les principals diferències entre l'algorisme de Dijkstra i l'algorisme de Bellman-Ford:
| Característica: | Dijkstra's | Bellman Ford |
|---|---|---|
| Optimització | optimitzat per trobar el camí més curt entre un sol node font i tots els altres nodes en un gràfic amb pesos de vora no negatius | L'algorisme de Bellman-Ford està optimitzat per trobar el camí més curt entre un sol node font i tots els altres nodes en un gràfic amb pesos de vora negatiu. |
| Relaxació | L'algorisme de Dijkstra utilitza un enfocament cobdiciós on tria el node amb la distància més petita i actualitza els seus veïns | l'algorisme de Bellman-Ford relaxa totes les vores en cada iteració, actualitzant la distància de cada node tenint en compte tots els camins possibles cap a aquest node |
| Complexitat temporal | L'algorisme de Dijkstra té una complexitat temporal de O(V^2) per a un gràfic dens i O(E log V) per a un gràfic escàs, on V és el nombre de vèrtexs i E és el nombre d'arestes del gràfic. | L'algorisme de Bellman-Ford té una complexitat temporal de O(VE), on V és el nombre de vèrtexs i E és el nombre d'arestes del gràfic. |
| Pesos negatius | L'algoritme de Dijkstra no funciona amb gràfics que tenen pesos de vora negatius, ja que suposa que tots els pesos de vora no són negatius. | L'algoritme de Bellman-Ford pot gestionar els pesos de vora negatiu i pot detectar cicles de pes negatius al gràfic. |
Algoritme de Dijkstra vs algorisme de Floyd-Warshall
algorisme de Dijkstra i Algorisme de Floyd-Warshall ambdós s'utilitzen per trobar el camí més curt en un gràfic ponderat, però tenen algunes diferències clau. Aquestes són les principals diferències entre l'algorisme de Dijkstra i l'algoritme de Floyd-Warshall:
| Característica: | Dijkstra's | Algoritme de Floyd-Warshall |
|---|---|---|
| Optimització | Optimitzat per trobar el camí més curt entre un sol node font i tots els altres nodes en un gràfic amb pesos de vora no negatius | L'algorisme de Floyd-Warshall està optimitzat per trobar el camí més curt entre tots els parells de nodes d'un gràfic. |
| Tècnica | L'algorisme de Dijkstra és un algorisme del camí més curt d'una sola font que utilitza un enfocament cobdiciós i calcula el camí més curt des del node font fins a la resta de nodes del gràfic. | L'algorisme de Floyd-Warshall, d'altra banda, és un algorisme del camí més curt de tots els parells que utilitza programació dinàmica per calcular el camí més curt entre tots els parells de nodes del gràfic. |
| Complexitat temporal | L'algorisme de Dijkstra té una complexitat temporal de O(V^2) per a un gràfic dens i O(E log V) per a un gràfic escàs, on V és el nombre de vèrtexs i E és el nombre d'arestes del gràfic. | L'algorisme de Floyd-Warshall, d'altra banda, és un algorisme del camí més curt de tots els parells que utilitza programació dinàmica per calcular el camí més curt entre tots els parells de nodes del gràfic. |
| Pesos negatius | L'algoritme de Dijkstra no funciona amb gràfics que tenen pesos de vora negatius, ja que suposa que tots els pesos de vora no són negatius. | L'algorisme de Floyd-Warshall, d'altra banda, és un algorisme del camí més curt de tots els parells que utilitza programació dinàmica per calcular el camí més curt entre tots els parells de nodes del gràfic. |
Algoritme de Dijkstra vs algorisme A*
algorisme de Dijkstra i Algorisme A* ambdós s'utilitzen per trobar el camí més curt en un gràfic ponderat, però tenen algunes diferències clau. Aquestes són les principals diferències entre l'algorisme de Dijkstra i l'algorisme A*:
| Característica: | A* Algorisme | |
|---|---|---|
| Tècnica de cerca | Optimitzat per trobar el camí més curt entre un sol node font i tots els altres nodes en un gràfic amb pesos de vora no negatius | L'algorisme A* és un algorisme de cerca informat que utilitza una funció heurística per guiar la cerca cap al node objectiu. |
| Funció heurística | L'algorisme de Dijkstra, no utilitza cap funció heurística i considera tots els nodes del gràfic. | L'algorisme A* utilitza una funció heurística que estima la distància des del node actual fins al node objectiu. Aquesta funció heurística és admissible, el que significa que mai sobreestima la distància real al node objectiu |
| Complexitat temporal | L'algorisme de Dijkstra té una complexitat temporal de O(V^2) per a un gràfic dens i O(E log V) per a un gràfic escàs, on V és el nombre de vèrtexs i E és el nombre d'arestes del gràfic. | La complexitat temporal de l'algorisme A* depèn de la qualitat de la funció heurística. |
| Aplicació | L'algoritme de Dijkstra s'utilitza en moltes aplicacions com ara algorismes d'encaminament, sistemes de navegació GPS i anàlisi de xarxes. | . L'algoritme A* s'utilitza habitualment en problemes de traçat de camins i gràfics, com ara videojocs, robòtica i algorismes de planificació. |
Problemes de pràctica sobre l'algoritme de Dijkstra:
- Algorisme del camí més curt de Dijkstra | Greedy Algo-7
- Algoritme de Dijkstra per a la representació de la llista d'adjacència | Greedy Algo-8
- Algoritme de Dijkstra: implementació de cua i matriu de prioritats
- L'algorisme del camí més curt de Dijkstra utilitza set en STL
- L'algorisme del camí més curt de Dijkstra utilitza STL en C++
- L'algoritme del camí més curt de Dijkstra utilitza priority_queue de STL
- L'algorisme del camí més curt de Dijkstra utilitza matriu en C++
- Algoritme de Dijkstra per al camí més curt d'una sola font en un DAG
- Algoritme de Dijkstra utilitzant Fibonacci Heap
- Algorisme del camí més curt de Dijkstra per a gràfics dirigits amb pesos negatius
- Imprimir camins a l'algoritme del camí més curt de Dijkstra
- L'algoritme del camí més curt de Dijkstra amb cua de prioritats a Java




