Menu
Coddy logo textTech

Prim-Algorithmus

Zuletzt aktualisiert

Der Prim-Algorithmus baut einen minimalen Spannbaum (MST) - die günstigste Menge an Kanten, die alle Knoten ohne Zyklen verbindet - indem er einen einzigen Baum von einem Startknoten aus nach außen wachsen lässt. In jedem Schritt betrachtet er alle Kanten, die vom Baum zu einem Knoten außerhalb kreuzen, und fügt die günstigste hinzu. Drücken Sie oben auf Wiedergabe, um zu sehen, wie der Baum wächst und dabei stets die Kante mit dem geringsten Gewicht nimmt, die einen neuen Knoten erreicht.

Da er stets die minimale kreuzende Kante wählt, ist jede Hinzufügung sicher (garantiert Teil eines MST). Mit einer auf einem binären Heap basierenden Prioritätswarteschlange, die nach der günstigsten Kante zu jedem äußeren Knoten indiziert ist, läuft Prim in O(E log V). Er steht im Kontrast zu Kruskal, der alle Kanten global sortiert, anstatt einen einzigen zusammenhängenden Baum wachsen zu lassen.

Zeit- und Speicherkomplexität

ImplementierungKomplexitätHinweise
Binärer HeapO(E log V)Prioritätswarteschlange der kreuzenden Kanten
AdjazenzmatrixO(V²)Einfacher; gut für dichte Graphen
SpeicherO(V + E)Baumzugehörigkeit + Prioritätswarteschlange
Am besten fürDichte GraphenWächst von einem einzigen Startknoten

Schritt für Schritt

SchrittWas passiert
1Starten Sie den Baum mit einem beliebigen einzelnen Knoten.
2Betrachten Sie alle Kanten, die vom Baum zu einem Knoten außerhalb kreuzen.
3Wählen Sie die kreuzende Kante mit dem kleinsten Gewicht.
4Fügen Sie diese Kante und ihren neuen Knoten zum Baum hinzu.
5Wiederholen Sie, bis alle Knoten im Baum sind.

Durchgerechnetes Beispiel

Aufbau des MST eines Graphen mit 4 Knoten und den Kanten A-B=1, A-C=3, B-C=2, B-D=4, C-D=5, ausgehend von A:

SchrittBaumKreuzende KantenGewählte Kante
1{A}A-B=1, A-C=3A-B (Gewicht 1)
2{A, B}A-C=3, B-C=2, B-D=4B-C (Gewicht 2)
3{A, B, C}B-D=4, C-D=5B-D (Gewicht 4)
4{A, B, C, D}keine - alle Knoten im Baumfertig: MST-Gewicht 1+2+4 = 7

Wann man den Prim-Algorithmus verwenden sollte

Verwenden, wennVermeiden, wenn
Sie einen minimalen Spannbaum eines zusammenhängenden, ungerichteten, gewichteten Graphen benötigen.Der Graph gerichtet ist oder Sie kürzeste Wege benötigen - verwenden Sie stattdessen Dijkstra oder Bellman-Ford.
Der Graph dicht ist (E nahe ); die O(V²)-Matrixform ist einfach und schnell.Der Graph dünn besetzt ist und die Kanten bereits sortiert oder leicht zu sortieren sind - Kruskal ist oft einfacher.
Sie möchten, dass der Baum von einer Region nach außen wächst (z. B. inkrementelles Netzwerklayout).Der Graph nicht zusammenhängend ist - Prim überspannt nur eine Komponente; Sie benötigen einen minimalen Spannwald.
Sie bereits eine Adjazenzstruktur und eine Prioritätswarteschlange verfügbar haben.Sie Zyklen über eine globale Kantenmenge erkennen müssen - Union-Find (Kruskal) passt besser zu dieser Form.

Prim's Algorithm-Code

Eine saubere, lauffähige Prim's Algorithm-Implementierung in Python, JavaScript, Java, C++, C. Wähle eine Sprache, kopiere den Code oder öffne ihn vorgeladen im Coddy-Playground.

Prim's Algorithm-Code in Python

