Transitive Reduktion der DAG


13

Ich suche einen O (V + E) -Algorithmus, um die transitive Reduktion bei gegebener DAG zu finden.

Das heißt, entfernen Sie so viele Kanten wie möglich, so dass Sie nach dem Entfernen der Kanten immer noch nach v greifen können, wenn Sie v von u aus für willkürliches v und u erreichen könnten.

Wenn dies ein Standardproblem ist, weisen Sie mich bitte auf eine Modelllösung hin.


Sie können den in dem von Ihnen zitierten Wikipedia-Lemma angegebenen Verweis nicht verwenden?
Hendrik Jan

2
Nun, der in der Wikipedia diskutierte Algorithmus läuft wie gewünscht in (im besten Fall, dh im Fall von azyklischen Graphen) anstelle von O ( V + E ) . Ich denke, die richtige Antwort ist, dass der gesuchte Algorithmus möglicherweise nicht existiertO(V×E)O(V+E)
Carlos Linares López

1
Einverstanden, dass es nicht klar ist, dass das, wonach Sie fragen, existiert. Es gibt eine ganze Reihe von Artikeln, die ohne einen solchen Algorithmus nicht interessant wären, z. B. sciencedirect.com/science/article/pii/0012365X9390164O . Das heißt, wenn Sie genauer wissen, was Ihre Motivation ist, gibt es möglicherweise spezifischere Lösungen. Wissen Sie zum Beispiel noch etwas über den Graphen oder würde funktionieren? O(n(n+m))
William Macrae

Ich habe das Problem irgendwo gesehen, aber es gab keine zusätzlichen Informationen, vielleicht einen Tippfehler im Problem.
Karan

1
Was passiert , wenn Sie in Ihrem DAG topologische Sortierung, aber Spur von erreichbaren Ecken halten von Kindern verwendet wird , dh reeincheinble[v]=vchichldrenvreeincheinble[v]Wenn Sie mit dem neuesten Element in der sortierten Grafik beginnen, nicht verwendete Kanten entfernen und die erreichbare Funktion beibehalten, können Sie maximal mögliche Kanten entfernen. Ich bin mir jedoch nicht sicher, ob die maximale Wahrscheinlichkeit erreicht wird (es ist .Ö(|E|+|V|)

Antworten:


8

Wir können dieses Problem lösen, indem wir DFS von jedem Scheitelpunkt aus ausführen.

  1. Starten Sie für jeden Scheitelpunkt die DFS von jedem Scheitelpunkt v , sodass v der direkte Nachkomme von u ist , d. H. ( u , v ) ist eine Kante.uGvvu(u,v)
  2. Entfernen Sie für jeden Scheitelpunkt den die DFS von v aus erreichen kann, die Kante ( u , v ' ) .vv(u,v)

Die Gesamtkomplexität des Obigen ist die Komplexität des Ausführens von DFS ', was O ( N ( N + M ) ) ist .NÖ(N(N+M))


1
Beachten Sie, dass dies asymptotisch die gleiche Komplexität aufweist wie der -Algorithmus im Wikipedia-Artikel, der in der Frage selbst verlinkt ist. Ö(NM)
David Richerby

1
Einverstanden. Da für diese Frage eine präzise Antwort fällig war, habe ich eine vorgelegt. Ferner ist eine -Lösung nach IMO unwahrscheinlich. Ö(N)
Pratyaksh

3

Nicht das, wonach Sie suchen. Aber nur zum Zweck des Wissensaustauschs können Sie dies mit Nachrichten ( | E | ) tun, wenn Sie davon ausgehen, dass jeder Eckpunkt als Prozessor fungiert . Beachten Sie, dass jeder Scheitelpunkt einen vergleichbaren Wert hat. Daher gibt es einige Eckpunkte, die größer sind als alle ihre Nachbarn. Diese Eckpunkte führen Folgendes aus:Ö(|E|)

  1. Sei der maximale kleinere Nachbar von v ,uv
  2. sende eine Nachricht an und füge edge ( v , u ) in die Ausgabe ein.u(v,u)
  3. Beziehen Sie für jeden Nachbarn von u und v (und kleiner als beide) ( v , w ) nicht in die Ausgabe ein.wuv(v,w)
  4. Wiederholen Sie die Schritte, bis alle Kanten für einen kleineren Nachbarn v ' des Scheitelpunkts v entweder in der Ausgabe enthalten sind oder nicht.(v,v)vv

Wenn nun ein Knoten eine Nachricht von jedem größeren Nachbarn empfangen hat (dh alle Kanten ( v ' , v ) sind entweder enthalten oder nicht enthalten), verhält sich der Knoten v so , als ob er der größte in seiner Nachbarschaft wäre zuvor erwähnten 4 Schritte.v(v,v)v

Dieser Algorithmus endet in Nachrichten ( | E | ) in einer verteilten Umgebung. Ich weiß, das ist nicht das, wonach du fragst.Ö(|E|)


1

Lemma: Wenn es eine Kante V -> Y gibt und Y auch ein indirekter Nachfolger von V ist (z. B. V -> W -> + Y), dann ist die Kante V -> Y transitiv und nicht Teil der transitiven Wurzel.

Methode: Verfolgen Sie den transitiven Abschluss jedes Scheitelpunkts, indem Sie in umgekehrter topologischer Reihenfolge vom Endpunkt zum Anfangsscheitelpunkt arbeiten. Die Menge der indirekten Nachfolger von V ist die Vereinigung der transitiven Abschlüsse der unmittelbaren Nachfolger von V. Die transitiven Abschlüsse von V sind die Vereinigung ihrer indirekten Nachfolger und ihrer unmittelbaren Nachfolger.

Algorithmus:

    Initialise Visited as the empty set.
    For each vertex V of G, 
        Invoke Visit(V).

    Visit(V):
        If V is not in Visited,
            Add V to Visited, 
            Initialise Indirect as the empty set,
            For each edge V -> W in G,
                Invoke Visit(W),
                Add Closure(W) to Indirect.
            Set Closure(V) to Indirect.
            For each edge V -> W in G,
                Add W to Closure(V),
                If W is in the set Indirect,
                    Delete the edge V -> W from G.

Dies setzt voraus, dass Sie einen effizienten Weg haben, um Verticesätze (z. B. Bitmaps) zu verfolgen, aber ich denke, diese Annahme wird auch in anderen O (V + E) -Algorithmen getroffen.

Ein potenziell nützlicher Nebeneffekt ist, dass er den transitiven Verschluss jedes Scheitelpunkts von G findet.


Ich habe die Antwort auf Ihrem früheren Konto gelöscht. Wenn Sie Ihre beiden Konten dennoch zusammenführen möchten, befolgen Sie die Schritte in der Hilfe . Das heißt, da der frühere Account keinen sichtbaren Inhalt mehr hat, können Sie sich einfach an den neuen halten.
Gilles 'SO - hör auf böse zu sein',

0

Ich habe das gleiche Problem gelöst, aber es war nicht genau dasselbe. Es wurde nach der Reduzierung nach dem Minimum an Kanten im Diagramm gefragt, sodass die ursprünglich verbundenen Scheitelpunkte weiterhin verbunden sind und keine neuen Verbindungen hergestellt werden. Es ist klar, dass es nicht heißt, den verkleinerten Graphen zu finden, sondern wie viele redundante Kanten vorhanden sind. Dieses Problem kann mit O (V + E) gelöst werden. Der Link zur Erklärung lautet https://codeforces.com/blog/entry/56326 . Aber ich denke, um das Diagramm tatsächlich zu machen, wird es eine höhere Komplexität haben als O (N).

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.