Algorithmus von Kruskal

Der Algorithmus von Kruskal (nach seinem Erfinder Joseph Kruskal, 1956) dient der Berechnung von minimalen Spannbäumen in zusammenhängenden, ungerichteten, kantengewichteten Graphen. In unzusammenhängenden Graphen berechnet der Algorithmus einen minimalen Wald, also minimal spannende Bäume für jede Zusammenhangskomponente des Graphen.

Inhaltsverzeichnis

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.

Input

Als Eingabe dient ein zusammenhängender kantenbewerteter Graph G = (V,\,E,\,w). V bezeichnet die Menge der Ecken (vertices), E die Menge der Kanten (edges). Die Gewichtsfunktion w: E \rightarrow \mathbb{N}ordnet jeder Kante einen Zahlenwert zu.

Output

Der Algorithmus liefert einen minimalen Spannbaum T_{min}(G) = (V,\,E') mit E' \subseteq E.

Algorithmus

Der Algorithmus von Kruskal arbeitet nicht deterministisch, d.h. er liefert unter Umständen beim wiederholten Ausführen unterschiedliche Ergebnisse. Diese Ergebnisse sind allesamt minimale Spannbäume von G und damit gleichwertige Lösungen.

  1. Sortiere die Kanten von G aufsteigend nach ihrer Bewertung.
  2. Setze E'\,:=\,\emptyset und L\,:=\,E.
  3. Solange |E'| < |V|\,-\,1 ist, wähle in L eine Kante e mit kleinster Bewertung. Entferne e aus L.
    Wenn (V,\,E' \cup \{e\}) keinen Kreis enthält, füge e zu E' hinzu.
  4. Dann ist T_{min}(G) = (V,\,E') ein minimaler Spannbaum von G.


Derselbe Algorithmus lässt sich analog für einen maximalen Spannbaum anwenden.

Beispiel

left|framed

Zeitkomplexität

Im folgenden sei m die Anzahl der Kanten und n die Anzahl der Knoten. Die Laufzeit des Algorithmus beruht im wesentlichen auf dem notwendigen Sortieren der Kanten nach ihren Gewichten und beträgt O(m * log(m)). Insbesondere bei Graphen mit vielen Kanten ist in sofern der Algorithmus von Prim effizienter.

Der Algorithmus von Kruskal arbeitet schneller, wenn die Kanten bereits vorsortiert sind. Um dann in konstanter Zeit zu ermitteln, ob eine Kante zwei Komponenten verbindet, wird zu jedem Knoten ein Verweis auf seine Komponente gespeichert. Die Vereinigung von Komponenten ist amortisiert in O(log(n)) möglich. Dazu wird zu jeder Komponente ihre Größe gespeichert, so dass bei einer Vereinigung immer die kleinere Komponente der größeren hinzugefügt werden kann. Insgesamt kann somit jeder Knoten höchstens log(n)-mal in eine anderen Komponente verschoben werden.

Siehe auch

Literatur

Kruskal, Algorithmus von Kategorie:Graphentheorie Kategorie:Mathematical Subject Classification 05C85 Kategorie:Optimierungsalgorithmus

See also: Algorithmus von Kruskal, Algorithmus von Prim, Amortisierte Laufzeitanalyse, Graph (Graphentheorie), Kantengewichteter Graph, Kreis (Graphentheorie), Minimal spannender Baum, Sortierverfahren, Spannbaum, Teilgraph