Arian Soleimanzadeh
  • Startseite
  • Blog
  • Podcasts
  • Videos
  • Kontakt
العربيةArabic
DeutschGerman
EnglishEnglish
فارسیPersian
한국어Korean
中文Chinese
Bereich•Schnellkontakt

Languages

Choose your interface locale

ar

العربية

Arabic

de

Deutsch

German

en

English

English

fa

فارسی

Persian

ko

한국어

Korean

zh

中文

Chinese

Termin vereinbaren

Senden Sie eine kurze Nachricht — ich antworte so bald wie möglich.

LinkedInSchnelle Antwort
Startseite/Artikel/Was ist der Kosaraju-Algorithmus und welches Problem löst er?
KosarajuArtikel

Was ist der Kosaraju-Algorithmus und welches Problem löst er?

Eine verständliche Einführung in den Kosaraju-Algorithmus: Strongly Connected Components, das zugrunde liegende Problem, die Kernidee des Verfahrens und praktische Anwendungen in Softwaresystemen.

19. August 20268 Min. Lesezeit4 Aufrufe
#Kosaraju#Graph Algorithms#Strongly Connected Components#SCC#DFS#Directed Graph#Algorithmen#Software Engineering

Arian Soleimanzadeh

Software Engineer & Researcher

Konzeptdarstellung des Kosaraju-Algorithmus und stark zusammenhängender Komponenten in einem gerichteten Graphen

Arian Soleimanzadeh

KI · Code · Produkt

Forschung + Engineering
Auf dieser Seite
EinführungWas ist ein Graph?Was ist ein gerichteter Graph?Wo liegt das eigentliche Problem?Was bedeutet Strongly Connected?Was ist eine Strongly Connected Component?Was macht der Kosaraju-Algorithmus?Warum sind SCCs wichtig?Zirkuläre SoftwareabhängigkeitenMicroservicesSoziale NetzwerkeWebgraphenCompiler und ProgrammanalysePackage-ManagementWarum reicht normales DFS nicht aus?Die Grundidee von KosarajuEinfaches BeispielZeitkomplexitätGibt es Alternativen?Wann sollte man an Kosaraju denken?Cycle und SCC sind nicht dasselbeFazit

Einführung

Viele Graphalgorithmen wirken zunächst kompliziert, lösen aber häufig ein sehr verständliches Problem. Der Kosaraju-Algorithmus ist ein gutes Beispiel dafür.

Er wird verwendet, um Strongly Connected Components, kurz SCCs, in einem gerichteten Graphen zu finden.

In diesem Artikel beginnen wir bewusst nicht mit mathematischen Beweisen oder Code, sondern mit dem Problem selbst.


Was ist ein Graph?

Ein Graph besteht aus Knoten und Verbindungen zwischen diesen Knoten.

Beispiel:

Code
123
A --- B
|     |
C --- D

Graphen modellieren unter anderem:

  • soziale Netzwerke
  • Straßennetze
  • Serverkommunikation
  • Softwareabhängigkeiten
  • Links zwischen Webseiten
  • Kontrollfluss in Programmen
  • Beziehungen zwischen Microservices

Was ist ein gerichteter Graph?

In einem gerichteten Graphen besitzt jede Kante eine Richtung.

Code
1
A → B

bedeutet, dass ein Weg von A nach B existiert. Daraus folgt jedoch nicht automatisch, dass man auch von B nach A gelangen kann.

In einer Softwarearchitektur kann etwa:

Code
1
Service A → Service B

bedeuten, dass Service A von Service B abhängig ist.


Wo liegt das eigentliche Problem?

Betrachten wir:

Code
12345
A → B → C
↑       ↓
└───────┘

D → E

Von A gelangen wir zu B, von B zu C und von C wieder zurück zu A.

Damit bilden:

Code
1
{A, B, C}

eine besonders stark verbundene Gruppe.

Dagegen können wir zwar von D nach E gelangen, aber nicht wieder von E nach D zurück.


Was bedeutet Strongly Connected?

