Sie sind eine Reihe von bestimmten gerichteten azyklischen Graphs über den gleichen Satz von m Ecken V . Sie erhalten auch eine Permutation der Menge der Eckpunkte (v_1, v_2, ..., v_m) . Was ist der beste Algorithmus, um die Graphen unter G_1, G_2, ..., G_n zu identifizieren , die (v_1, v_2, ..., v_m) als topologische Sortierung haben? Könnte jemand testen, ob (v_1, v_2, ..., v_m) eine topologische Art einer DAG G über V in sublinearer Zeit ist?
ds.algorithms
graph-algorithms
directed-acyclic-graph
Hsien-Chih Chang 張顯 之
quelle
quelle
Antworten:
Dies kann in nahezu linearer Zeit erfolgen.
Sei die Permutation und sei die Anzahl der Schritte, die erforderlich sind, um eine einzelne Kante gegen zu prüfen . Es reicht dann aus, zu überprüfen, ob jede der Kanten von mit kompatibel ist, was in oder insgesamt erfolgen kann.π=(v1,…,vm) k=k(π) (u,v) π Mi Gi π O(kMi) O(k∑Mi)
Durch Vorverarbeitung von kann man auf zwei Suchvorgänge in einem Array reduzieren , das Einträge mit jeweils Größe und einen Vergleich zwischen zwei -Bit-Einträgen im Array enthält. Das Array-Element enthält den Index von in , der als geordnete Liste betrachtet wird. Dies bedeutet, dass was insgesamt Zeit für die Obergrenze ergibt .π k m logm (log m) a[w] w π k=O(logm) O((logm)∑Mi)
Wie @mjqxxxx hervorhebt, kann jede Kante jedes Diagramms relevant sein. Dies erzeugt eine Untergrenze von -Schritten, wobei der geringste Arbeitsaufwand ist, der für jede Diagrammkante ausgeführt werden muss. Es ist möglich, dass einige Ansätze die Kosten amortisieren können, so dass . Dies wird bestenfalls immer noch , so dass keine große Lücke mehr besteht.Ω(K∑Mi) K K=o(logm) Ω(∑Mi)
quelle
Triviale Methode:
Es ist nicht so schnell wie du willst. Es löst jedoch ein Problem, dass "es mehrere gültige topologische Ordnungen der DAG geben kann". Und sie alle zu finden, ist keine gute Idee.
quelle