Você está na página 1de 4

Algoritmo de Dijkstra

El algoritmo de Dijkstra, también llamado


algoritmo de caminos mínimos, es un Algoritmo de Dijkstra
algoritmo para la determinación del camino más
corto, dado un vértice origen, hacia el resto de los
vértices en un grafo que tiene pesos en cada
arista. Su nombre alude a Edsger Dijkstra,
científico de la computación de los Países Bajos
que lo describió por primera vez en 1959.
[cita requerida]

La idea subyacente en este algoritmo consiste en


ir explorando todos los caminos más cortos que
parten del vértice origen y que llevan a todos los
demás vértices; cuando se obtiene el camino más Ejecución del algoritmo de Dijkstra
corto desde el vértice origen hasta el resto de los Tipo Algoritmo de búsqueda
vértices que componen el grafo, el algoritmo se
Problema que Problema del camino más
detiene. Se trata de una especialización de la
resuelve corto
búsqueda de costo uniforme y, como tal, no
Estructura de Grafo
funciona en grafos con aristas de coste negativo
datos
(al elegir siempre el nodo con distancia menor,
pueden quedar excluidos de la búsqueda nodos Creador Edsger Dijkstra
que en próximas iteraciones bajarían el costo Fecha 1959
general del camino al pasar por una arista con Clase de P
costo negativo).[cita requerida] complejidad
Tiempo de ejecución
Una de sus aplicaciones más importantes reside
Peor caso
en el campo de la telemática. Gracias a él, es
posible resolver grafos con muchos nodos, lo que
sería muy complicado resolver sin dicho algoritmo, encontrando así las rutas más cortas entre un
origen y todos los destinos en una red.[cita requerida]

Índice
Algoritmo
Complejidad
Pseudocódigo
Otra versión en pseudocódigo sin cola de prioridad
Véase también
Enlaces externos

Algoritmo
Teniendo un grafo dirigido ponderado de N nodos no aislados, sea x el nodo inicial. Un vector D de
tamaño N guardará al final del algoritmo las distancias desde x hasta el resto de los nodos.
1. Inicializar todas las distancias en D con un valor infinito relativo, ya que son desconocidas al
principio, exceptuando la de x, que se debe colocar en 0, debido a que la distancia de x a x
sería 0.
2. Sea a = x (Se toma a como nodo actual.)
3. Se recorren todos los nodos adyacentes de a, excepto los nodos marcados. Se les llamará
nodos no marcados vi.
4. Para el nodo actual, se calcula la distancia tentativa desde dicho nodo hasta sus vecinos con
la siguiente fórmula: dt(vi) = Da + d(a,vi). Es decir, la distancia tentativa del nodo ‘vi’ es la
distancia que actualmente tiene el nodo en el vector D más la distancia desde dicho nodo ‘a’
(el actual) hasta el nodo vi. Si la distancia tentativa es menor que la distancia almacenada en
el vector, entonces se actualiza el vector con esta distancia tentativa. Es decir, si dt(vi) < Dvi →
Dvi = dt(vi)
5. Se marca como completo el nodo a.
6. Se toma como próximo nodo actual el de menor valor en D (puede hacerse almacenando los
valores en una cola de prioridad) y se regresa al paso 3, mientras existan nodos no marcados.
Una vez terminado al algoritmo, D estará completamente lleno.

Complejidad
Orden de complejidad del algoritmo:

O(|V|2+|A|) = O(|V|2), sin utilizar cola de prioridad, :O((|A|+|V|) log |V|) = O(|A| log |V|)
utilizando cola de prioridad (por ejemplo, un montículo de Fibonacci). Por otro lado, si se
utiliza un montículo de Fibonacci, sería O(|V| log |V|+|A|).

La complejidad computacional del algoritmo de Dijkstra se puede calcular contando las


operaciones realizadas:

El algoritmo consiste en n-1 iteraciones, como máximo. En cada iteración, se añade un vértice
al conjunto distinguido.
En cada iteración, se identifica el vértice con la menor etiqueta entre los que no están en Sk.
El número de estas operaciones está acotado por n-1.
Además, se realizan una suma y una comparación para actualizar la etiqueta de cada uno de
los vértices que no están en Sk.
Luego, en cada iteración se realizan a lo sumo 2(n-1) operaciones.

Entonces:

Teorema: El algoritmo de Dijkstra realiza O(n2) operaciones (sumas y comparaciones) para


determinar la longitud del camino más corto entre dos vértices de un grafo ponderado simple,
conexo y no dirigido con n vértices.

En general:

