Quel est l'algorithme le plus rapide pour trouver tous les chemins les plus courts dans un graphe clairsemé?

24

Dans un graphe non pondéré et non orienté avec des sommets et des arêtes tels que , quel est le moyen le plus rapide pour trouver tous les chemins les plus courts dans un graphe? Peut-il être fait plus rapidement que Floyd-Warshall qui est mais très rapide par itération?E 2 V > E O ( V 3 )VE2V>EO(V3)

Et si le graphique était pondéré?

Jakob Weisblat
la source

Réponses:

32

Puisqu'il s'agit d'un graphique non pondéré, vous pouvez exécuter une recherche en largeur (BFS) à partir de chaque sommet v du graphique. Chaque série de BFS vous donne les distances (et chemins) les plus courtes entre le sommet de départ et tous les autres sommets. La complexité temporelle pour un BFS est O(V+E)=O(V) puisque E=O(V) dans votre graphique clairsemé. L'exécuter V fois vous donne une complexité temporelle O(V2) .

Pour un graphe orienté pondéré, l' algorithme de Johnson tel que suggéré par Yuval est le plus rapide pour les graphes clairsemés. Il faut O(V2logV+VE) qui dans votre cas se révèle être O(V2logV) . Pour un graphique non orienté pondéré, vous pouvez soit exécuter l'algorithme de Dijkstrade chaque nœud, ou remplacez chaque bord non dirigé par deux bords dirigés opposés et exécutez l'algorithme de Johnson. Les deux donneront les mêmes temps aysmptotiques que l'algorithme de Johnson ci-dessus pour votre cas clairsemé. Notez également que l'approche BFS que je mentionne ci-dessus fonctionne à la fois pour les graphiques dirigés et non dirigés.

Paresh
la source
7

Il y a l'algorithme de Johnson , dont le temps d'exécution est .O(V2logV+VE)

Yuval Filmus
la source
7

Vous pouvez essayer de créer une version de Floyd-Warshall plus rapide sur des matrices clairsemées.

Rappelons d'abord ce que fait cet algorithme:

Soit une matrice de distances. Au début de l'algorithme M i , j est le poids du bord i j . Si cette arête n'existe pas alors M i , j = .MMi,jijMi,j=

L'algorithme a étapes. À l'étape k de l'algorithme, pour chaque paire de nœuds i , j nous définissonsVki,j

Mi,jmin{Mi,j,Mi,k+Mk,j}.

Mi,k=Mk,j=degin(k)degout(k)degin(k)degout(k)kM

k

E=O(V)k=0O(1)MO(V)k=|V|O(V2)O(V3)

Amit Moscovich
la source