Estou certo sobre as diferenças entre os algoritmos Floyd-Warshall, Dijkstra e Bellman-Ford?

16

Eu tenho estudado os três e estou declarando minhas inferências deles abaixo. Alguém poderia me dizer se eu os entendi com precisão ou não? Obrigado.

  1. O algoritmo Dijkstra é usado apenas quando você tem uma única fonte e deseja conhecer o menor caminho de um nó para outro, mas falha em casos como este .

  2. O algoritmo Floyd-Warshall é usado quando qualquer um dos nós pode ser uma fonte, portanto, você deseja que a distância mais curta alcance qualquer nó de destino a partir de qualquer nó de origem. Isso só falha quando há ciclos negativos.

  3. Bellman-Ford é usado como Dijkstra, quando há apenas uma fonte. Isso pode lidar com pesos negativos e seu trabalho é o mesmo que Floyd-Warshall, exceto por uma fonte, certo? (Este é o que eu tenho menos certeza.)

Rafael
fonte
Bem-vinda! Editei as partes de código redundantes; as pessoas podem acessar a Wikipedia por conta própria ou verificar os algoritmos em seus livros favoritos. Observe que sua pergunta é estranha, porque uma resposta "sim" pode consistir em nada mais.
Raphael

Respostas:

23

O algoritmo de Dijkstra é usado apenas quando você tem uma única fonte e deseja conhecer o menor caminho de um nó para outro, mas falha [em gráficos com arestas negativas]

ssprevious[v]v

O comportamento do algoritmo de Dijkstra em gráficos com arestas negativas depende da variante precisa em discussão. Algumas variantes do algoritmo, como a da Wikipedia, sempre são executadas rapidamente, mas não calculam corretamente os caminhos mais curtos quando existem arestas negativas. Outras variantes, como a destas notas de aula, sempre calculam os caminhos mais curtos corretamente (a menos que haja um ciclo negativo acessível a partir da fonte), mas podem exigir tempo exponencial na pior das hipóteses, se houver arestas negativas.

O algoritmo de Floyd-Warshall é usado quando qualquer um dos nós pode ser uma fonte, portanto, você deseja que a distância mais curta alcance qualquer nó de destino a partir de qualquer nó de origem. Isso só falha quando há ciclos negativos.

Está correto. Floyd-Warshall é um exemplo de algoritmo de caminho mais curto para todos os pares , o que significa que ele calcula os caminhos mais curtos entre todos os pares de nós. Outro exemplo é "para cada nó v, execute Dijkstra com v como o nó de origem". Existem vários outros.

Bellman-Ford é usado como o de Dijkstra, quando há apenas uma fonte. Isso pode lidar com pesos negativos e seu trabalho é igual ao de Floyd-Warshall, exceto por uma fonte, certo?

O(V3)O(V2E)O(VE)

Para mais detalhes, consulte o seu livro de algoritmos favorito. (Você tem um livro de algoritmos favorito, não é?)

JeffE
fonte
você se importaria de compartilhar seu livro de algoritmos favorito?
Abdul
2
@Abdul algorítmica.wtf
JeffE 15/07
@Abdul isca. - O livro usado no MIT / Stanford é T. Cormen, et al. Introdução aos algoritmos. O livro usado em Cornell é J. Kleinberg et al. Algorithm Design. cs.sjtu.edu.cn/~jiangli/teaching/CS222/files/materials/…
AffluentOwl
2

Todos os três algoritmos são abordados nos slides das palestras do Prof. Jaehyun Park (Universidade de Stanford). Aqui está o link Algoritmos de caminho mais curto

Jitendra
fonte
Isso não responde à pergunta sobre as diferenças e não é independente, apenas um link sem resumo não conta como boa resposta. Também parece redundante, pois não cobre mais do que as respostas existentes.
Mal
1

A página da Wikipedia sobre o problema do caminho mais curto descreve dois problemas diferentes: SSSP e APSP.

Caminho mais curto de fonte única (SSSP):

  • Algoritmo de Dijkstra: resolve o problema de caminho mais curto de fonte única.
    • Restrições: Somente arestas negativas não podem ser tratadas.
    • Gráficos não ponderados: o Dijkstra é igual ao BFS.
  • Algoritmo de Bellman-Ford: resolve o problema de fonte única se os pesos das bordas forem negativos. Isso é uma melhoria no Dijkstra, onde agora ele também pode lidar com pesos negativos.

Caminho mais curto de todos os pares (APSP):

  • Algoritmo de Floyd-Warshall: resolve todos os caminhos mais curtos dos pares. Lida com arestas positivas e negativas.
    • Restrições: Não é possível lidar com ciclos negativos.

Portanto, Floyd – Warshall não é o mesmo que BFS, embora a metodologia subjacente seja a mesma, programação dinâmica.

Fooo
fonte
1

Talvez isso deva ser um comentário e não uma resposta, mas é uma distinção entre esses algoritmos que outras respostas não mencionam.

As pessoas tendem a chamar o algoritmo de Floyd de Floyd-Warshall , mas os algoritmos de Floyd e Warshall não são os mesmos.

O(1 1)O(n2)

reinierpost
fonte