Dato un grafico diretto, connesso con solo pesi di bordo positivi, ci sono algoritmi più veloci per trovare il percorso più breve tra due vertici, rispetto a Dijkstra usando un heap di Fibonacci?Esistono algoritmi più veloci di Dijkstra?
Wikipedia dice che Dijkstra è in O (| E | + | V | * log (| V |)) (utilizzando un heap di Fibonacci).
Non sto cercando ottimizzazioni che, ad esempio, metà del tempo di esecuzione, ma piuttosto algoritmi che si trovano in una complessità temporale diversa (come passare da O (n * log n) a O (n)).
Inoltre, mi piacerebbe conoscere la vostra opinione sul seguente approccio:
- Determinare il MCD di tutti i pesi di bordo.
- Trasforma il grafico in un grafico con pesi di bordo uniformi.
- Utilizzare BFS per trovare il percorso più breve tra due vertici dati.
Esempio per il punto 2:
Imagine GCD a 1. Poi trasformerebbe bordo
A ---> B (peso bordo 3)
in
A-> A '-> A' '-> B (3 volte di spigolo 1)
Questa trasformazione costa un tempo costante e dovrebbe essere eseguita una volta per ogni spigolo. Quindi mi aspetto che questo algoritmo sia in O (| E |) (trasformazione) + O (| E | + | V |) (BFS) = O (2 * | E | + | V |) = O (| E | + | V |)
Grazie per aver trovato il tempo di leggere la mia domanda e spero di non aver stretto il tuo tempo ^^. Buona giornata.
Penso che ti stai dimenticando di rendere conto del costo del GCD. –
La trasformazione non viene eseguita in tempo costante. Dovrai creare un numero variabile di nuovi vertici. –
Il GCD sarebbe il miglior valore da usare, ma si può sempre ricorrere indietro e usare solo 1, in modo che non venga speso tempo per il passaggio 1. –