Zwei Knoten u und v sind stark zusammenhängend, wenn sowohl ein Pfad

Code
1
u → ... → v

als auch ein Pfad

Code
1
v → ... → u

existiert.

Beide Knoten müssen sich also gegenseitig erreichen können.


Was ist eine Strongly Connected Component?

Eine Strongly Connected Component ist eine maximale Gruppe von Knoten, innerhalb der jeder Knoten jeden anderen erreichen kann.

Zum Beispiel:

Code
1234567
A → B → C
↑       ↓
└───────┘

D → E → F
↑       ↓
└───────┘

enthält zwei SCCs:

Code
12
SCC 1 = {A, B, C}
SCC 2 = {D, E, F}

Was macht der Kosaraju-Algorithmus?

Kosaraju findet alle SCCs eines gerichteten Graphen.

Für:

Code
123456
A → B
B → C
C → A
C → D
D → E
E → D

liefert er beispielsweise:

Code
12
SCC 1 = {A, B, C}
SCC 2 = {D, E}

Vereinfacht gesagt:

Kosaraju zerlegt einen gerichteten Graphen in maximale Gruppen von Knoten, die sich gegenseitig über gerichtete Pfade erreichen können.


Warum sind SCCs wichtig?

Zirkuläre Softwareabhängigkeiten

Code
123
Module A → Module B
Module B → Module C
Module C → Module A

Diese Module bilden eine zirkuläre Abhängigkeit und gehören zu derselben SCC.

Microservices

Abhängigkeitszyklen zwischen Services können durch SCC-Analyse sichtbar gemacht werden.

Soziale Netzwerke

Follower-Beziehungen lassen sich als gerichtete Kanten modellieren. SCCs beschreiben dann Bereiche mit gegenseitiger Erreichbarkeit.

Webgraphen

Webseiten sind Knoten und Hyperlinks gerichtete Kanten. SCCs können stark miteinander verlinkte Bereiche identifizieren.

Compiler und Programmanalyse

Control-Flow-, Call- und Dependency-Graphen enthalten häufig Zyklen. SCCs helfen bei der strukturellen Analyse solcher Graphen.

Package-Management

Auch zyklische Abhängigkeiten zwischen Bibliotheken und Paketen lassen sich mit SCC-Verfahren analysieren.


Warum reicht normales DFS nicht aus?

Betrachten wir:

Code
1
A → B → C

Ein DFS von A besucht alle drei Knoten.

Trotzdem gehören sie nicht zu derselben SCC, weil C weder B noch A erreichen kann.

Daher gilt:

Code
1
Reachability ≠ Strong Connectivity

Kosaraju löst genau dieses Problem.


Die Grundidee von Kosaraju

Auf hoher Ebene arbeitet der Algorithmus in drei Schritten:

  1. DFS auf dem ursprünglichen Graphen und Speichern der Abschlussreihenfolge.
  2. Umkehren aller Kanten und Erzeugen des Transpose Graph.
  3. Erneutes DFS auf dem transponierten Graphen in einer speziellen Reihenfolge.

Schematisch:

Code
1234567891011
Original Graph
      ↓
     DFS
      ↓
Finish Order
      ↓
Transpose Graph
      ↓
     DFS
      ↓
     SCCs

Jeder DFS-Durchlauf in der zweiten Phase identifiziert eine SCC.


Einfaches Beispiel

Code
1234567
A → B → C
↑       ↓
└───────┘

C → D
D → E
E → D

Hier erhalten wir:

Code
12
SCC 1 = {A, B, C}
SCC 2 = {D, E}

C kann D erreichen, aber D und E können nicht zu A, B oder C zurückkehren. Deshalb bleiben die Komponenten getrennt.


Zeitkomplexität

Mit einer Adjazenzlisten-Darstellung beträgt die Laufzeit:

Code
1
O(V + E)

Dabei ist:

  • V die Anzahl der Knoten.
  • E die Anzahl der Kanten.

Damit ist Kosaraju auch für große Graphen effizient.


