Ordnung und DAGs

Topologische Sortierung erklärt, mit Code

Manches muss vor anderem geschehen: Installieren vor dem Bauen, Voraussetzung vor dem Kurs. Die topologische Sortierung verwandelt ein Geflecht von Abhängigkeiten in eine gerade Linie, der Sie folgen können. Hier ist, wie sie funktioniert, warum Zyklen sie brechen und wie man sie in wenigen Zeilen programmiert.

11 Min Lesezeit Aktualisiert: Juli 2026 Für Einsteiger geeignet
Mohammed Islam Hadjoudj
Mohammed Islam Hadjoudj
Expert Operations Research Engineer

Was ist eine topologische Sortierung?

Eine topologische Sortierung ist eine lineare Anordnung der Knoten eines gerichteten azyklischen Graphen (DAG), sodass für jede gerichtete Kante von u nach v der Knoten u vor dem Knoten v steht. Einfach gesagt: alles so aufreihen, dass jeder Pfeil nach vorne zeigt.

In dieser Definition stecken zwei Bedingungen. Der Graph muss gerichtet sein (Abhängigkeiten haben eine Richtung: A vor B ist nicht dasselbe wie B vor A) und azyklisch (keine Zyklen). Wenn A vor B und B vor A kommen muss, kann keine gültige Reihenfolge existieren. Bäume und DAGs sind hier nahe Verwandte; zur Baumseite siehe gewurzelte Bäume.

Wann Sie sie brauchen

Die topologische Sortierung ist die Antwort, sobald ein Problem klingt wie "erledige diese Dinge in einer Reihenfolge, die ihre Voraussetzungen respektiert". Sie erkennen es an diesen Signalen:

Sie ist eines der häufigsten Muster in technischen Interviews, weshalb sie im Leitfaden zu Graphenalgorithmen für Programmierinterviews vorkommt und eine Etappe des Graphentheorie-Lernpfads bildet.

Kahns Algorithmus, Schritt für Schritt

Die intuitivste Methode ist Kahns Algorithmus. Er stützt sich auf eine Zahl pro Knoten: den Eingangsgrad, die Anzahl der eingehenden Kanten. Ein Knoten mit Eingangsgrad 0 hat keine offenen Voraussetzungen, kann also gefahrlos als Nächstes platziert werden.

Die Schleife ist einfach: Nimm einen beliebigen Knoten mit Eingangsgrad 0, gib ihn aus und entferne seine ausgehenden Kanten, was die Eingangsgrade seiner Nachbarn senkt. Wiederhole, bis nichts mehr übrig ist. Lassen wir das auf diesem DAG laufen. Jeder Knoten trägt seine Position in einer gültigen Reihenfolge.

A B C D E F 1 2 3 4 5 6
Eine gültige topologische Reihenfolge: A, B, C, D, E, F. Jeder Pfeil zeigt von einer kleineren zu einer größeren Zahl.

Hier ist der Ablauf. Die Warteschlange enthält Knoten, deren Eingangsgrad 0 erreicht hat. Wir beginnen mit A, dem einzigen Knoten, der von nichts abhängt.

SchrittAusgabeWarteschlange (Eingangsgrad 0)
StartA
A nehmenAB, C
B nehmenA, BC
C nehmenA, B, CD, E
D nehmenA, B, C, DE
E nehmenA, B, C, D, EF
F nehmenA, B, C, D, E, Fleer

Beachten Sie: Nach dem Nehmen von A fiel der Eingangsgrad von B und C gleichzeitig auf 0. Beide könnten als Nächstes folgen, und genau deshalb hat ein DAG meist viele gültige Reihenfolgen. Die Eingangsgrade auf einem Live-Graphen fallen zu sehen, macht es greifbar, was Sie im Algorithmen-Visualisierer ausprobieren können.

Implementierung in Python

Kahns Algorithmus lässt sich fast direkt in Code übersetzen. Wir berechnen jeden Eingangsgrad, füllen eine Warteschlange mit den Knoten vom Eingangsgrad null und leeren sie.

from collections import deque, defaultdict

def topological_sort(num_nodes, edges):
    graph = defaultdict(list)
    in_degree = [0] * num_nodes

    for u, v in edges:          # Kante u -> v bedeutet u vor v
        graph[u].append(v)
        in_degree[v] += 1

    # Mit jedem Knoten starten, der keine Voraussetzungen hat.
    queue = deque(n for n in range(num_nodes) if in_degree[n] == 0)
    order = []

    while queue:
        node = queue.popleft()
        order.append(node)
        for neighbour in graph[node]:
            in_degree[neighbour] -= 1        # die Kante entfernen
            if in_degree[neighbour] == 0:    # keine Voraussetzungen mehr
                queue.append(neighbour)

    # Erreichte ein Knoten nie Eingangsgrad 0, hat ein Zyklus ihn blockiert.
    if len(order) == num_nodes:
        return order
    return []   # Zyklus erkannt, keine gültige Reihenfolge