Tiempo de ejecución = O(|A|.𝑻_𝒅𝒌+|v|.𝑻_𝒅𝒎)


|A|: Número de aristas
𝑻_𝒅𝒌: Complejidad de disminuir clave
|V|: Numero de vértices
𝑻_𝒅𝒎: Complejidad de extraer mínimo

Pseudocódigo
Estructura de datos auxiliar: Q = Estructura de datos cola de prioridad (se puede implementar con
un montículo)

DIJKSTRA (Grafo G, nodo_fuente s)


para u ∈ V[G] hacer
distancia[u] = INFINITO
padre[u] = NULL
visto[u] = false
distancia[s] = 0
adicionar (cola, (s, distancia[s]))
mientras que cola no es vacía hacer
u = extraer_mínimo(cola)
visto[u] = true
para todos v ∈ adyacencia[u] hacer
si ¬ visto[u]
si distancia[v] > distancia[u] + peso (u, v) hacer
distancia[v] = distancia[u] + peso (u, v)
padre[v] = u
adicionar(cola,(v, distancia[v]))

Otra versión en pseudocódigo sin cola de prioridad


función Dijkstra (Grafo G, nodo_salida s)
//Usaremos un vector para guardar las distancias del nodo salida al resto
entero distancia[n]
//Inicializamos el vector con distancias iniciales
booleano visto[n]
//vector de boleanos para controlar los vértices de los que ya tenemos la distancia mínima
para cada w ∈ V[G] hacer
Si (no existe arista entre s y w) entonces
distancia[w] = Infinito //puedes marcar la casilla con un -1 por ejemplo
Si_no
distancia[w] = peso (s, w)
fin si
fin para
distancia[s] = 0
visto[s] = cierto
//n es el número de vértices que tiene el Grafo
mientras que (no_estén_vistos_todos) hacer
vértice = tomar_el_mínimo_del_vector distancia y que no esté visto;
visto[vértice] = cierto;
para cada w ∈ sucesores (G, vértice) hacer
si distancia[w]>distancia[vértice]+peso (vértice, w) entonces
distancia[w] = distancia[vértice]+peso (vértice, w)
fin si
fin para
fin mientras
fin función.

Al final, tenemos en el vector distancia en cada posición la distancia mínima del vértice salida a
otro vértice cualquiera.

Véase también
Anexo:Ejemplo de Algoritmo de Dijkstra
Algoritmo de Bellman-Ford

Enlaces externos
Wikimedia Commons alberga una galería multimedia sobre Algoritmo de Dijkstra.
Wikilibros alberga un libro o manual sobre algoritmo de Dijkstra.
Presentación del Algoritmo de Dijkstra (http://www.slideshare.net/joemmanuel/algoritmo-de-dij
kstra/)
Video del Algoritmo de Dijkstra (https://www.youtube.com/watch?v=6rl0ghgPfK0)
Applets en Java para probar el algoritmo de Dijkstra (Inglés) (https://web.archive.org/web/2007
0927234553/http://www-b2.is.tokushima-u.ac.jp/~ikeda/suuri/dijkstra/Dijkstra.shtml)
Graph (http://search.cpan.org/perldoc?Graph) módulo Perl en CPAN
Bio::Coordinate::Graph (http://search.cpan.org/perldoc?Bio::Coordinate::Graph) módulo Perl
en CPAN que implementa el algoritmo de Dijkstra
Algoritmo de Dijkstra en Javascript (http://www.yottabyte.es/discreta/) Resolución online del
Algoritmo de Dijkstra.
Optimización del algoritmo del camino más corto entre todos los nodos de un grafo no dirigido
(http://www.yusef.es/blog/2013/09/optimizacion-del-algoritmo-del-camino-mas-corto-entre-todo
s-los-nodos-de-un-grafo-no-dirigido/) Comparación entre el algoritmo de Dijkstra y el de Floyd-
Warshall, y método para optimizar el primero
Distintas implementaciones del algoritmo en RosettaCode.org (http://rosettacode.org/wiki/Dijks
tra%27s_algorithm)

Obtenido de «https://es.wikipedia.org/w/index.php?title=Algoritmo_de_Dijkstra&oldid=121693008»

Esta página se editó por última vez el 30 nov 2019 a las 17:31.

El texto está disponible bajo la Licencia Creative Commons Atribución Compartir Igual 3.0; pueden aplicarse
cláusulas adicionales. Al usar este sitio, usted acepta nuestros términos de uso y nuestra política de privacidad.
Wikipedia® es una marca registrada de la Fundación Wikimedia, Inc., una organización sin ánimo de lucro.

Você também pode gostar