www.wikidata.de-de.nina.az
Der Algorithmus von Kruskal ist ein Greedy Algorithmus der Graphentheorie zur Berechnung minimaler Spannbaume von ungerichteten Graphen Der Graph muss dazu zusatzlich zusammenhangend kantengewichtet und endlich sein Der Algorithmus stammt von Joseph Kruskal der ihn 1956 in der Zeitschrift Proceedings of the American Mathematical Society veroffentlichte Er beschrieb ihn dort wie folgt Fuhre den folgenden Schritt so oft wie moglich aus Wahle unter den noch nicht ausgewahlten Kanten von G displaystyle G dem Graphen die kurzeste Kante die mit den schon gewahlten Kanten keinen Kreis bildet 1 Die kurzeste Kante bezeichnet dabei jeweils die Kante mit dem kleinsten Kantengewicht Nach Abschluss des Algorithmus bilden die ausgewahlten Kanten einen minimalen Spannbaum des Graphen Wendet man den Algorithmus auf unzusammenhangende Graphen an so berechnet er fur jede Zusammenhangskomponente des Graphen einen minimalen Spannbaum Diese Baume bilden einen minimalen aufspannenden Wald Inhaltsverzeichnis 1 Idee 2 Beispiel 3 Algorithmus 3 1 Input 3 2 Output 3 3 Pseudocode 3 4 Programmierung 3 5 Varianten 3 5 1 Paralleles Sortieren 3 5 2 Filter Kruskal 4 Korrektheitsbeweis 5 Zeitkomplexitat 6 Parallele Implementierung 7 Sonstiges 8 Weblinks 9 EinzelnachweiseIdee BearbeitenDer Algorithmus von Kruskal nutzt die Kreiseigenschaft minimaler Spannbaume englisch minimum spanning tree MST Dazu werden die Kanten in der ersten Phase aufsteigend nach ihrem Gewicht sortiert In der zweiten Phase wird uber die sortierten Kanten iteriert Wenn eine Kante zwei Knoten verbindet die noch nicht durch einen Pfad vorheriger Kanten verbunden sind wird diese Kante zum MST hinzugenommen Beispiel Bearbeiten nbsp Dies ist der Graph zu dem der Algorithmus von Kruskal einen minimalen Spannbaum berechnen wird Die Zahlen bei den einzelnen Kanten geben das jeweilige Kantengewicht an Zu Beginn ist noch keine Kante ausgewahlt nbsp Die Kanten AD und CE sind die kurzesten noch nicht ausgewahlten Kanten des Graphen Beide konnen ausgewahlt werden Hier wird zufallig AD ausgewahlt Dass diese keinen Kreis bildet ist im ersten Schritt selbstverstandlich nbsp Nun ist CE die kurzeste noch nicht ausgewahlte Kante Da sie mit AD keinen Kreis bildet wird sie nun ausgewahlt nbsp Die nachste Kante ist DF mit Lange 6 Sie bildet mit den schon gewahlten Kanten keinen Kreis und wird deshalb ausgewahlt nbsp Jetzt konnten die Kanten AB und BE jeweils mit Lange 7 ausgewahlt werden Es wird zufallig AB gewahlt Die Kante BD wird rot markiert da sie mit den bis jetzt gewahlten Kanten einen Kreis bilden wurde und somit im weiteren Verlauf des Algorithmus nicht mehr berucksichtigt werden muss nbsp BE ist nun mit Lange 7 die kurzeste der noch nicht ausgewahlten Kanten und da sie mit den bisher gewahlten keinen Kreis bildet wird sie ausgewahlt Analog zur Kante BD im letzten Schritt werden jetzt die Kanten BC DE und FE rot markiert nbsp Als letzte wird die Kante EG mit Lange 9 ausgewahlt da alle kurzeren bzw gleich langen Kanten entweder schon ausgewahlt sind oder einen Kreis bilden wurden Die Kante FG wird rot markiert Da nun alle nicht ausgewahlten Kanten einen Kreis bilden wurden sie sind rot markiert ist der Algorithmus am Ende angelangt und der grune Graph ist ein minimaler Spannbaum des zugrundeliegenden Graphen Algorithmus BearbeitenDie Grundidee ist die Kanten in Reihenfolge aufsteigender Kantengewichte zu durchlaufen und jede Kante zur Losung hinzuzufugen die mit allen zuvor gewahlten Kanten keinen Kreis bildet Es werden somit sukzessiv sogenannte Komponenten zum minimalen Spannbaum verbunden Input Bearbeiten Als Eingabe dient ein zusammenhangender kantenbewerteter Graph G V E w displaystyle G V E w nbsp V displaystyle V nbsp bezeichnet die Menge der Knoten vertices E displaystyle E nbsp die Menge der Kanten edges Die Gewichtsfunktion w E R displaystyle w colon E rightarrow mathbb R nbsp ordnet jeder Kante ein Kantengewicht zu Output Bearbeiten Der Algorithmus liefert einen minimalen Spannbaum M V E displaystyle M V E nbsp mit E E displaystyle E subseteq E nbsp Pseudocode Bearbeiten Der Algorithmus von Kruskal arbeitet nicht deterministisch d h er liefert unter Umstanden beim wiederholten Ausfuhren unterschiedliche Ergebnisse Alle diese Ergebnisse sind minimale Spannbaume von G displaystyle G nbsp nbsp Ein Beispiel fur den Algorithmus von Kruskal basierend auf dem Euklidischen Abstand G V E w ein zusammenhangender ungerichteter kantengewichteter Graph kruskal G 1 E displaystyle E leftarrow emptyset nbsp 2 L E displaystyle L leftarrow E nbsp 3 Sortiere die Kanten in L aufsteigend nach ihrem Kantengewicht 4 solange L displaystyle L neq emptyset nbsp 5 wahle eine Kante e L displaystyle e in L nbsp mit kleinstem Kantengewicht 6 entferne die Kante e displaystyle e nbsp aus L displaystyle L nbsp 7 wenn der Graph V E e displaystyle V E cup lbrace e rbrace nbsp keinen Kreis enthalt 8 dann E E e displaystyle E leftarrow E cup lbrace e rbrace nbsp 9 M V E ist ein minimaler Spannbaum von G Derselbe Algorithmus lasst sich analog fur einen maximalen Spannbaum anwenden Sei G V E w displaystyle G V E w nbsp etwa ein zusammenhangender kantengewichteter Graph Dann gibt man G V E w displaystyle G V E w nbsp mit w e s w e displaystyle w e s w e nbsp s N displaystyle s in mathbb N nbsp und e E s gt w e displaystyle forall e in E s gt w e nbsp im Algorithmus von Kruskal ein Als Ausgabe erhalt man schliesslich einen minimalen Spannbaum von G displaystyle G nbsp und somit einen maximalen von G displaystyle G nbsp Zum Testen ob Knoten u displaystyle u nbsp und v displaystyle v nbsp in unterschiedlichen Teilbaumen sind kann eine Union Find Struktur verwendet werden Dann ergibt sich eine Laufzeit von O T sort E E a V displaystyle O T text sort E E cdot alpha V nbsp Dabei ist T sort displaystyle T text sort nbsp die Zeit die zum Sortieren der Kantengewichte benotigt wird und a displaystyle alpha cdot nbsp das Inverse der Ackermannfunktion Fur realistische Eingaben ist a V displaystyle alpha V nbsp immer kleiner oder gleich 5 displaystyle 5 nbsp Programmierung BearbeitenDas folgende Beispiel in der Programmiersprache C zeigt die Implementierung eines ungerichteten Graphen mit einem Array von Kanten Der ungerichtete Graph wird als Klasse UndirectedGraph deklariert Bei der Ausfuhrung des Programms wird die Methode main verwendet die die Kanten und Kantengewichte eines minimalen Spannbaums auf der Konsole ausgibt Die Funktion unionSubsets verwendet union by rank um zwei Teilmengen von Kanten des Graphen zu vereinigen 2 include lt iostream gt include lt sstream gt using namespace std Deklariert den Datentyp fur die Knoten des Graphen struct Node int index string value Node next Deklariert den Datentyp fur die Kanten des Graphen struct Edge int startIndex int endIndex int weight Deklariert die Klasse fur den ungerichteten Graphen class UndirectedGraph public int numberOfVertices Edge edges Pointer auf das Array fur die Kanten Deklariert die Klasse fur Teilmengen Teilbaume der Kantenmenge des ungerichteten Graphen class subset public int parent Index der Wurzel int rank Rang der Teilmenge Diese rekursive Funktion gibt den Index der Wurzel der Teilmenge Teilbaum mit dem Index i zuruck int find subset subsets int i Setzt Index der Wurzel auf den Index der Wurzel der Teilmenge mit dem Index i if subsets i parent i subsets i parent find subsets subsets i parent Rekursiver Aufruf der Funktion return subsets i parent Diese Methode bildet die Vereinigungsmenge der zwei Teilmengen Teilbaume mit den Indexen index1 und index2 void unionSubsets subset subsets int index1 int index2 int newIndex1 find subsets index1 Index der Teilmenge mit dem Index index1 int newIndex2 find subsets index2 Index der Teilmenge mit dem Index index2 Hangt den Teilbaum mit dem niedrigeren Rang unter die Wurzel des Baums mit dem hoheren Rang if subsets newIndex1 rank lt subsets newIndex2 rank subsets newIndex1 parent newIndex2 else if subsets newIndex1 rank gt subsets newIndex2 rank subsets newIndex2 parent newIndex1 else Wenn die Teilbaume denselben Rang haben wird der Rang des einen Baums erhoht und der andere Baum unter die Wurzel des anderen Baums gehangt subsets newIndex2 parent newIndex1 subsets newIndex1 rank Diese Funktion vergleicht die Gewichte der Kanten edge1 und edge2 int compare const void edge1 const void edge2 return Edge edge1 gt weight gt Edge edge2 gt weight Gibt 1 zuruck wenn der Vergleich true ergibt Gibt 0 zuruck wenn der Vergleich false ergibt Diese Funktion verwendet den Algorithmus von Kruskal und gibt den minimalen Spannbaum zuruck Edge getMSTByKruskal UndirectedGraph graph Edge edges graph gt edges Pointer auf das Array fur die Kanten int numberOfVertices graph gt numberOfVertices Variable fur die Anzahl der Knoten int numberOfEdges sizeof edges Variable fur die Anzahl der Kanten Edge minimalSpanningTree new Edge numberOfVertices Deklariert ein Array fur die Kanten das als Ergebnis der Methode zuruckgegeben wird int currentIndex 0 Aktueller Kantenindex int nextIndex 0 Kantenindex fur die nachste Iteration qsort edges numberOfEdges sizeof edges 0 compare Sortiert das Array edges der Kanten mit der C Standardfunktion qsort Sortierverfahren Quicksort und der oben definierten Vergleichsfunktion compare subset subsets new subset numberOfVertices Deklariert ein Array fur die Teilmengen der Kantenmenge for int i 0 i lt numberOfVertices i for Schleife die Teilmengen mit einzelnen Kanten erzeugt subsets i parent i subsets i rank 0 while currentIndex lt numberOfVertices 1 amp amp nextIndex lt numberOfEdges So lange der aktuelle Kantenindex kleiner als die Anzahl der Knoten minus 1 ist Edge nextEdge edges nextIndex Weist die verbleibende Kante mit dem kleinsten Kantengewicht zu und erhoht den Kantenindex fur die nachste Iteration um 1 int index1 find subsets nextEdge startIndex Index der Wurzel der Teilmenge mit dem Index nextEdge startIndex int index2 find subsets nextEdge endIndex Index der Wurzel der Teilmenge mit dem Index nextEdge endIndex if index1 index2 Wenn die Kante keinen Zyklus erzeugt minimalSpanningTree currentIndex nextEdge Fugt die Kante dem minimalen Spannbaum hinzu unionSubsets subsets index1 index2 Methodenaufruf der die Vereinigungsmenge der zwei Mengen mit den Indexen index1 und index2 bildet return minimalSpanningTree Gibt die Kanten die Gewichte und das gesamte Kantengewicht des minimalen Spannbaums auf der Konsole aus string MSTtoString Edge minimalSpanningTree stringstream text int weight 0 for int i 0 i lt sizeof minimalSpanningTree 1 i Edge edge minimalSpanningTree i text lt lt lt lt edge startIndex lt lt lt lt edge endIndex lt lt Gewicht lt lt edge weight lt lt endl weight edge weight text lt lt Kantengewicht des minimalen Spannbaums lt lt weight lt lt endl return text str Typumwandlung von stringstream nach string Hauptfunktion die das Programm ausfuhrt int main Deklariert und initialisiert ein Array mit 5 Kanten Edge edges new Edge 5 edges 0 startIndex 0 edges 0 endIndex 1 edges 0 weight 10 edges 1 startIndex 0 edges 1 endIndex 2 edges 1 weight 6 edges 2 startIndex 0 edges 2 endIndex 3 edges 2 weight 5 edges 3 startIndex 1 edges 3 endIndex 3 edges 3 weight 15 edges 4 startIndex 2 edges 4 endIndex 3 edges 4 weight 4 Erzeugt den ungerichteten Graphen mit den gegebenen Kanten UndirectedGraph undirectedGraph new UndirectedGraph undirectedGraph gt edges edges undirectedGraph gt numberOfVertices 4 Edge minimalSpanningTree getMSTByKruskal undirectedGraph Aufruf der Methode die einen Pointer auf das Array von Kanten zuruckgibt cout lt lt MSTtoString minimalSpanningTree Aufruf der Methode die das Ergebnis auf der Konsole ausgibt Varianten Bearbeiten Paralleles Sortieren Bearbeiten Das Sortieren der ersten Phase kann parallelisiert werden In der zweiten Phase ist es fur die Korrektheit jedoch wichtig dass die Kanten nacheinander abgearbeitet werden Mit O log V displaystyle O log V nbsp Prozessoren kann in linearer Zeit parallel sortiert werden Dadurch sinkt die Gesamtlaufzeit auf O E a V displaystyle O E cdot alpha V nbsp Filter Kruskal Bearbeiten Eine Variante des Algorithmus von Kruskal namens Filter Kruskal wurde von Osipov et al 3 beschrieben und eignet sich besser zur Parallelisierung Die grundlegende Idee besteht darin die Kanten in ahnlicher Weise wie bei Quicksort zu partitionieren und anschliessend Kanten auszusortieren welche Knoten im gleichen Teilbaum verbinden um somit die Kosten fur die weitere Sortierung zu verringern Filter Kruskal eignet sich besser zur Parallelisierung da das Sortieren Partitionieren und Filtern einfach parallel ausgefuhrt werden konnen indem die Kanten zwischen den Prozessoren aufgeteilt werden Der Algorithmus wird im folgenden Pseudocode dargestellt filterKruskal G displaystyle G nbsp falls E lt displaystyle E lt nbsp KruskalSchwellwert return kruskal G displaystyle G nbsp pivot zufallige Kante aus E displaystyle E nbsp E displaystyle E leq nbsp E gt displaystyle E gt gets nbsp partition E displaystyle E nbsp pivot A displaystyle A gets nbsp filterKruskal E displaystyle E leq nbsp E gt displaystyle E gt gets nbsp filter E gt displaystyle E gt nbsp A A displaystyle A gets A nbsp displaystyle cup nbsp filterKruskal E gt displaystyle E gt nbsp return A displaystyle A nbsp partition E displaystyle E nbsp pivot E displaystyle E leq gets emptyset nbsp E gt displaystyle E gt gets emptyset nbsp fur alle u v E displaystyle u v in E nbsp falls gewicht u v displaystyle u v nbsp displaystyle leq nbsp gewicht pivot E E u v displaystyle E leq gets E leq cup u v nbsp sonst E gt E gt u v displaystyle E gt gets E gt cup u v nbsp return E displaystyle E leq nbsp E gt displaystyle E gt nbsp filter E displaystyle E nbsp E f i l t e r e d displaystyle E filtered gets emptyset nbsp fur alle u v E displaystyle u v in E nbsp falls find set u displaystyle neq nbsp find set v E f i l t e r e d E f i l t e r e d u v displaystyle E filtered gets E filtered cup u v nbsp return E f i l t e r e d displaystyle E filtered nbsp Korrektheitsbeweis BearbeitenSei G V E w displaystyle G V E w nbsp ein zusammenhangender kantengewichteter Graph und M V E displaystyle M V E nbsp die Ausgabe des Algorithmus von Kruskal Um nun die Korrektheit des Algorithmus zu beweisen muss Folgendes gezeigt werden der Algorithmus terminiert er enthalt keine Endlosschleife M displaystyle M nbsp ist ein minimaler Spannbaum von G displaystyle G nbsp also M displaystyle M nbsp ist spannender Teilgraph von G displaystyle G nbsp M displaystyle M nbsp enthalt keinen Kreis M displaystyle M nbsp ist zusammenhangend M displaystyle M nbsp ist bezuglich G displaystyle G nbsp minimal Im Nachstehenden folgen einige Beweisideen die die Gultigkeit der einzelnen Aussagen darlegen Terminierung Durch Zeile 6 wird in jedem Schleifendurchlauf genau ein Element aus L displaystyle L nbsp entfernt Ausserdem wird L displaystyle L nbsp durch keine weitere Operation verandert Aus L displaystyle L nbsp werden wegen Zeile 4 nur solange Elemente entfernt bis L displaystyle L emptyset nbsp Da zu Beginn im Algorithmus L E displaystyle L E nbsp gesetzt wurde und E displaystyle E nbsp nach Definition nur endlich ist wird auch die Schleife nur endlich oft durchlaufen Daraus folgt dass Kruskals Algorithmus terminiert M ist aufspannender Teilgraph von G Da die Menge der Knoten nach Definition des Algorithmus bei M displaystyle M nbsp und G displaystyle G nbsp gleich ist und wegen Zeile 8 offensichtlich E E displaystyle E subseteq E nbsp gilt ist M displaystyle M nbsp aufspannender Teilgraph von G displaystyle G nbsp M enthalt keinen Kreis Dass M displaystyle M nbsp keinen Kreis beinhalten kann ist durch Zeile 7 trivial M ist zusammenhangend Im Folgenden wird indirekt gezeigt dass M displaystyle M nbsp zusammenhangend ist Sei M displaystyle M nbsp also nicht zusammenhangend Dann gibt es in M displaystyle M nbsp zwei Knoten x displaystyle x nbsp und y displaystyle y nbsp die nicht durch einen Weg verbunden sind Da aber x displaystyle x nbsp und y displaystyle y nbsp in G displaystyle G nbsp durch einen Weg verbunden sind existiert eine Kante k displaystyle k nbsp in G displaystyle G nbsp welche nicht in M displaystyle M nbsp vorhanden ist Der Algorithmus betrachtet in Zeile 7 garantiert jede Kante aus G displaystyle G nbsp und damit auch k displaystyle k nbsp Der Graph V E k displaystyle V E cup lbrace k rbrace nbsp in Zeile 7 muss kreisfrei sein da es zwischen x displaystyle x nbsp und y displaystyle y nbsp in M V E displaystyle M V E nbsp keinen Weg gibt Mit Zeile 8 wird k displaystyle k nbsp dann in M displaystyle M nbsp eingefugt Dies widerspricht allerdings der Tatsache dass k displaystyle k nbsp nicht in M displaystyle M nbsp enthalten ist Somit ist unsere Annahme hinfallig und M displaystyle M nbsp doch zusammenhangend M ist bezuglich G minimal Wir zeigen durch Induktion dass fur k 0 n displaystyle k 0 n nbsp die folgende Behauptung wahr ist Wenn F displaystyle F nbsp die Kantenmenge ist die im k displaystyle k nbsp ten Schritt des Algorithmus erzeugt wurde dann gibt es einen minimalen Spannbaum der F displaystyle F nbsp enthalt Die Behauptung ist fur k 0 displaystyle k 0 nbsp wahr d h F displaystyle F emptyset nbsp d h es ist noch keine Kante eingeplant Jeder minimale Spannbaum erfullt die Behauptung und es existiert ein minimaler Spannbaum da ein gewichteter zusammenhangender Graph immer einen minimalen Spannbaum besitzt Jetzt nehmen wir an dass die Behauptung fur 0 k lt n displaystyle 0 leq k lt n nbsp erfullt ist und F displaystyle F nbsp die vom Algorithmus nach Schritt k displaystyle k nbsp erzeugte Kantenmenge ist Es sei H displaystyle H nbsp ein minimaler Spannbaum der F displaystyle F nbsp enthalt Wir betrachten jetzt den Fall k 1 displaystyle k 1 nbsp Dafur sei e displaystyle e nbsp die letzte vom Algorithmus eingefugte Kante Falls e H displaystyle e in H nbsp Dann ist die Behauptung auch fur F e displaystyle F e nbsp erfullt da der minimale Spannbaum F displaystyle F nbsp um eine Kante aus dem minimalen Spannbaum H displaystyle H nbsp erweitert wird Falls e H displaystyle e notin H nbsp Dann enthalt H e displaystyle H e nbsp einen Kreis und es gibt eine Kante f displaystyle f nbsp die im Kreis aber nicht in F displaystyle F nbsp liegt Wenn es keine solche Kante f displaystyle f nbsp geben wurde dann hatte e displaystyle e nbsp nicht zu F displaystyle F nbsp hinzufugt werden konnen da dann ein Kreis entstanden ware Damit ist H f e displaystyle H f e nbsp ein Baum Weiterhin kann das Gewicht von f displaystyle f nbsp nicht geringer als das Gewicht von e displaystyle e nbsp sein da sonst der Algorithmus f displaystyle f nbsp anstelle von e displaystyle e nbsp hinzugefugt hatte Mit w e w f displaystyle w e leq w f nbsp folgt dass w H f e w H displaystyle w H f e leq w H nbsp gilt Da aber H displaystyle H nbsp minimaler Spannbaum ist gilt ausserdem w H w H f e displaystyle w H leq w H f e nbsp und daraus folgt w H f e w H displaystyle w H f e w H nbsp Somit ist H f e displaystyle H f e nbsp ein minimaler Spannbaum der F e displaystyle F e nbsp enthalt und die Behauptung ist erfullt Damit folgt fur k n displaystyle k n nbsp dass der Kruskal Algorithmus nach n displaystyle n nbsp Schritten eine Menge F displaystyle F nbsp erzeugt die zu einem minimalen Spannbaum erweitert werden kann Da aber das Ergebnis nach n displaystyle n nbsp Schritten des Algorithmus bereits ein Baum ist wie oben gezeigt wurde muss dieser minimal sein Zeitkomplexitat BearbeitenIm Folgenden sei E displaystyle left E right nbsp die Anzahl der Kanten und V displaystyle left V right nbsp die Anzahl der Knoten Die Laufzeit des Algorithmus setzt sich zusammen aus dem notwendigen Sortieren der Kanten nach ihrem Gewicht und dem Uberprufen ob der Graph kreisfrei ist Das Sortieren benotigt eine Laufzeit von O E log E displaystyle mathcal O bigl left E right cdot log left E right bigr nbsp Bei einer geeigneten Implementierung ist das Uberprufen auf Kreisfreiheit schneller moglich 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 Uberprufen auf Kreisfreiheit moglich ist Um eine bestmogliche Laufzeit zu erreichen speichert man alle Knoten in einer Union Find Struktur Diese enthalt Informationen daruber welche Knoten zusammenhangen Zu Beginn ist noch keine Kante in den Spannbaum eingetragen daher ist jeder Knoten fur sich in einer einzelnen Partition Wenn eine Kante v 1 v 2 displaystyle v 1 v 2 nbsp hinzugefugt werden soll wird uberpruft ob v 1 displaystyle v 1 nbsp und v 2 displaystyle v 2 nbsp in verschiedenen Partitionen liegen Dazu dient die Operation Find x Sie liefert einen Reprasentanten der Partition in dem der Knoten x liegt Wenn Find v 1 displaystyle v 1 nbsp und Find v 2 displaystyle v 2 nbsp verschiedene Ergebnisse liefern dann kann die Kante hinzugefugt werden und die Partitionen der beiden Knoten werden vereinigt Union Ansonsten wurde durch Hinzunehmen der Kante ein Kreis entstehen die Kante wird also verworfen Insgesamt wird die Operation Find 2 E displaystyle 2 cdot left E right nbsp fur jede Kante und die Operation Union V 1 displaystyle left V right 1 nbsp mal aufgerufen Bei Verwenden der Heuristiken Union By Size und Pfadkompression ergibt eine amortisierte Laufzeitanalyse fur den Algorithmus eine Komplexitat von O E log V displaystyle mathcal O left E right cdot log left V right nbsp Dabei ist log n displaystyle log n nbsp definiert als min s N log log log n s mal 1 displaystyle min Bigl s in mathbb N mid underbrace log bigl log ldots log n ldots bigr s text mal leq 1 Bigr nbsp und praktisch konstant Theoretisch wachst diese Funktion jedoch unendlich weshalb sie in der O Notation nicht weggelassen werden kann Parallele Implementierung BearbeitenAufgrund von Datenabhangigkeiten zwischen den Iterationen lasst sich der Algorithmus von Kruskal grundsatzlich schwer parallelisieren Es ist jedoch moglich das Sortieren der Kanten zu Beginn parallel auszufuhren oder alternativ eine parallele Implementation eines Binaren Heaps zu verwenden um in jeder Iteration die Kante mit dem kleinsten Gewicht zu finden 4 Durch paralleles Sortieren was auf O n log n displaystyle O n cdot log n nbsp Prozessoren in O n displaystyle O n nbsp Zeit moglich ist 5 kann die Laufzeit des Algorithmus auch bei zuvor unsortierten Kanten auf O E log V displaystyle O E cdot log V nbsp reduziert werden Eine Variante des Algorithmus von Kruskal namens Filter Kruskal wurde von Osipov et al 3 beschrieben und eignet sich besser zur Parallelisierung Die grundlegende Idee besteht darin die Kanten in ahnlicher Weise wie bei Quicksort zu partitionieren und anschliessend Kanten auszusortieren welche Knoten im gleichen Teilbaum verbinden um somit die Kosten fur die Sortierung zu verringern Der Algorithmus wird im folgenden Pseudocode dargestellt FILTER KRUSKAL G 1 if G E lt KruskalThreshhold 2 return KRUSKAL G 3 pivot CHOOSE RANDOM G E 4 E lt displaystyle E lt nbsp E gt displaystyle E gt nbsp PARTITION G E pivot 5 A FILTER KRUSKAL E lt displaystyle E lt nbsp 6 E gt displaystyle E gt nbsp FILTER E gt displaystyle E gt nbsp 7 A A FILTER KRUSKAL E gt displaystyle E gt nbsp 8 return A PARTITION E pivot 1 E lt displaystyle E lt nbsp E gt displaystyle E gt nbsp 2 foreach u v in E 3 if weight u v lt pivot 4 E lt displaystyle E lt nbsp E lt displaystyle E lt nbsp u v 5 else 6 E gt displaystyle E gt nbsp E gt displaystyle E gt nbsp u v 5 return E lt displaystyle E lt nbsp E gt displaystyle E gt nbsp FILTER E 1 E f i l t e r e d displaystyle E filtered nbsp 2 foreach u v in E 3 if FIND SET u FIND SET v 4 E f i l t e r e d displaystyle E filtered nbsp E f i l t e r e d displaystyle E filtered nbsp u v 5 return E f i l t e r e d displaystyle E filtered nbsp Filter Kruskal eignet sich besser zur Parallelisierung da sowohl das Sortieren und Partitionieren als auch das Filtern einfach parallel ausgefuhrt werden kann indem die Kanten zwischen den Prozessoren aufgeteilt werden 3 Weitere Varianten fur eine Parallelisierung von Kruskals Algorithmus sind ebenfalls moglich So besteht zum Beispiel die Moglichkeit den sequentiellen Algorithmus auf mehreren Teilgraphen parallel auszufuhren um diese dann zusammenzufuhren bis schlussendlich nur noch der finale minimale Spannbaum ubrigbleibt 6 Eine simplere Form des Filter Kruskals bei welchem Hilfsthreads benutzt werden um Kanten die eindeutig nicht Teil des minimalen Spannbaums sind im Hintergrund zu entfernen kann ebenfalls verwendet werden 7 Sonstiges BearbeitenDer Algorithmus diente Kruskal ursprunglich als Hilfsmittel fur einen vereinfachten Beweis dass ein Graph mit paarweise verschiedenen Kantengewichten einen eindeutigen minimalen Spannbaum besitzt Weblinks Bearbeiten nbsp Wikibooks Algorithmus von Kruskal Implementierungen in der Algorithmensammlung nbsp Commons Kruskal s algorithm Sammlung von Bildern Videos und Audiodateien Interaktives Applet zum Lernen Ausprobieren und Demonstrieren des Algorithmus Ronny Harbich Vollstandiger Beweis zur Korrektheit des Algorithmus von Kruskal 2006 Anschauliche Darstellung des Algorithmus im Rahmen des Informatikjahres 2006Einzelnachweise Bearbeiten Joseph Kruskal On the shortest spanning subtree and the traveling salesman problem In Proceedings of the American Mathematical Society 7 1956 S 48 50 GeeksforGeeks Kruskal s Minimum Spanning Tree Algorithm a b c Vitaly Osipov Peter Sanders Johannes Singler The filter kruskal minimum spanning tree algorithm In Proceedings of the Eleventh Workshop on Algorithm Engineering and Experiments ALENEX Society for Industrial and Applied Mathematics 2009 S 52 61 Michael J Quinn Narsingh Deo Parallel graph algorithms In ACM Computing Surveys CSUR 16 3 1984 S 319 348 Ananth Grama Anshul Gupta George Karypis Vipin Kumar Introduction to Parallel Computing 2003 ISBN 978 0 201 64865 2 S 412 413 Vladimir Loncar Srdjan Skrbic Antun Balaz Parallelization of Minimum Spanning Tree Algorithms Using Distributed Memory Architectures In Transactions on Engineering Technologies 2014 S 543 554 Anastasios Katsigiannis Nikos Anastopoulos Nikas Konstantinos Nectarios Koziris An approach to parallelize kruskal s algorithm using helper threads In Parallel and Distributed Processing Symposium Workshops amp PhD Forum IPDPSW 2012 IEEE 26th International 2012 S 1601 1610 Abgerufen von https de wikipedia org w index php title Algorithmus von Kruskal amp oldid 235591971