Python
1import heapq2
3
4def prim(graph, start):5    visited = {start}6    heap = [(w, start, v) for v, w in graph[start]]7    heapq.heapify(heap)8    mst, total = [], 09    while heap and len(visited) < len(graph):10        w, u, v = heapq.heappop(heap)11        if v in visited:12            continue13        visited.add(v)14        mst.append((u, v, w))15        total += w16        # Offer the new node's edges to the frontier17        for neighbor, weight in graph[v]:18            if neighbor not in visited:19                heapq.heappush(heap, (weight, v, neighbor))20    return mst, total21
22
23graph = {24    "A": [("B", 4), ("C", 1)],25    "B": [("A", 4), ("C", 3), ("D", 2)],26    "C": [("A", 1), ("B", 3), ("D", 5)],27    "D": [("B", 2), ("C", 5), ("E", 7)],28    "E": [("D", 7)],29}30
31mst, total = prim(graph, "A")32for u, v, w in mst:33    print(f"{u} - {v} (weight {w})")34print("Total MST weight:", total)
Führe diesen Code im Python-Playground aus

FAQ zum Prim-Algorithmus

Wie ist die Zeitkomplexität des Prim-Algorithmus?
Mit einer auf einem binären Heap basierenden Prioritätswarteschlange läuft Prim in O(E log V). Eine einfachere Adjazenzmatrix-Version, die in jedem Schritt nach der minimalen kreuzenden Kante sucht, ist O(V²), was bei dichten Graphen schneller sein kann. Beide verwenden O(V + E) Speicher.
Was ist der Unterschied zwischen dem Prim- und dem Kruskal-Algorithmus?
Beide finden einen minimalen Spannbaum gierig. Prim lässt einen einzigen zusammenhängenden Baum von einem Startknoten aus wachsen und fügt wiederholt die günstigste Kante hinzu, die den Baum verlässt (mit einer Prioritätswarteschlange). Kruskal betrachtet alle nach Gewicht sortierten Kanten und fügt die günstigste hinzu, die keinen Zyklus bildet (mit Union-Find). Prim wird oft bei dichten Graphen bevorzugt, Kruskal bei dünn besetzten.
Findet der Prim-Algorithmus immer den optimalen MST?
Ja. In jedem Schritt ist die günstigste Kante, die den aktuellen Baum kreuzt, sicher hinzuzufügen - sie gehört zu einem minimalen Spannbaum (die Schnitteigenschaft). Das wiederholte Hinzufügen sicherer Kanten ergibt einen echten minimalen Spannbaum, sofern der Graph zusammenhängend ist.
Wann sollte ich den Prim-Algorithmus statt Kruskal verwenden?
Greifen Sie zu Prim, wenn der Graph dicht ist, da seine O(V²)-Matrixform das Sortieren aller E Kanten vermeidet und einen einzigen Baum von einem Startknoten aus wachsen lässt. Kruskal glänzt bei dünn besetzten Graphen, bei denen das Sortieren der Kantenliste günstig ist und Union-Find die Zyklusprüfungen schnell hält. Beide erzeugen einen korrekten MST, daher hängt die Wahl hauptsächlich von der Kantendichte und den bereits vorhandenen Datenstrukturen ab.
Beeinflusst der Startknoten den resultierenden MST?
Nein - das Gesamtgewicht des MST ist unabhängig davon, von welchem Knoten Sie starten, gleich, da das Gewicht des minimalen Spannbaums eines zusammenhängenden Graphen eindeutig ist. Die konkreten Kanten können sich nur unterscheiden, wenn mehrere Kanten dasselbe Gewicht haben und mehrere MSTs existieren. Andernfalls erreicht Prim unabhängig vom Startknoten genau denselben Baum.
Kann der Prim-Algorithmus mit nicht zusammenhängenden Graphen umgehen?
Nicht direkt. Prim lässt einen einzigen Baum wachsen und überspannt daher nur die zusammenhängende Komponente, die den Startknoten enthält, und lässt den Rest unberührt. Um jede Komponente abzudecken, würden Sie Prim wiederholt von einem unbesuchten Knoten aus ausführen und so einen minimalen Spannwald statt eines einzigen Baums erzeugen.
Coddy programming languages illustration

Meistere Algorithmen mit Coddy

LOS GEHT'S