¿Estoy en lo cierto acerca de las diferencias entre los algoritmos Floyd-Warshall, Dijkstra y Bellman-Ford?

16

He estado estudiando los tres y estoy declarando mis inferencias de ellos a continuación. ¿Podría alguien decirme si los he entendido con la suficiente precisión o no? Gracias.

  1. El algoritmo de Dijkstra se usa solo cuando tiene una sola fuente y desea conocer la ruta más pequeña de un nodo a otro, pero falla en casos como este .

  2. El algoritmo Floyd-Warshall se usa cuando cualquiera de los nodos puede ser una fuente, por lo que desea que la distancia más corta llegue a cualquier nodo de destino desde cualquier nodo fuente. Esto solo falla cuando hay ciclos negativos.

  3. Bellman-Ford se usa como Dijkstra, cuando solo hay una fuente. Esto puede manejar pesos negativos y su funcionamiento es el mismo que Floyd-Warshall, excepto por una fuente, ¿verdad? (De esto estoy menos seguro).

Rafael
fuente
¡Bienvenido! Edité las partes redundantes del código; las personas pueden hacer clic en Wikipedia por su cuenta o consultar los algoritmos en sus libros de texto favoritos. Tenga en cuenta que su pregunta es extraña porque una respuesta de "sí" no puede consistir en nada más.
Raphael

Respuestas:

23

El algoritmo de Dijkstra se usa solo cuando tiene una sola fuente y desea conocer la ruta más pequeña de un nodo a otro, pero falla [en gráficos con bordes negativos]

ssprevious[v]v

El comportamiento del algoritmo de Dijkstra en gráficos con bordes negativos depende de la variante precisa en discusión. Algunas variantes del algoritmo, como la de Wikipedia, siempre se ejecutan rápidamente pero no calculan correctamente las rutas más cortas cuando hay bordes negativos. Otras variantes, como la de estas notas de clase, siempre calculan los caminos más cortos correctamente (a menos que haya un ciclo negativo accesible desde la fuente) pero pueden requerir un tiempo exponencial en el peor de los casos si hay bordes negativos.

El algoritmo de Floyd-Warshall se usa cuando cualquiera de todos los nodos puede ser una fuente, por lo que desea que la distancia más corta llegue a cualquier nodo de destino desde cualquier nodo fuente. Esto solo falla cuando hay ciclos negativos.

Eso es correcto. Floyd-Warshall es un ejemplo de un algoritmo de ruta más corta de todos los pares , lo que significa que calcula las rutas más cortas entre cada par de nodos. Otro ejemplo es "para cada nodo v, ejecute Dijkstra con v como el nodo fuente". Hay varios otros.

Bellman-Ford se usa como Dijkstra, cuando solo hay una fuente. Esto puede manejar pesos negativos y su funcionamiento es el mismo que el de Floyd-Warshall, excepto por una fuente, ¿verdad?

O(V3)O(V2E)O(VE) para cada vértice fuente).

Para más detalles, consulte su libro de texto de algoritmos favoritos. (Usted tiene un libro de texto de algoritmos favorito, ¿verdad?)

JeffE
fuente
¿te importaría compartir tu libro de texto de algoritmos favorito?
Abdul
2
@Abdul algoritmos.wtf
JeffE
@Abdul cebo. - El libro de texto utilizado en MIT / Stanford es T. Cormen, et al. Introducción a los algoritmos. El libro de texto utilizado en Cornell es J. Kleinberg, et al Algorithm Design. cs.sjtu.edu.cn/~jiangli/teaching/CS222/files/materials/…
AffluentOwl
2

Los tres algoritmos están cubiertos en las diapositivas de la conferencia por el Prof. Jaehyun Park (Universidad de Stanford). Aquí está el enlace Algoritmos de ruta más corta

Jitendra
fuente
Esto no responde a la pregunta sobre las diferencias y no es autónomo, solo un enlace sin resumen no cuenta como una buena respuesta. También parece redundante, ya que no cubre más que las respuestas existentes.
Mal
1

La página de Wikipedia sobre el problema de la ruta más corta describe dos problemas diferentes: SSSP y APSP.

Ruta más corta de fuente única (SSSP):

  • Algoritmo de Dijkstra: resuelve el problema de la ruta más corta de una sola fuente.
    • Restricciones: solo bordes negativos que no puede manejar.
    • Gráficos no ponderados: Dijkstra es lo mismo que BFS.
  • Algoritmo Bellman-Ford: resuelve el problema de fuente única si los pesos de los bordes pueden ser negativos. Esta es una mejora en Dijkstra, donde ahora también es capaz de manejar pesos negativos.

Todos los pares de ruta más corta (APSP):

  • Algoritmo Floyd – Warshall: resuelve todos los pares de caminos más cortos. Maneja los bordes positivos y negativos.
    • Restricciones: No se pueden manejar ciclos negativos.

Por lo tanto, Floyd – Warshall no es lo mismo que BFS, aunque la metodología subyacente es la misma, programación dinámica.

Fooo
fuente
1

Quizás esto debería ser un comentario en lugar de una respuesta, pero es una distinción entre estos algoritmos que otras respuestas no mencionan.

La gente tiende a llamar al algoritmo de Floyd Floyd-Warshall , pero los algoritmos de Floyd y Warshall no son lo mismo.

O(1)O(norte2)

reinierpost
fuente