Algorithmus von Kruskal
Der Algorithmus von Kruskal ist ein Greedy-Algorithmus der Graphentheorie zur Berechnung minimaler Spannbäume von ungerichteten Graphen. Der Graph muss dazu zusätzlich zusammenhängend, kantengewichtet und endlich sein.
Der Algorithmus stammt von Joseph Kruskal, der ihn 1956 in der Zeitschrift „Proceedings of the American Mathematical Society“ veröffentlichte. Er beschrieb ihn dort wie folgt:
- Führe den folgenden Schritt so oft wie möglich aus: Wähle unter den noch nicht ausgewählten Kanten von
(dem Graphen) die kürzeste Kante, die mit den schon gewählten Kanten keinen Kreis bildet.[1]
Die kürzeste Kante bezeichnet dabei jeweils die Kante mit dem kleinsten Kantengewicht. Nach Abschluss des Algorithmus bilden die ausgewählten Kanten einen minimalen Spannbaum des Graphen.
Wendet man den Algorithmus auf unzusammenhängende Graphen an, so berechnet er für jede Zusammenhangskomponente des Graphen einen minimalen Spannbaum. Diese Bäume bilden einen minimalen aufspannenden Wald.
Inhaltsverzeichnis |
[Bearbeiten] Beispiel
[Bearbeiten] Formalisierter Algorithmus
Die Grundidee ist, die Kanten in Reihenfolge aufsteigender Kantengewichte zu durchlaufen und jede Kante zur Lösung hinzuzufügen, die mit allen zuvor gewählten Kanten keinen Kreis bildet. Es werden somit sukzessiv sogenannte Komponenten zum minimalen Spannbaum verbunden.
[Bearbeiten] Input
Als Eingabe dient ein zusammenhängender kantenbewerteter Graph
.
bezeichnet die Menge der Ecken (vertices),
die Menge der Kanten (edges). Die Gewichtsfunktion
ordnet jeder Kante ein Kantengewicht zu.
[Bearbeiten] Output
Der Algorithmus liefert einen minimalen Spannbaum
mit
.
[Bearbeiten] Algorithmus
Der Algorithmus von Kruskal arbeitet nicht-deterministisch, d.h. er liefert unter Umständen beim wiederholten Ausführen unterschiedliche Ergebnisse. Alle diese Ergebnisse sind minimale Spannbäume von
.
G = (V,E,w): ein zusammenhängender, ungerichteter, kantengewichteter Graph kruskal(G) 12
3 Sortiere die Kanten in L aufsteigend nach ihrem Kantengewicht. 4 solange
5 wähle eine Kante
mit kleinstem Kantengewicht 6 entferne die Kante
aus
7 wenn der Graph
keinen Kreis enthält 8 dann
9 M = (V,E') ist ein minimaler Spannbaum von G.
Derselbe Algorithmus lässt sich analog für einen maximalen Spannbaum anwenden. Sei
etwa ein zusammenhängender kantengewichteter Graph. Dann gibt man
mit
,
und
im Algorithmus von Kruskal ein. Als Ausgabe erhält man schließlich einen minimalen Spannbaum von
und somit einen maximalen von
.
[Bearbeiten] Korrektheitsbeweis
Sei
ein zusammenhängender kantengewichteter Graph und
die Ausgabe des Algorithmus von Kruskal. Um nun die Korrektheit des Algorithmus zu beweisen, muss Folgendes gezeigt werden:
- der Algorithmus terminiert (er enthält keine Endlosschleife).
ist ein minimaler Spannbaum von
, also:
ist spannender Teilgraph von
.
enthält keinen Kreis.
ist zusammenhängend.
ist bezüglich
minimal.
Im Nachstehenden folgen einige Beweisideen, die die Gültigkeit der einzelnen Aussagen darlegen:
- Terminierung
- Durch Zeile 6 wird in jedem Schleifendurchlauf genau ein Element aus
entfernt. Außerdem wird
durch keine weitere Operation verändert. Aus
werden wegen Zeile 4 nur solange Elemente entfernt, bis
. Da zu Beginn im Algorithmus
gesetzt wurde und
nach Definition nur endlich ist, wird auch die Schleife nur endlich oft durchlaufen. Daraus kann man folgern, dass Kruskals Algorithmus terminiert. - M ist spannender Teilgraph von G
- Da die Menge der Knoten nach Definition des Algorithmus bei
und
gleich ist und wegen Zeile 8 offensichtlich
gilt, ist
spannender Teilgraph von
. - M enthält keinen Kreis
- Dass
keinen Kreis beinhalten kann, ist durch Zeile 7 trivial. - M ist zusammenhängend
- Im Folgenden wird indirekt gezeigt, dass
zusammenhängend ist. Sei
also nicht zusammenhängend. Dann gibt es in
zwei Knoten
und
, die nicht durch einen Weg verbunden sind. Da aber
und
in
durch einen Weg verbunden sind, existiert eine Kante
in
, welche nicht in
vorhanden ist. Der Algorithmus betrachtet in Zeile 7 garantiert jede Kante aus
und damit auch
. Der Graph
in Zeile 7 muss kreisfrei sein, da es zwischen
und
in
keinen Weg gibt. Mit Zeile 8 wird
dann in
eingefügt. Dies widerspricht allerdings der Tatsache, dass
nicht in
enthalten ist. Somit ist unsere Annahme hinfällig und
doch zusammenhängend. - M ist bezüglich G minimal
- Wir zeigen durch Induktion, dass für
die folgende Behauptung wahr ist:
Wenn
die Kantenmenge ist, die im
-ten Schritt des Algorithmus erzeugt wurde, dann gibt es einen minimalen Spannbaum der
enthält. Die Behauptung ist für
wahr, d.h.
(d.h. es ist noch keine Kante eingeplant). Jeder minimale Spannbaum erfüllt die Behauptung und es existiert ein minimaler Spannbaum, da ein gewichteter, zusammenhängender Graph immer einen minimalen Spannbaum besitzt. Jetzt nehmen wir an, dass die Behauptung für
erfüllt ist und
die vom Algorithmus nach Schritt
erzeugte Kantenmenge ist. Es sei
der minimale Spannbaum der
enthält. Wir betrachten jetzt den Fall
. Dafür sei
die letzte vom Algorithmus eingefügte Kante.

- Behauptung ist auch für
erfüllt, da der minimale Spannbaum
um eine Kante aus dem minimalen Spannbaum
erweitert wird. 
- Dann enthält
einen Kreis und es gibt eine Kante
die im Kreis, aber nicht in
liegt. (Wenn es keine solche Kante
geben würde, dann hätte
nicht zu
hinzufügt werden können, da dann ein Kreis entstanden wäre.) Damit ist
ein Baum. Weiterhin kann das Gewicht von
nicht geringer als das Gewicht von
sein, da sonst der Algorithmus
anstelle von
hinzugefügt hätte. Mit
folgt, dass
gilt. Da aber
minimaler Spannbaum ist, gilt außerdem
und daraus folgt
. Somit ist
ein minimaler Spannbaum, der
enthält, und die Behauptung ist erfüllt.
Damit folgt für
, dass der Kruskal-Algorithmus nach
Schritten eine Menge
erzeugt, die zu einem minimalen Spannbaum erweitert werden kann. Da aber das Ergebnis nach
Schritten des Algorithmus bereits ein Baum ist (wie oben gezeigt wurde), muss dieser minimal sein.
[Bearbeiten] Zeitkomplexität
Im folgenden sei
die Anzahl der Kanten und
die Anzahl der Knoten. Die Laufzeit des Algorithmus setzt sich zusammen aus dem notwendigen Sortieren der Kanten nach ihrem Gewicht und dem Überprüfen, ob der Graph kreisfrei ist. Das Sortieren benötigt eine Laufzeit von
. Bei einer geeigneten Implementierung ist das Überprüfen auf Kreisfreiheit schneller möglich, so dass das Sortieren die Gesamtlaufzeit bestimmt. Insbesondere bei Graphen mit vielen Kanten ist insofern der Algorithmus von Prim effizienter.
Wenn die Kanten bereits vorsortiert sind, arbeitet der Algorithmus von Kruskal schneller. Man betrachtet nun, wie schnell das Überprüfen auf Kreisfreiheit möglich ist. Um eine bestmögliche Laufzeit zu erreichen, speichert man alle Knoten in einer Union-Find-Struktur. Diese enthält Informationen darüber, welche Knoten zusammenhängen. Zu Beginn ist noch keine Kante in den Spannbaum eingetragen, daher ist jeder Knoten für sich in einer einzelnen Partition. Wenn eine Kante
hinzugefügt werden soll, wird überprüft, ob
und
in verschiedenen Partitionen liegen. Dazu dient die Operation Find(x): Sie liefert einen Repräsentant der Partition, in dem der Knoten x liegt. Wenn Find(
) und Find(
) verschiedene Ergebnisse liefern, dann kann die Kante hinzugefügt werden und die Partitionen der beiden Knoten werden vereinigt (Union). Ansonsten würde durch Hinzunehmen der Kante ein Kreis entstehen, die Kante wird also verworfen. Insgesamt wird die Operation Find
(für jede Kante) und die Operation Union
mal aufgerufen. Bei Verwenden der Heuristiken Union-By-Size und Pfadkompression ergibt eine amortisierte Laufzeitanalyse für den Algorithmus [2] eine Komplexität von
. Dabei ist
definiert als
und praktisch konstant. Theoretisch wächst diese Funktion jedoch unendlich, weshalb sie in der O-Notation nicht weggelassen werden kann.
[Bearbeiten] Sonstiges
Der Algorithmus diente Kruskal ursprünglich als Hilfsmittel für einen vereinfachten Beweis, dass ein Graph mit paarweise verschiedenen Kantengewichten einen eindeutigen minimalen Spannbaum besitzt.
[Bearbeiten] Weblinks
- Vollständiger Beweis zur Korrektheit des Algorithmus von Kruskal, Ronny Harbich, 2006
- Anschauliche Darstellung des Algorithmus im Rahmen des Informatik Jahres 2006
[Bearbeiten] Quellen und Bemerkungen
- ↑ Joseph Kruskal: On the shortest spanning subtree and the traveling salesman problem. In: Proceedings of the American Mathematical Society. 7 (1956), S. 48–50
- ↑ Skript Theoretische Informatik III (PDF-Datei; 648 kB)
2
3 Sortiere die Kanten in L aufsteigend nach ihrem Kantengewicht.
4 solange
5 wähle eine Kante
mit kleinstem Kantengewicht
6 entferne die Kante
7 wenn der Graph
keinen Kreis enthält
8 dann
9 M = (V,E') ist ein minimaler Spannbaum von G.
. Da zu Beginn im Algorithmus
gesetzt wurde und
und
, die nicht durch einen Weg verbunden sind. Da aber
in Zeile 7 muss kreisfrei sein, da es zwischen
die folgende Behauptung wahr ist:
erfüllt, da der minimale Spannbaum 
einen Kreis und es gibt eine Kante
die im Kreis, aber nicht in
ein Baum. Weiterhin kann das Gewicht von
folgt, dass
gilt. Da aber
und daraus folgt
. Somit ist