Menu
Coddy logo textTech

Kruskal-Algorithmus

Zuletzt aktualisiert

Der Kruskal-Algorithmus baut einen minimalen Spannbaum (MST) - die günstigste Kantenmenge, die jeden Knoten ohne Zyklen verbindet. Er sortiert alle Kanten nach Gewicht und fügt dann gierig die nächstgünstigste Kante hinzu, solange sie zwei noch nicht verbundene Knoten verbindet. Drücken Sie oben auf Wiedergabe, um den Baum wachsen zu sehen, eine sichere und günstige Kante nach der anderen.

Die Prüfung „bereits verbunden?" erfolgt mit einer Union-Find-Datenstruktur (disjunkte Mengen): Jede Kante wird übersprungen, wenn ihre beiden Endpunkte bereits in derselben Komponente liegen, denn ihr Hinzufügen würde einen Zyklus bilden. Das Sortieren dominiert die Kosten und ergibt insgesamt O(E log E). Kruskal glänzt bei dünn besetzten Graphen.

Zeit- und Speicherkomplexität

MaßKomplexitätAnmerkungen
ZeitO(E log E)Dominiert durch das Sortieren der Kanten
Union-Find-Operationen≈ O(E α(V))Nahezu konstant pro Prüfung mit Pfadkompression
SpeicherO(V + E)Kantenliste + Struktur disjunkter Mengen
Am besten fürDünn besetzte GraphenArbeitet aus einer globalen Kantenliste

Schritt für Schritt

SchrittWas passiert
1Sortiere jede Kante aufsteigend nach Gewicht.
2Setze jeden Knoten in seine eigene Komponente (Union-Find).
3Nimm die nächstgünstigste Kante.
4Wenn ihre Endpunkte in verschiedenen Komponenten liegen, füge sie dem Baum hinzu und vereinige sie.
5Andernfalls überspringe sie (sie würde einen Zyklus bilden).
6Stoppe, sobald der Baum V − 1 Kanten hat.

Durchgerechnetes Beispiel

Graph mit den Knoten A, B, C, D und den Kanten A-B(1), B-C(2), A-C(3), C-D(4), B-D(5). Sortierte Kanten: A-B(1), B-C(2), A-C(3), C-D(4), B-D(5):

Kante (Gewicht)Komponenten vorherAktion
A-B(1){A} {B} {C} {D}Verschiedene Komponenten - zum MST hinzufügen, zu {A,B} vereinigen.
B-C(2){A,B} {C} {D}Verschiedene Komponenten - zum MST hinzufügen, zu {A,B,C} vereinigen.
A-C(3){A,B,C} {D}A und C sind bereits zusammen - überspringen (würde einen Zyklus bilden).
C-D(4){A,B,C} {D}Verschiedene Komponenten - zum MST hinzufügen, zu {A,B,C,D} vereinigen.
Stopp{A,B,C,D}Der Baum hat V - 1 = 3 Kanten. MST = A-B, B-C, C-D, Gesamtgewicht 7.

Wann der Kruskal-Algorithmus zu verwenden ist

Verwende ihn, wennVermeide ihn, wenn
Der Graph dünn besetzt ist (wenige Kanten im Verhältnis zu den Knoten).Der Graph dicht ist - Prim mit einem Heap ist meist schneller.
Die Kanten bereits als sortierbare globale Liste vorliegen.Die Kanten nur über Adjazenzlisten kommen, die pro Knoten zu durchlaufen sind.
Du eine einfache, auf Union-Find gestützte Implementierung willst.Der Baum von einem bestimmten Startknoten aus wachsen soll.
Du einen Spannwald eines unzusammenhängenden Graphen bauen willst.Du Kanten im Datenstrom ohne vollständige Sortierung verarbeiten musst.

Kruskal's Algorithm-Code

Eine saubere, lauffähige Kruskal's Algorithm-Implementierung in Python, JavaScript, Java, C++, C. Wähle eine Sprache, kopiere den Code oder öffne ihn vorgeladen im Coddy-Playground.

