Graphzyklen erkennen - einfache Erklärung

9

Könnten einige mir bitte helfen zu verstehen, wie man Zyklen in Graphen in Laienbegriffen findet?

Ich habe andere Fragen gelesen, wie diese und auch einige der Wikipedia-Seiten, aber sie scheinen ziemlich schnell in den mathematischen Jargon abzusteigen.

Ich habe ein Modell des Diagramms in Java, Modellierungsknoten sowie 'In'- und' Out'-Kanten - und das Modell kennt Knoten, die nur in einer Richtung verbunden sind. Dadurch kann ich die Blattknoten als Ausgangspunkt finden, mein Plan war um von jedem dieser Blattknoten für jeden "Spaziergang" den Graphen zurück zu gehen und eine Liste aller anderen Knoten zu führen, die ich auf meiner Route gefunden habe. Wenn ich zu irgendeinem Zeitpunkt bereits etwas in der Liste sehe, weiß ich, dass ich einen Zyklus in der Grafik gefunden habe. Dies fühlt sich jedoch etwas simpel an.

Ich bin sicher, dass dies ein gelöstes Problem ist. Es wäre einfach schön, wenn es in einfachen Worten erklärt werden könnte.

-As

Phatmanace
quelle

Antworten:

6

Der einfachste Weg, wie ich mir vorstellen kann, Graphenzyklen in Laienbegriffen zu erklären, ist ungefähr so:

  • Zunächst gehe ich davon aus, dass Sie die Grundlagen eines Diagramms und der Knoten und Kanten kennen. In diesem Beispiel wird davon ausgegangen, dass Sie ein Diagramm haben, in dem alle Kanten nur in eine Richtung sind.
  • Erstellen Sie Ihr Diagramm und wählen Sie einen Knoten als Ausgangspunkt aus.
  • Erstellen Sie ein Containerobjekt (eine Liste oder ein Hash funktionieren am besten). Nennen Sie es "besucht".
  • Erstellen Sie ein zweites Containerobjekt (hier wäre eine Warteschlange ideal) und nennen Sie es "Öffnen".
  • Fügen Sie den Startknoten zur Liste Öffnen hinzu.
  • Wiederholen Sie diesen Vorgang, solange die Liste "Öffnen" nicht leer ist:
    • Entfernen Sie das erste Element aus Öffnen und nennen Sie es Aktuell
    • Wenn in Visited Current vorhanden ist, haben Sie einen Zyklus.
    • Wenn nicht, fügen Sie Current zu Visited hinzu und fügen Sie dann alle Knoten hinzu, die Current von seinen ausgehenden Kanten bis Open erreichen kann.
  • Wenn Open leer ist und keine Zyklen erkannt wurden, haben Sie keine Zyklen. (Zumindest nicht in der erreichbaren Menge, die vom Startpunkt ausgeht. Dies ist nicht unbedingt die Gesamtheit Ihres Diagramms, wenn Sie Inseln in Ihrem Diagramm haben.)
Mason Wheeler
quelle
0

Grundsätzlich führen Sie eine breite erste Suche in der Grafik durch und verfolgen mithilfe einer Hashmap, welche Knoten Sie besucht haben.

Wenn Sie zu einem beliebigen Zeitpunkt auf einen Knoten stoßen, der bereits besucht wurde (in der Hashmap vorhanden), wissen Sie, dass das Diagramm einen Zyklus enthält.

agent13
quelle