Interaktives Graphentheorie-Lernen
Interaktives Graphentheorie-Lernen
Guest User
Using app without sign in
Rechner für minimalen Spannbaum
Findet minimalen Spannbaum durch Wachstum von einem einzelnen Knoten
Wählen Sie einen Algorithmus und generieren Sie Schritte, um die Visualisierung zu beginnen
Der Algorithmus von Prim baut einen minimalen Spannbaum (MST) eines gewichteten ungerichteten Graphen, also die Kantenmenge, die jeden Knoten mit möglichst geringem Gesamtgewicht verbindet. Er lässt einen einzigen Baum von einem beliebigen Startknoten aus wachsen und fügt stets die billigste Kante hinzu, die einen neuen Knoten erreicht.
Der Algorithmus hält eine Prioritätswarteschlange der Kanten, die vom Baum in den Rest des Graphen führen. In jedem Schritt entnimmt er die günstigste dieser Kanten, fügt ihren neuen Endpunkt zum Baum hinzu und trägt dessen Kanten in die Warteschlange ein. Die Schnitt-Eigenschaft von MSTs garantiert, dass jede gewählte Kante zu einem minimalen Spannbaum gehört. Mit einem Binärheap beträgt die Laufzeit O(E log V).
Der Algorithmus von Prim entwirft kostengünstige Netze: Stromnetze, Glasfaser- und Telekom-Layouts, Wasserleitungen und Chip-Verdrahtung. Er unterstützt auch Clustering und Bildsegmentierung. In Interviews wird er oft mit dem Algorithmus von Kruskal gepaart, um das Verständnis von Greedy-Korrektheit zu prüfen.
Prim lässt einen einzigen Baum von einem beliebigen Startknoten nach außen wachsen. In jedem Schritt nimmt er die billigste Kante, die genau einen Endpunkt bereits im Baum hat.
Prim(graph, start):
imBaum = {start}
pq = Prioritätswarteschlange der von start ausgehenden Kanten
mst = []
solange imBaum nicht alle Knoten enthält:
(u, v, w) = pq.entnimmMinimum()
wenn v in imBaum: weiter // veraltet
mst.anhängen((u, v, w))
imBaum.hinzufügen(v)
für jede Kante (v, x, w2):
wenn x nicht in imBaum: pq.einfügen((v, x, w2))Die Korrektheit beruht auf der Schnitteigenschaft: Für jede Aufteilung der Knoten in zwei Seiten gehört die billigste diesen Schnitt kreuzende Kante zu einem minimalen Spannbaum. Prim wendet sie mit dem Schnitt "bereits im Baum" gegen "noch nicht" an, und deshalb ist das Nehmen der billigsten kreuzenden Kante stets sicher und Backtracking nie nötig.
Lasse einen minimalen Spannbaum von A aus auf einem kleinen gewichteten Graphen wachsen, in dem die gierige Wahl eine scheinbar günstigere direkte Kante bewusst verwirft.
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. Beachte, dass er genau drei Kanten hat, eine weniger als die vier Knoten, wie es bei jedem Spannbaum sein muss. Beachte auch, dass der Baum hier ein Pfad ist, was daran erinnert, dass ein minimaler Spannbaum kein Kürzeste-Wege-Baum ist: die beiden Probleme optimieren Verschiedenes.
Zeit: O(E log V) · Speicher: O(V + E)
Mit einem Binärheap kann jede Kante einmal eingefügt und einmal entnommen werden, jeweils O(log E), und da E höchstens V hoch 2 ist, liegt log E innerhalb eines konstanten Faktors von log V, was O(E log V) ergibt. Jeder Knoten wird genau einmal in den Baum aufgenommen. Ein Fibonacci-Heap mit Verringern des Schlüssels statt trägem Einfügen verbessert die Schranke auf O(E + V log V), asymptotisch besser auf dichten Graphen, wenn auch selten die Konstanten wert. Auf einem sehr dichten Graphen gewinnt die einfachste Variante: ein Feld mit der billigsten bekannten Kante zu jedem Außenknoten, das jede Runde durchsucht wird, mit O(V hoch 2), was O(E log V) schlägt, sobald E sich V hoch 2 nähert.
Prim und Kruskal liefern beide einen minimalen Spannbaum. Welcher passt, hängt von der Dichte ab und davon, wie die Kanten eintreffen.
| Alternative | Vorzuziehen, wenn | Kosten |
|---|---|---|
| Kruskal-Algorithmus | Dünne Graphen oder bereits nach Gewicht sortierte Kanten. Lässt einen Wald statt eines Baums wachsen, mit Union-Find. | O(E log E) |
| Boruvka-Algorithmus | Du willst Parallelität. Jede Komponente wählt gleichzeitig ihre billigste ausgehende Kante. | O(E log V) |
| Prim mit Felddurchsuchung | Dichte Graphen, in denen E sich V hoch 2 nähert. Vermeidet den Heap-Aufwand vollständig. | O(V^2) |
| Dijkstra-Algorithmus | Du willst eigentlich kürzeste Wege von einer Quelle, keine spannende Struktur minimalen Gewichts. Ähnliche Form, anderes Ziel. | O((V + E) log V) |
Den ganzen Artikel lesen: Minimum Spanning Trees: Prim, Kruskal and Boruvka
Verwandte Algorithmen: Kruskal MST-Algorithmus, Borůvka-Algorithmus, Dijkstra-Algorithmus