Interaktives Graphentheorie-Lernen
Interaktives Graphentheorie-Lernen
Guest User
Using app without sign in
Finder für Zyklen im Graphen
Erkennt Zyklen in gerichteten und ungerichteten Graphen
Wählen Sie einen Algorithmus und generieren Sie Schritte, um die Visualisierung zu beginnen
Die Zykluserkennung bestimmt, ob ein Graph einen Zyklus enthält, also einen Pfad, der zu seinem Startknoten zurückkehrt. Die Techniken unterscheiden sich zwischen gerichteten Graphen, wo Zyklen zirkuläre Abhängigkeiten bedeuten, und ungerichteten, wo jede zusätzliche Kante über einen Baum hinaus einen Zyklus erzeugt.
In gerichteten Graphen klassifiziert DFS die Kanten: eine Rückkante zu einem noch auf dem Rekursionsstapel liegenden Knoten beweist einen Zyklus, verfolgt mit drei Knotenzuständen (unbesucht, in Arbeit, fertig). In ungerichteten Graphen findet DFS einen Zyklus, wenn sie einen besuchten Knoten trifft, der nicht ihr Elternknoten ist, und Union-Find erkennt einen, wenn eine Kante zwei bereits in derselben Menge liegende Knoten verbindet. Alle Ansätze laufen in O(V + E), Union-Find nahezu konstant pro Kante.
Zykluserkennung verhindert Deadlocks in Betriebssystemen, fängt zirkuläre Importe in Build-Werkzeugen und Paketmanagern ab, validiert Tabellenkalkulationen und Workflow-Definitionen und ist der Türsteher der topologischen Sortierung. Floyds Hase-und-Igel-Variante für verkettete Listen ist eine der meistgefragten Interviewfragen überhaupt.
Gerichtete und ungerichtete Graphen brauchen wirklich verschiedene Tests. Die gerichtete Variante verfolgt den Rekursionsstapel, die ungerichtete den Vorgänger.
// Gerichtet: DFS mit drei Farben
WEISS = unbesucht, GRAU = im Stapel, SCHWARZ = fertig
hatZyklus(u):
farbe[u] = GRAU
für jeden Nachbarn v von u:
wenn farbe[v] == GRAU: gib wahr zurück
wenn farbe[v] == WEISS und hatZyklus(v):
gib wahr zurück
farbe[u] = SCHWARZ
gib falsch zurück
// Ungerichtet: DFS, die den Vorgänger mitführt
hatZyklus(u, vorgänger):
besucht.hinzufügen(u)
für jeden Nachbarn v von u:
wenn v == vorgänger: weiter
wenn v in besucht: gib wahr zurück
wenn hatZyklus(v, u): gib wahr zurück
gib falsch zurückDer Unterschied wiegt schwerer, als er aussieht. In einem gerichteten Graphen ist das Erreichen eines SCHWARZEN Knotens eine Querkante und völlig zyklenfrei, sodass die naive Besuchtprüfung Zyklen meldet, die es nicht gibt. In einem ungerichteten Graphen verhindert das Überspringen des Vorgängers, dass jede einzelne Kante als Zweiknotenzyklus gelesen wird.
Führe den gerichteten Dreifarbentest auf einem Graphen aus, der einen Zyklus und eine irreführende Querkante enthält.
Beispielgraph: Gerichtete Kanten A nach B, A nach C, B nach D, C nach D und D nach B.
Der Graph enthält tatsächlich einen Zyklus, B nach D nach B, gefunden über den GRAU-Test. Der Weg A nach C nach D ist kein Zyklus, und nur die Farbunterscheidung trennt die beiden Fälle.
Zeit: O(V + E) · Speicher: O(V)
Beide Varianten sind eine einzelne DFS mit konstantem Zusatzaufwand je Kante, die Kosten entsprechen also denen des Durchlaufs. Das Farbfeld beziehungsweise die Besuchtmenge ist O(V), dazu O(V) Rekursionsstapel. Die Union-Find-Alternative für ungerichtete Graphen läuft in O(E alpha(V)), praktisch linear, und ist vorzuziehen, wenn die Kanten einzeln eintreffen und du die zyklusschließende Kante direkt beim Einfügen ablehnen willst, ohne den Graphen erneut zu durchlaufen.
Wähle den Test passend zur Richtung deiner Kanten und dazu, ob der Graph statisch ist oder nach und nach entsteht.
| Alternative | Vorzuziehen, wenn | Kosten |
|---|---|---|
| Union-Find | Ungerichtet, und die Kanten treffen nach und nach ein. Lehnt die zyklusschließende Kante beim Einfügen in nahezu konstanter Zeit ab. | O(E·α(V)) |
| Topologische Sortierung nach Kahn | Gerichtet, und du willst zugleich die Ordnung, falls kein Zyklus vorliegt. Die übrig gebliebenen Knoten sind genau der zyklische Teil. | O(V + E) |
| Tarjan SCC | Gerichtet, und du willst wissen, welche Knoten in Zyklen liegen, statt nur ob es einen gibt. Jede Komponente mit mehr als einem Knoten ist ein Zyklus. | O(V + E) |
| Floyds Zyklensuche | Ein funktionaler Graph oder eine verkettete Liste, in der jeder Knoten genau einen Nachfolger hat. Benötigt O(1) Speicher. | O(n) |
Den ganzen Artikel lesen: Graph Algorithms in Coding Interviews
Verwandte Algorithmen: Tiefensuche, Topologische Sortierung, Kruskal MST-Algorithmus