Gibt es Alternativen?

Ja. Bekannte Alternativen sind:

  • Tarjan's Algorithm
  • Gabow's Algorithm

Auch Tarjan läuft in O(V + E). Kosaraju ist jedoch aufgrund seines übersichtlichen Aufbaus häufig besonders gut zum Lernen geeignet.


Wann sollte man an Kosaraju denken?

Typische Hinweise in einer Aufgabenstellung sind:

  • Strong Connectivity
  • Mutual Reachability
  • Circular Dependency
  • zyklische Module
  • zyklische Services
  • Komponenten eines gerichteten Graphen

Dann ist SCC-Analyse häufig der richtige Ansatz.


Cycle und SCC sind nicht dasselbe

Ein Cycle ist ein geschlossener Pfad wie:

Code
1
A → B → C → A

Eine SCC dagegen ist eine maximale Menge gegenseitig erreichbarer Knoten.

Eine SCC kann mehrere unterschiedliche Zyklen enthalten.


Fazit

Der Kosaraju-Algorithmus findet Strongly Connected Components in gerichteten Graphen.

SCCs treten unter anderem bei Softwareabhängigkeiten, Microservices, sozialen Netzwerken, Compilern, Webgraphen und Package-Systemen auf.

Kosaraju verwendet zwei DFS-Phasen und einen transponierten Graphen und erreicht mit Adjazenzlisten eine Laufzeit von O(V + E).

Die wichtigste Idee lautet:

Kosaraju sucht nicht lediglich nach einzelnen Zyklen, sondern zerlegt einen gerichteten Graphen in maximale Gruppen gegenseitig erreichbarer Knoten.

Im nächsten Artikel betrachten wir Strongly Connected Components genauer, bevor wir den Ablauf von Kosaraju Schritt für Schritt analysieren.

Auf dieser Seite
EinführungWas ist ein Graph?Was ist ein gerichteter Graph?Wo liegt das eigentliche Problem?Was bedeutet Strongly Connected?Was ist eine Strongly Connected Component?Was macht der Kosaraju-Algorithmus?Warum sind SCCs wichtig?Zirkuläre SoftwareabhängigkeitenMicroservicesSoziale NetzwerkeWebgraphenCompiler und ProgrammanalysePackage-ManagementWarum reicht normales DFS nicht aus?Die Grundidee von KosarajuEinfaches BeispielZeitkomplexitätGibt es Alternativen?Wann sollte man an Kosaraju denken?Cycle und SCC sind nicht dasselbeFazit

Artikeldetails

Veröffentlichungsdaten, Lesezeit und aktuelle Aufrufzahlen.

Veröffentlicht

19. August 2026

Aktualisiert

20. August 2026

Lesezeit

8 Min. Lesezeit

Aufrufe

4

Autor

Arian Soleimanzadeh

Vorheriger Artikel

Longest Common Substring erklärt: Dynamic Programming und TypeScript

Nächster Artikel

Was ist die Hamming-Distanz? Konzept, Implementierung und praktische Anwendungen

Lassen Sie uns etwas Klares, Schnelles und Schönes bauen.

Schneller Kontakt für Zusammenarbeit, Beratung oder Produktarbeit.

SchnellkontaktE-Mail senden
Arian Soleimanzadeh

Ein persönliches Portfolio mit Fokus auf moderne Webentwicklung, UI-Systeme und praxisnahe KI-Produkte — sauberer Code, klares Design.

Schnellzugriff

  • Über mich
  • Blog
  • Projekte
  • Kontakt

Kontakt

  • info@ariansoleimanzadeh.site
  • soleimanzadeh.a.work@gmail.com

Verfügbarkeit: Wochentage

Antwortet in der Regel innerhalb von 24 Std.

Newsletter

Erhalten Sie Neuigkeiten zu Beiträgen, Projekten und neuen Veröffentlichungen.

© 2026 ariansoleimanzadeh.site — Alle Rechte vorbehalten.

LinkedIn