1) Gibt es einen besseren Algorithmus als das naive O (| E |. | V |), um die Anzahl der Nachkommen jedes Scheitelpunkts in einer DAG zu berechnen?
2) Gibt es einen Online-Algorithmus, der davon ausgeht, dass Knoten einzeln hinzugefügt werden und eine Verbindung zu einer nicht leeren Teilmenge der vorhandenen Knoten herstellen?
Kontext: Ich interessiere mich für den Fall, dass m = O (n), typischerweise Millionen von Eckpunkten, zig Millionen von Kanten. Alternativ wäre es nützlich, die Anzahl der Nachkommen zu zählen, die auch Senken sind.
Ein probabilistischer Ansatz wäre Min-Hashing, um die Menge der Nachkommen jedes Knotens darzustellen. Die Vereinigung der Min-Hash-Struktur ist trivial, und die Kardinalität der Vereinigung kann aus der Anzahl der Zufälle in den Min-Hashes geschätzt werden.
Ich bin mir jedoch nicht sicher, wie gut sich das bei der Verbreitung der DAG verhalten würde. Intuitiv sieht es so aus, als würden sich Fehler ziemlich schnell verstärken.
Sehr verwandt: /cstheory/553/what-bounds-can-be-put-on-counting-reachable-nodes-in-a-dag Und tatsächlich ein Duplikat von: https: // cstheory.stackexchange.com/questions/18787/what-is-the-fastest-deterministic-algorithm-for-incremental-dag-reachability
quelle
Antworten:
N
einN.QueryCount = 0
.N
in umgekehrter topologischer Reihenfolge:N.Descendants = {N} U {C.Descendants | C in N.Children}
.(N, N.Descendants.Count)
aus dem Algorithmus.N.Parents
leer, können Sie entsorgenN.Descendants
.C
In . Wenn ja, können Sie entsorgen .N.Children
C.QueryCount
C.QueryCount == C.Parents.Count
C.Descendants
Dies ist natürlich teuer, wenn Ihre Knotengrade groß sind. Die Worst-Case-Komplexität ist möglicherweise nicht wesentlich besser als Ihr nicht spezifizierter "naiver Algorithmus".
Das Problem ist, dass dies ein sehr schwer zu lösendes Problem ist. Angenommen, es gibt eine DAG mit Millionen von Knoten, Millionen von Kanten usw. Ich zeige Ihnen diesen Teil des Diagramms:
Wie viele Nachkommen hat
A
? Die Anzahl der Nachkommen vonB
plus die Anzahl der Nachkommen vonC
minus der Anzahl der gemeinsamen Nachkommen vonB
undC
. Es ist der dritte Begriff, der die Schwierigkeit schafft. Sie können nicht nur die Anzahl der Nachkommen vonB
und kennenC
- Sie müssen auch wissen, was die Nachkommen sind.quelle
Descendants
Mengen werden gegen Ende nahe an O (n) sein.Das Auflisten aller Nachkommen aller Scheitelpunkte kann eine Ausgabe der Größe erzeugen.
O(n²)
Wenn das Diagramm beispielsweise ein lineares Diagramm ist, hat der Scheitelpunkt ohne eingehende Kanten - 1
Nachkommen, den folgenden Scheitelpunktn - 2
usw.Dies lässt die Frage offen, ob Sie die Anzahl der Nachkommen bestimmen können, ohne sie aufzuzählen. Ich kann keinen Beweis liefern, aber ich bin ziemlich sicher, dass die Antwort nein ist. Angenommen, ein Scheitelpunkt
x
hat untergeordnete Elemente,u
undv
dann müssen Sie die Kardinalität des Schnittpunkts der Nachkommen vonu
und ermitteln.v
Sie wissen jedoch nichts über diese Gruppe -u
undv
teilen möglicherweise keinen einzelnen Nachkommen, oder sie haben möglicherweise dieselbe Gruppe von Nachkommen .quelle