Effizienter Algorithmus zum Abrufen des transitiven Abschlusses eines gerichteten azyklischen Graphen

14

Ich versuche ein Grafikproblem zu lösen (es ist nicht für Hausaufgaben gedacht, nur um meine Fähigkeiten zu üben). Ein DAG ist gegeben, wobei die Menge der Eckpunkte und die Kanten ist. Das Diagramm wird als Adjazenzliste dargestellt, daher ist eine Menge, die alle Verbindungen von . Meine Aufgabe ist es, zu finden, welche Eckpunkte von jedem Eckpunkt . Die Lösung, die ich benutze, hat eine Komplexität von mit transitivem Abschluss, aber ich habe gelesen, dass es in einem Blog schneller sein kann, obwohl es nicht verriet, wie. Könnte mir jemand einen anderen Weg (mit besserer Komplexität) zur Lösung des Transitivverschlussproblems in einer DAG nennen?G(V,E)VEAvvvVO(V3)

Rontogiannis Aristofanis
quelle
Schauen Sie sich an: stackoverflow.com/questions/3517524/…
AJed
Mein Vorschlag ist jedoch, das beizubehalten . aber versuchen Sie einfach, die Anzahl der Vergleiche im Durchschnitt zu verringern. Machen Sie also Vermutungen und fügen Sie Ihrem Algorithmus einfache Regeln hinzu. Sie können die Matrixmultiplikation verwenden - aber wenn Sie sie für kleine Diagramme verwenden, ist sie nur ein Chaos, und in der Praxis ist Ihre Methode sogar besser. O(|V|3)
AJed
@AJed In diesem speziellen Problem überschreitet das Zeitlimit. O(V3)
Rontogiannis Aristofanis
2
@RondogiannisAristophanes Wenn Sie Zeitlimit sagen, meinen Sie damit, dass dies ein Problem bei einigen Programmier- / Algorithmus-Herausforderungen wie Topcoder usw. ist? Wenn dies der Fall ist und Sie sicher sind, dass Sie eine -Lösung korrekt implementiert haben , möchten Sie das Problem möglicherweise erneut untersuchen. Möglicherweise gibt es eine andere versteckte Eigenschaft, die die Dinge vereinfachen könnte, oder es gibt eine bessere Möglichkeit, das Problem auszudrücken, sodass kein vorübergehender Abschluss erforderlich ist. Weil der transitive Verschluss so schwer ist wie die Matrixmultiplikation. Lesen Sie student.cs.uwaterloo.ca/~cs466/Old_courses/F08/…O(V3)
Paresh

Antworten:

8

Die Tatsache, dass unser Graph azyklisch ist, macht dieses Problem viel einfacher.

Topologische Sortierung kann uns eine Reihenfolge der Eckpunkte so dass, wenn i < j ist , es keine Kante von v j zurück zu v i gibt . Wir haben die Eckpunkte so aufgelistet, dass alle Kanten in unserer Liste "vorwärts" gehen.v1,v2,,vni<jvjvi

(bearbeitet, um die Analyse zu korrigieren und einen etwas schnelleren Algorithmus zu liefern)

Jetzt gehen wir diese Liste einfach rückwärts durch, beginnend mit dem letzten Scheitelpunkt . v n 's transitiver Abschluss ist nur sich selbst. Addiere auch v n zum transitiven Abschluss jedes Scheitelpunkts mit einer Kante zu v n .vnvnvnvn

Für jeden anderen Eckpunkt , das Ende nach hinten gehen, ersten Add v i auf seine eigenen transitiven Schließung, dann ist alles in der transitiven Hülle hinzufügen v i auf die transitive Schließung aller Ecken mit Ecken und Kanten v i .vivivivi

Die Laufzeit ist im ungünstigsten Fall , wobei n die Anzahl der Eckpunkte und m O ( n 2 ) die Anzahl der Kanten ist. Die topologische Sortierung benötigt die Zeit O ( n + m ) . Dann machen wir eine weitere O ( m n ) -Arbeit im Rückwärtsdurchlauf: Wenn wir die Liste rückwärts durchgehen, müssen wir für jede Kante n addierenO(n+m+nm)=O(n3)nmO(n2)O(n+m)O(mn)n Eckpunkte zu jemandes transitiven Schließung.

Beachten Sie, dass Sie eine schöne Beschleunigung des konstanten Faktors erzielen können, indem Sie die transitive Schließung aller durch Bit-Arrays darstellen. Angenommen, Sie hatten nur ; Dann würden Sie eine einzelne 64-Bit-Ganzzahl verwenden, wobei Bit i 1 ist, wenn ich in meinem transitiven Abschluss bin, und sonst 0. Dann ist der Teil, in dem wir alles in i 's transitiven Abschluss zu j ' s hinzufügen, sehr schnell: Wir nehmen einfach c j | = c i . (Binär-ODER-Operation.)n=64iiijcjci

Für müssten Sie sie in Arrays belassen und ein wenig rechnen, aber es wäre viel schneller als ein Objektsatz.n>64

OO(n3)

usul
quelle
1
Sie könnten wahrscheinlich eine verknüpfte Listendarstellung für die Sätze verwenden, und sie würden sich am Ende gemeinsame Endpunkte teilen.
Kyle Butt