Interaktives Graphentheorie-Lernen
Interaktives Graphentheorie-Lernen
Guest User
Using app without sign in
Generator für topologische Reihenfolge
Lineare Ordnung der Knoten in gerichteten azyklischen Graphen
Wählen Sie einen Algorithmus und generieren Sie Schritte, um die Visualisierung zu beginnen
Die topologische Sortierung erzeugt eine lineare Anordnung der Knoten eines gerichteten azyklischen Graphen (DAG), sodass jede Kante von einem früheren zu einem späteren Knoten zeigt. Sie beantwortet die Frage: In welcher Reihenfolge lassen sich Aufgaben ausführen, wenn manche von anderen abhängen?
Es gibt zwei Standardansätze. Der Algorithmus von Kahn entfernt wiederholt einen Knoten ohne eingehende Kanten, hängt ihn an die Ordnung an und verringert den Eingangsgrad seiner Nachbarn; eine Warteschlange enthält die aktuellen Knoten mit Eingangsgrad null. Der DFS-Ansatz führt eine Tiefensuche aus und gibt die Knoten in umgekehrter Reihenfolge ihrer Abschlusszeiten aus. Beide laufen in O(V + E). Bleiben Knoten übrig (Kahn) oder tritt eine Rückkante auf (DFS), enthält der Graph einen Zyklus und es gibt keine gültige Ordnung.
Die topologische Ordnung plant Build-Systeme wie Make und Gradle, löst die Reihenfolge der Paketinstallation, ordnet Studienfächer mit Voraussetzungen, sortiert die Auswertung von Tabellenzellen und plant die Befehlsausführung in Compilern. Sie zählt zu den häufigsten mittelschweren Interviewfragen zu gerichteten Graphen.
Zwei Standardformulierungen, beide linear. Kahn arbeitet vorwärts von Knoten ohne Voraussetzungen; die DFS-Variante arbeitet rückwärts über die Abschlusszeiten.
// Kahn: entferne wiederholt einen Knoten ohne Eingangskanten
berechne eingangsgrad[v] für jeden Knoten
schlange = alle Knoten mit eingangsgrad 0
ordnung = []
solange die Schlange nicht leer ist:
u = schlange.entnehmen()
ordnung.anhängen(u)
für jede Kante (u, v):
eingangsgrad[v] -= 1
wenn eingangsgrad[v] == 0: schlange.einfügen(v)
wenn ordnung.länge < V: der Graph hat einen Zyklus
// DFS-Variante: Umkehrung der Abschlussreihenfolge
führe DFS aus; lege jeden Knoten beim Abschluss auf einen Stapel
der abgeräumte Stapel ist eine gültige topologische OrdnungKahn hat einen praktischen Vorteil, den man kennen sollte: da er einen Zyklus daran erkennt, wie viele Knoten er ausgeben konnte, sind die übrig gebliebenen Knoten genau jene, die in einem Zyklus liegen oder ihm nachgelagert sind. Das macht ihn weit nützlicher als einen Wahrheitswert, wenn du melden musst, welche Abhängigkeiten zirkulär sind.
Führe Kahn auf einem kleinen Build-Abhängigkeitsgraphen aus, in dem eine Kante X nach Y bedeutet, dass X vor Y gebaut werden muss.
Beispielgraph: Gerichtete Kanten A nach C, B nach C, C nach D und B nach D.
Eine gültige Ordnung ist A, B, C, D. Beachte, dass B, A, C, D genauso gültig ist: A und B haben keine Voraussetzungen und ihre relative Reihenfolge ist unbestimmt. Die topologische Ordnung ist nur eindeutig, wenn der Graph eine einzige Kette bildet, weshalb Tests prüfen sollten, ob jede Kante vorwärts zeigt, statt gegen eine erwartete Sequenz zu vergleichen.
Zeit: O(V + E) · Speicher: O(V)
Alle Eingangsgrade zu berechnen erfordert einen Durchlauf über alle Kanten, O(E). Jeder Knoten wird genau einmal eingereiht und entnommen, O(V). Jede Kante wird genau einmal betrachtet, nämlich wenn ihre Quelle ausgegeben und der Eingangsgrad des Ziels verringert wird, nochmals O(E). Der Speicher hält das Eingangsgradfeld, die Schlange und die Ausgabeliste, alle O(V). Die DFS-Variante hat dieselben Schranken, mit dem Rekursionsstapel anstelle der Schlange. Keine lässt sich verbessern, da jeder korrekte Algorithmus alle Kanten lesen muss, um die Einschränkungen zu kennen.
Kahn und DFS liefern gleichermaßen gültige Ordnungen. Wähle danach, was du neben der Ordnung noch brauchst.
| Alternative | Vorzuziehen, wenn | Kosten |
|---|---|---|
| Kahn (BFS-Stil) | Du willst Zyklusdiagnose, die lexikographisch kleinste Ordnung über eine Prioritätswarteschlange, oder du musst tiefe Rekursion vermeiden. | O(V + E) |
| DFS-Abschlussreihenfolge | Du führst ohnehin eine DFS aus, oder du willst die kürzestmögliche Implementierung. | O(V + E) |
| Tarjan SCC | Der Graph hat Zyklen und du willst sie zu einem DAG verdichten, statt die Eingabe abzulehnen. | O(V + E) |
| Längster Weg / CPM | Die Knoten tragen Dauern und du willst den kritischen Pfad. Das ist eine topologische Ordnung plus ein DP-Durchlauf. | O(V + E) |
Den ganzen Artikel lesen: Graph Algorithms in Coding Interviews
Verwandte Algorithmen: Tiefensuche, Zykluserkennung, Methode des kritischen Pfades (CPM)