Ho ragione sulle differenze tra gli algoritmi di Floyd-Warshall, Dijkstra e Bellman-Ford?


16

Ho studiato i tre e sto affermando le mie inferenze da loro sotto. Qualcuno potrebbe dirmi se le ho comprese abbastanza accuratamente o no? Grazie.

  1. L'algoritmo Dijkstra viene utilizzato solo quando si dispone di un'unica fonte e si desidera conoscere il percorso più piccolo da un nodo all'altro, ma in casi come questo non riesce .

  2. L'algoritmo Floyd-Warshall viene utilizzato quando uno qualsiasi di tutti i nodi può essere un'origine, quindi si desidera che la distanza più breve raggiunga qualsiasi nodo di destinazione da qualsiasi nodo di origine. Questo fallisce solo quando ci sono cicli negativi.

  3. Bellman-Ford è usato come Dijkstra, quando esiste una sola fonte. Questo può gestire pesi negativi e il suo funzionamento è lo stesso di Floyd-Warshall ad eccezione di una fonte, giusto? (Questo è quello di cui sono meno sicuro.)


Benvenuto! Ho modificato le parti di codice ridondanti; le persone possono fare clic su Wikipedia da sole o controllare gli algoritmi nei loro libri di testo preferiti. Nota che la tua domanda è una domanda strana, perché una risposta "sì" non può consistere in nient'altro.
Raffaello

Risposte:


23

L'algoritmo di Dijkstra viene utilizzato solo quando si dispone di un'unica sorgente e si desidera conoscere il percorso più piccolo da un nodo all'altro, ma non riesce [nei grafici con bordi negativi]

L'algoritmo di Dijkstra è un esempio di percorso più breve a sorgente singola o algoritmo SSSP . Ogni algoritmo SSSP calcola le distanze del percorso più breve da un nodo sorgente a ogni altro nodo nel grafico. Inoltre, calcola una rappresentazione compatta di tutti i percorsi più brevi da s a ogni altro nodo, sotto forma di un albero radicato. Nel codice Wikipedia, è il genitore di v in questo albero.SSprevious[v]v

Il comportamento dell'algoritmo di Dijkstra nei grafici con spigoli negativi dipende dalla variante precisa in discussione. Alcune varianti dell'algoritmo, come quella di Wikipedia, vengono sempre eseguite rapidamente ma non calcolano correttamente i percorsi più brevi in ​​presenza di bordi negativi. Altre varianti, come quella in queste note di lezione, calcolano sempre correttamente i percorsi più brevi (a meno che non vi sia un ciclo negativo raggiungibile dalla fonte) ma, nel caso peggiore, possono richiedere tempi esponenziali se ci sono bordi negativi.

L'algoritmo di Floyd-Warshall viene utilizzato quando uno qualsiasi di tutti i nodi può essere un'origine, quindi si desidera che la distanza più breve raggiunga qualsiasi nodo di destinazione da qualsiasi nodo di origine. Questo fallisce solo quando ci sono cicli negativi.

È corretto. Floyd-Warshall è un esempio di algoritmo del percorso più breve di tutte le coppie , il che significa che calcola i percorsi più brevi tra ogni coppia di nodi. Un altro esempio è "per ciascun nodo v, eseguire Dijkstra con v come nodo di origine". Ce ne sono molti altri.

Bellman-Ford è usato come Dijkstra, quando esiste una sola fonte. Questo può gestire pesi negativi e il suo funzionamento è uguale a quello di Floyd-Warshall ad eccezione di una fonte, giusto?

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

Per ulteriori dettagli, consultare il manuale degli algoritmi preferiti. (Non hanno un libro di testo preferito algoritmi, non è vero?)


ti dispiacerebbe condividere il tuo manuale di algoritmi preferito?
Abdul,

2

@Abdul baited. - Il libro di testo utilizzato al MIT / Stanford è T. Cormen, et al. Introduzione agli algoritmi. Il libro di testo utilizzato da Cornell è J. Kleinberg, et al Algorithm Design. cs.sjtu.edu.cn/~jiangli/teaching/CS222/files/materials/…
AffluentOwl

2

Tutti e tre gli algoritmi sono trattati nelle diapositive del Prof. Jaehyun Park (Stanford University). Ecco il link Algoritmi percorso più breve


Questo non risponde alla domanda sulle differenze e non è autonomo, solo un link senza riepilogo non conta come una buona risposta. Inoltre sembra ridondante, in quanto non copre più delle risposte esistenti.
Evil

1

La pagina Wikipedia sul problema del percorso più breve descrive due diversi problemi: SSSP e APSP.

Percorso più breve a fonte singola (SSSP):

  • L'algoritmo di Dijkstra: risolve il problema del percorso più breve a sorgente singola.
    • Vincoli: solo i bordi negativi che non può gestire.
    • Grafici non ponderati: Dijkstra è uguale a BFS.
  • Algoritmo Bellman-Ford: risolve il problema a sorgente singola se i pesi dei bordi possono essere negativi. Questo è un miglioramento su Dijkstra, dove ora è anche in grado di gestire pesi negativi.

Percorso più breve di tutte le coppie (APSP):

  • Algoritmo di Floyd – Warshall: risolve tutte le coppie percorsi più brevi. Gestisce i bordi positivo e negativo.
    • Vincoli: impossibile gestire cicli negativi.

Quindi, Floyd – Warshall non è lo stesso di BFS, sebbene la metodologia sottostante sia la stessa, programmazione dinamica.


1

Forse questo dovrebbe essere un commento piuttosto che una risposta, ma è una distinzione tra questi algoritmi che altre risposte non menzionano.

Le persone tendono a chiamare l'algoritmo di Floyd Floyd-Warshall , ma gli algoritmi di Floyd e Warshall non sono gli stessi.

L'articolo di Warshall osserva che se usi l'algoritmo di Floyd su una matrice di incidenza binaria, quello che stai facendo è la moltiplicazione della matrice; quindi, può effettivamente essere implementato in quel modo, e ad esempio se si può fare la moltiplicazione vettoriale inO(1), il tuo algoritmo diventa O(n2).

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.