User:Kmmsfg/sandbox

Parallele Implementierung
Aufgrund von Datenabhängigkeiten zwischen den Iterationen lässt sich der Algorithmus von Kruskal grundsätzlich schwer parallelisieren. Es ist jedoch möglich, das Sortieren der Kanten zu Beginn parallel auszuführen oder alternativ eine parallele Implementation eines Binären Heaps zu verwenden um in jeder Iteration die Kante mit dem kleinsten Gewicht zu finden. Durch paralleles Sortieren, was auf $$O(n \cdot \log n)$$ Prozessoren in $$O(n)$$ Zeit möglich ist, kann die Laufzeit des Algorithmus auch bei zuvor unsortierten Kanten auf $$O(|E| \cdot \log^*|V|)$$ reduziert werden.

Eine Variante des Algorithmus von Kruskal namens Filter-Kruskal wurde von Osipov et al. beschrieben und eignet sich besser zur Parallelisierung. Die grundlegende Idee besteht darin, die Kanten in ähnlicher Weise wie bei Quicksort zu partitionieren und anschließend Kanten auszusortieren, welche Knoten im gleichen Teilbaum verbinden, um somit die Kosten für die Sortierung zu verringern. Der Algorithmus wird im folgenden Pseudocode dargestellt.

FILTER-KRUSKAL(G): 1 if |G.E| < KruskalThreshhold: 2   return KRUSKAL(G) 3 pivot = CHOOSE-RANDOM(G.E) 4 $$E_{<=}$$, $$E_{>}$$ = PARTITION(G.E, pivot) 5 A = FILTER-KRUSKAL($$E_{<=}$$) 6 $$E_{>}$$ = FILTER($$E_{>}$$) 7 A = A ∪ FILTER-KRUSKAL($$E_{>}$$) 8 return A PARTITION(E, pivot): 1 $$E_{<=}$$ = ∅, $$E_{>}$$ = ∅ 2 foreach (u, v) in E: 3   if weight(u, v) <= pivot: 4      $$E_{<=}$$ = $$E_{<=}$$ ∪ {(u, v)} 5   else 6      $$E_{>}$$ = $$E_{>}$$ ∪ {(u, v)} 5 return $$E_{<=}$$, $$E_{>}$$ FILTER(E): 1 $$E_{filtered}$$ = ∅ 2 foreach (u, v) in E: 3   if FIND-SET(u) ≠ FIND-SET(v): 4      $$E_{filtered}$$ = $$E_{filtered}$$ ∪ {(u, v)} 5 return $$E_{filtered}$$

Filter-Kruskal eignet sich besser zur Parallelisierung da sowohl das Sortieren und Partitionieren, als auch das Filtern einfach parallel ausgeführt werden kann, indem die Kanten zwischen den Prozessoren aufgeteilt werden.

Weitere Varianten für eine Parallelisierung von Kruskals Algorithmus sind ebenfalls möglich. So besteht zum Beispiel die Möglichkeit, den sequentiellen Algorithmus auf mehreren Teilgraphen parallel auszuführen, um diese dann zusammenzuführen bis schlussendlich nur noch der finale minimale Spannbaum übrigbleibt. 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.