Sie können versuchen, eine Version von Floyd-Warshall zu erstellen, die auf spärlichen Matrizen schneller ist.
Erinnern wir uns zunächst, was dieser Algorithmus bewirkt:
Sei eine Matrix von Entfernungen. Zu Beginn des Algorithmus M i ist j das Gewicht der Kante i → j . Wenn diese Kante nicht existiert, dann ist M i , j = ∞ .MMi,ji→jMi,j=∞
Der Algorithmus hat Schritte. In Schritt k des Algorithmus setzen wir für jedes Knotenpaar i , jVki,j
Mi,j←min{Mi,j,Mi,k+Mk,j}.
Es ist klar, dass keine Aktualisierung durchgeführt werden muss, wenn oder M k , j = ∞ ist. So wird in den ersten Schritten des Algorithmus, brauchen wir nur grob auszuführen d e g i n ( k ) ⋅ d e g o u t ( k ) Vergleiche , wo d e g i n ( k ) und d e g o u t (Mi,k=∞Mk,j=∞degin(k)⋅degout(k)degin(k) bezeichnen die Anzahl der ankommenden und abgehenden Flanken des k- ten Knotens. Mit fortschreitendem Algorithmus werden immer mehr Einträge der Matrix M gefüllt. Daher können die letzten Schritte viel länger dauern.degout(k)kM
Beachten Sie, dass wir eine effiziente Methode benötigen, um nur nicht unendliche Zellen in der ten Zeile und Spalte der Matrix zu durchlaufen . Dies kann erreicht werden, indem für jeden Knoten eine Reihe von eingehenden und ausgehenden Kanten gespeichert wird.k
Es scheint, dass die ersten Schritte des Algorithmus stark von Sparsity profitieren können. Beispielsweise legt ein zufällig konstruierter Graph mit nahe, dass die erste Iteration ( k = 0 ) nur aus O ( 1 ) Schritten besteht. Wenn der Graph in viele verbundene Komponenten aufgeteilt wird, bleibt die Matrix M während des gesamten Algorithmus relativ dünn, und die Gesamtlaufzeit könnte so niedrig wie O ( V ) sein . Enthält der Graph dagegen nur eine zusammenhängende Komponente, so ist die letzte Iteration k = | V |E=O(V)k=0O(1)MO(V)k=|V|Es wird erwartet, dass Schritte unternommen werden. In diesem Fall könnte die Gesamtlaufzeit O ( V 3 ) sein . So groß wie die nicht spärliche Version.O(V2)O(V3)