Kruskal's Algorithm-Code in Python

Python
1def find(parent, x):2    while parent[x] != x:3        parent[x] = parent[parent[x]]  # path compression4        x = parent[x]5    return x6
7
8def kruskal(vertices, edges):9    # Take the cheapest edge that does not close a cycle10    parent = {v: v for v in vertices}11    mst, total = [], 012    for w, u, v in sorted(edges):13        root_u, root_v = find(parent, u), find(parent, v)14        if root_u != root_v:15            parent[root_u] = root_v16            mst.append((u, v, w))17            total += w18    return mst, total19
20
21vertices = ["A", "B", "C", "D", "E"]22edges = [23    (4, "A", "B"), (1, "A", "C"), (3, "B", "C"), (2, "B", "D"),24    (5, "C", "D"), (6, "C", "E"), (7, "D", "E"),25]26
27mst, total = kruskal(vertices, edges)28for u, v, w in mst:29    print(f"{u} - {v} (weight {w})")30print("Total MST weight:", total)
Führe diesen Code im Python-Playground aus

FAQ zum Kruskal-Algorithmus

Was ist ein minimaler Spannbaum?
Ein minimaler Spannbaum (MST) eines zusammenhängenden gewichteten Graphen ist eine Teilmenge von Kanten, die alle Knoten ohne Zyklen und mit dem kleinstmöglichen Gesamtgewicht verbindet. Er hat für V Knoten genau V - 1 Kanten.
Was ist der Unterschied zwischen dem Kruskal- und dem Prim-Algorithmus?
Beide bauen einen minimalen Spannbaum gierig auf. Kruskal sortiert alle Kanten global und fügt mithilfe von Union-Find die günstigste hinzu, die keinen Zyklus bildet. Prim lässt einen einzelnen Baum von einem Startknoten aus nach außen wachsen und fügt stets die günstigste Kante hinzu, die den Baum verlässt. Kruskal eignet sich für dünn besetzte Graphen; Prim (mit einem Heap) für dichte.
Warum verwendet der Kruskal-Algorithmus Union-Find?
Vor dem Hinzufügen einer Kante muss Kruskal prüfen, ob ihre beiden Endpunkte bereits verbunden sind - eine solche Kante hinzuzufügen würde einen Zyklus bilden. Union-Find (disjunkte Mengen) beantwortet „liegen sie in derselben Komponente?" und vereinigt Komponenten in nahezu konstanter amortisierter Zeit, was den Algorithmus effizient hält.
Wann sollte ich den Kruskal- statt des Prim-Algorithmus verwenden?
Bevorzuge Kruskal, wenn der Graph dünn besetzt ist und du bereits alle Kanten als sortierbare Liste hast - die O(E log E)-Sortierung ist günstig, wenn E klein ist. Der Prim-Algorithmus mit einem binären oder Fibonacci-Heap gewinnt meist bei dichten Graphen, in denen sich E an annähert, weil er das vorherige Sortieren aller Kanten vermeidet.
Funktioniert der Kruskal-Algorithmus bei unzusammenhängenden Graphen?
Ja. Ist der Graph unzusammenhängend, kann Kruskal einfach keine V - 1 Kanten erreichen und erzeugt stattdessen einen minimalen Spannwald - einen MST pro zusammenhängender Komponente. Das ergibt sich von selbst, weil Union-Find niemals Knoten vereinigt, zwischen denen kein Pfad besteht.
Was ist der häufigste Fehler bei der Implementierung des Kruskal-Algorithmus?
Das Weglassen von Pfadkompression und Union-by-Rank im Union-Find, wodurch jede Konnektivitätsprüfung von nahezu konstant auf nahezu linear absinkt und die Laufzeit dominieren kann. Ein weiterer häufiger Fehler ist, das tatsächliche Vereinigen der beiden Komponenten nach dem Hinzufügen einer Kante zu vergessen, wodurch spätere Kanten Zyklen bilden können.
Coddy programming languages illustration

Meistere Algorithmen mit Coddy

LOS GEHT'S