Interaktives Graphentheorie-Lernen
Interaktives Graphentheorie-Lernen
Guest User
Using app without sign in
Rechner für minimalen Spannbaum
Findet minimalen Spannbaum durch Sortierung der Kanten und Union-Find
Wählen Sie einen Algorithmus und generieren Sie Schritte, um die Visualisierung zu beginnen
Der Algorithmus von Kruskal findet einen minimalen Spannbaum, indem er die Kanten in aufsteigender Gewichtsreihenfolge betrachtet und jede Kante hinzufügt, die keinen Zyklus erzeugt. Anders als der baumbildende Ansatz von Prim lässt Kruskal einen Wald von Komponenten wachsen, die nach und nach zu einem Baum verschmelzen.
Nach dem Sortieren aller Kanten nach Gewicht durchläuft der Algorithmus sie von der kleinsten an. Für jede Kante prüft er mit einer Union-Find-Struktur in nahezu konstanter Zeit, ob die beiden Endpunkte bereits in derselben Komponente liegen. Ist das nicht der Fall, wird die Kante akzeptiert und die Komponenten verschmelzen; andernfalls wird sie als Zyklus-Kante übersprungen. Das Sortieren dominiert die Kosten und ergibt O(E log E) Zeit.
Der Algorithmus von Kruskal wird für dünne Graphen und für Probleme mit vorsortierten Kanten bevorzugt, etwa Single-Linkage-Clustering, Bildsegmentierung und Netzentwurf mit Kostenstufen. Die eingebettete Union-Find-Struktur ist selbst ein Top-Interviewthema und deckt Pfadkompression und Union by Rank ab.
Sortiere alle Kanten nach Gewicht und gehe die Liste durch, wobei jede Kante hinzugefügt wird, die zwei verschiedene Komponenten verbindet. Union-Find macht die Prüfung auf "verschiedene Komponenten" nahezu kostenlos.
Kruskal(graph):
sortiere alle Kanten aufsteigend nach Gewicht
makeSet(v) für jeden Knoten v
mst = []
für jede Kante (u, v, w) in sortierter Reihenfolge:
wenn find(u) != find(v): // verschiedene Komponenten
union(u, v)
mst.anhängen((u, v, w))
wenn mst V - 1 Kanten hat: abbrechen
gib mst zurückKruskal lässt einen Wald wachsen, keinen Baum. Mehrere unverbundene Fragmente entwickeln sich unabhängig und verschmelzen, sobald billige Kanten sie verbinden; das ist der strukturelle Unterschied zu Prim und der Grund, warum Kruskal unzusammenhängende Graphen mühelos behandelt: er liefert dann einfach einen minimalen Spannwald. Die Korrektheit folgt aus der Schnitteigenschaft, angewandt auf die Komponentengrenzen, genau wie bei Prim.
Baue den minimalen Spannbaum auf demselben Graphen wie im Prim-Beispiel, damit sich die beiden Entdeckungsreihenfolgen vergleichen lassen.
Beispielgraph: Ungerichtete Kanten A-B (2), A-C (3), B-C (1), C-D (4) und B-D (7).
Der minimale Spannbaum besteht aus B-C, A-B und C-D mit Gesamtgewicht 1 + 2 + 4 = 7, identisch mit dem, was Prim von A aus lieferte. Die Bäume stimmen überein, wie es bei verschiedenen Kantengewichten sein muss, doch die Entdeckungsreihenfolge unterscheidet sich: Prim ging A-B, B-C, C-D und wuchs von A nach außen, während Kruskal B-C, A-B, C-D in reiner Gewichtsreihenfolge ging und unterwegs ausdrücklich eine zyklusschließende Kante ablehnen musste.
Zeit: O(E log E) · Speicher: O(V + E)
Das Sortieren der Kanten dominiert alles Übrige mit O(E log E), was dasselbe ist wie O(E log V), da E höchstens V hoch 2 beträgt und log E somit innerhalb eines konstanten Faktors von log V liegt. Nach dem Sortieren führt die Schleife höchstens 2E find-Operationen und V - 1 union-Operationen aus. Mit Pfadkompression und Union by Rank kostet jede davon die inverse Ackermannfunktion von V, die für jede speicherbare Eingabe unter 5 liegt und als konstant behandelt wird. Der Union-Find-Anteil ist also effektiv O(E) und das Sortieren macht die gesamten Kosten aus. Treffen die Kanten bereits sortiert ein oder lassen sie sich in Eimer einsortieren, weil die Gewichte kleine ganze Zahlen sind, sinkt Kruskal auf nahezu linear und schlägt Prim deutlich.
Kruskal und Prim lösen dasselbe Problem. Dichte, Kantenreihenfolge und Zusammenhang entscheiden, welcher besser ist.
| Alternative | Vorzuziehen, wenn | Kosten |
|---|---|---|
| Prim-Algorithmus | Dichte Graphen, bei denen E sich V hoch 2 nähert und das Sortieren aller Kanten Verschwendung wäre. | O(E log V) oder O(V^2) |
| Boruvka-Algorithmus | Du willst parallelisieren. Jede Komponente wählt gleichzeitig ihre billigste ausgehende Kante. | O(E log V) |
| Kruskal mit Bucket-Sort | Die Gewichte sind kleine ganze Zahlen, das Sortieren wird linear und Kruskal insgesamt nahezu linear. | O(E·α(V)) |
| Minimaler Spannwald | Der Graph ist unzusammenhängend. Kruskal leistet das bereits ohne jede Änderung. | O(E log E) |
Den ganzen Artikel lesen: Kruskal's MST Algorithm Explained Step by Step
Den ganzen Artikel lesen: Minimum Spanning Trees: Prim, Kruskal and Boruvka
Verwandte Algorithmen: Prim MST-Algorithmus, Borůvka-Algorithmus, Zykluserkennung