Die abschließende Prüfung ist der elegante Teil: Fehlt in der Ausgabe ein Knoten, sind diese Knoten in einem Zyklus gefangen. Derselbe Code, der einen DAG ordnet, erkennt also auch, ob der Graph überhaupt ein DAG war.

Der DFS-Ansatz

Es gibt eine zweite klassische Methode, die auf der Tiefensuche beruht. Führen Sie DFS aus, und wenn ein Knoten abschließt (alle seine Nachfahren sind erkundet), legen Sie ihn auf einen Stapel. Die topologische Reihenfolge ist der Stapel, rückwärts gelesen.

Die Intuition: Ein Knoten schließt erst ab, nachdem alles, worauf er zeigt, abgeschlossen ist, sodass er in umgekehrter Abschlussreihenfolge vor all seinen Nachfahren landet. Die DFS-Variante braucht keine Eingangsgrad-Buchführung, doch Sie müssen dennoch gegen Zyklen absichern, indem Sie Knoten auf dem aktuellen Rekursionspfad verfolgen. Beide Ansätze sind gleichermaßen gültig; Kahns lässt sich meist leichter durchdenken, während DFS kompakter ist.

Zyklen und warum sie sie brechen

Eine topologische Reihenfolge existiert genau dann, wenn der Graph azyklisch ist. Der Grund ist unmittelbar: Ein Zyklus A → B → A verlangt, dass A vor B und B vor A steht, zugleich, was in einer Linie unmöglich ist.

Die nützliche Folge: Die topologische Sortierung ist auch ein Zyklendetektor. Können Sie in Kahns Algorithmus nicht alle V Knoten ausgeben, bilden die übrigen Knoten mindestens einen Zyklus. In der DFS-Variante signalisiert das Antreffen eines Knotens, der bereits auf Ihrem aktuellen Pfad liegt, einen Zyklus.

Deshalb löst man Interviewfragen im Stil von "Kursplan", die eigentlich fragen "ist das überhaupt möglich?", mit einer topologischen Sortierung.

Komplexität

Beide Algorithmen sind optimal: Sie berühren jeden Knoten und jede Kante genau einmal.

AspektKostenWarum
ZeitO(V + E)Jeder Knoten einmal entnommen, jede Kante einmal relaxiert
SpeicherO(V)Die Warteschlange, das Eingangsgrad-Array und die Ausgabe

Diese lineare Kosten sind der Grund, warum die topologische Sortierung auf riesige Abhängigkeitsgraphen skaliert. Wie sie sich gegen jeden anderen Graphenalgorithmus schlägt, sehen Sie im Komplexitätsleitfaden und im einseitigen Spickzettel.

Anwendungen in der Praxis

Sehen Sie zu, wie die Eingangsgrade fallen

Die topologische Sortierung erfasst man am leichtesten in Bewegung: Knoten schalten sich frei, sobald ihre letzte Voraussetzung wegfällt. Lassen Sie sie Schritt für Schritt auf einem Live-Graphen laufen.

Algorithmen-Visualisierer öffnen

Häufig gestellte Fragen

Was ist eine topologische Sortierung?

Eine topologische Sortierung ist eine lineare Anordnung der Knoten eines gerichteten azyklischen Graphen (DAG), sodass für jede gerichtete Kante von u nach v der Knoten u in der Reihenfolge vor v steht. Sie beantwortet Fragen wie: In welcher Reihenfolge kann ich diese Aufgaben ausführen, damit jede Voraussetzung zuerst erledigt ist?

Welcher Algorithmus wird für die topologische Sortierung verwendet?

Die beiden Standardmethoden sind Kahns Algorithmus, der mit einer Warteschlange wiederholt Knoten mit Eingangsgrad null entfernt, und eine Tiefensuche, die Knoten in umgekehrter Abschlussreihenfolge ausgibt. Beide laufen in O(V + E) Zeit.

Kann man einen Graphen mit einem Zyklus topologisch sortieren?

Nein. Eine topologische Anordnung existiert nur für einen gerichteten azyklischen Graphen. Hat der Graph einen Zyklus, gibt es keine gültige Reihenfolge, und dass der Algorithmus nicht jeden Knoten platzieren kann, ist genau die Art, den Zyklus zu erkennen.

Ist die topologische Reihenfolge eindeutig?

Meist nicht. Wann immer es zwischen zwei Knoten keinen Weg gibt, können sie in beliebiger Reihenfolge auftreten, sodass ein DAG oft viele gültige topologische Sortierungen hat. Eine eindeutige Reihenfolge gibt es nur, wenn der Graph eine einzige Kette ist.

Weitere Lernressourcen

Sehen, nicht nur lesen

Ein Abhängigkeitsgraph wird in dem Moment verständlich, in dem Sie zusehen, wie er sich zu einer Linie entwirrt. Laden Sie einen DAG, drücken Sie auf Start und verfolgen Sie, wie die Reihenfolge entsteht.

Üben Sie mit dem Algorithmen-Visualisierer