Interaktives Graphentheorie-Lernen
Interaktives Graphentheorie-Lernen
Guest User
Using app without sign in
Paralleler Rechner für minimalen Spannbaum
Findet MST durch parallelen komponentenbasierten Ansatz
Wählen Sie einen Algorithmus und generieren Sie Schritte, um die Visualisierung zu beginnen
Der Algorithmus von Boruvka, 1926 veröffentlicht und der älteste MST-Algorithmus, findet einen minimalen Spannbaum, indem jede Komponente gleichzeitig ihre billigste ausgehende Kante wählt. Alle gewählten Kanten werden auf einmal hinzugefügt und verschmelzen Komponenten in parallelen Runden.
Jede Runde durchsucht alle Kanten und merkt sich für jede Komponente die günstigste sie verlassende Kante. Diese Kanten werden dem Wald hinzugefügt und halbieren die Zahl der Komponenten mindestens, sodass nur O(log V) Runden nötig sind. Jede Runde kostet O(E), insgesamt also O(E log V). Da jede Runde ein einfacher paralleler Durchlauf ist, bildet Boruvka die natürliche Basis für parallele und verteilte MST-Berechnung.
Der Algorithmus von Boruvka wurde ursprünglich zur Planung eines Stromnetzes in Mähren entwickelt und liegt heute parallelen MST-Implementierungen auf GPUs und Clustern zugrunde sowie Hybridverfahren, die Boruvka-Runden mit Prim- oder Kruskal-Phasen mischen. In Interviews dient er vor allem als Diskussionspunkt zum Entwurf paralleler Algorithmen.
Jede Komponente wählt ihre eigene billigste ausgehende Kante, und alle diese Wahlen werden auf einmal angewendet. Runden statt Einzelschritte, und genau das macht das Verfahren parallelisierbar.
Boruvka(graph):
makeSet(v) für jeden Knoten
mst = []
solange mehr als eine Komponente übrig ist:
billigste = {} // je Komponente
für jede Kante (u, v, w):
a = find(u); b = find(v)
wenn a == b: weiter // interne Kante
wenn w < billigste[a]: billigste[a] = (u,v,w)
wenn w < billigste[b]: billigste[b] = (u,v,w)
für jede Kante e in billigste.werte():
wenn find(e.u) != find(e.v): // evtl. schon vereint
union(e.u, e.v); mst.anhängen(e)Die Absicherung in der zweiten Schleife ist notwendig, nicht bloß vorsichtshalber. Zwei Komponenten wählen häufig dieselbe Kante, je einmal von jedem Ende, und sie zweimal anzuwenden fügte ein Duplikat hinzu. Für die Korrektheit müssen die Kantengewichte verschieden sein oder es braucht eine einheitliche Regel zur Auflösung von Gleichständen, etwa den Vergleich von Kantenindizes: ohne eine solche Regel können mehrere Komponenten jeweils eine andere Kante gleichen Gewichts wählen und gemeinsam einen Zyklus bilden.
Baue den minimalen Spannbaum auf demselben Graphen wie bei Prim und Kruskal, damit sich alle drei Verfahren unmittelbar 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 A-B, B-C und C-D mit Gesamtgewicht 2 + 1 + 4 = 7, also demselben Baum, den Prim und Kruskal lieferten. Boruvka erreichte ihn in einer Runde statt in drei aufeinanderfolgenden Schritten, und darum geht es: jede Runde halbiert die Zahl der Komponenten mindestens, da jede Komponente mit mindestens einer anderen verschmilzt, sodass nie mehr als O(log V) Runden nötig sind. Bei vier Knoten genügte hier bereits eine einzige.
Zeit: O(E log V) · Speicher: O(V + E)
Jede Runde durchsucht alle Kanten einmal mit O(E), um je Komponente die billigste ausgehende Kante zu finden. Während einer Runde verschmilzt jede Komponente mit mindestens einer anderen, die Komponentenzahl halbiert sich also mindestens, womit höchstens log zur Basis 2 von V Runden auftreten. Multipliziert ergibt das O(E log V) und entspricht damit Prim und Kruskal. Die auszeichnende Eigenschaft ist, dass innerhalb einer Runde jede Komponente unabhängig arbeitet, sodass sich der Durchlauf unmittelbar parallelisieren lässt; deshalb liegt Boruvka den MST-Implementierungen auf GPUs und in verteilten Systemen zugrunde, während Prim und Kruskal von Natur aus sequenziell sind. Hybride Verfahren führen einige Boruvka-Runden aus, um den Graphen zu verkleinern, und wechseln dann zu Prim.
Alle drei klassischen MST-Algorithmen kosten O(E log V). Der Unterschied ist struktureller Natur.
| Alternative | Vorzuziehen, wenn | Kosten |
|---|---|---|
| Prim-Algorithmus | Sequenzieller Code auf einem dichten Graphen. Ein Baum, eine Prioritätswarteschlange, einfach zu implementieren. | O(E log V) oder O(V^2) |
| Kruskal-Algorithmus | Dünne Graphen oder vorsortierte Kanten, und unzusammenhängende Graphen, bei denen ein Wald akzeptabel ist. | O(E log E) |
| Boruvka | Parallele oder verteilte Ausführung, da jede Runde ein unabhängiger Durchlauf je Komponente ist. | O(E log V) |
| Hybrid aus Boruvka und Prim | Sehr große Graphen. Einige Boruvka-Runden kontrahieren den Graphen, dann beendet Prim die Arbeit auf dem kleineren. | in der Praxis O(E log log V) |
Den ganzen Artikel lesen: Minimum Spanning Trees: Prim, Kruskal and Boruvka
Verwandte Algorithmen: Prim MST-Algorithmus, Kruskal MST-Algorithmus