web-dev-qa-db-ger.com

Wann sollte ich Kruskal anstelle von Prim verwenden (und umgekehrt)?

Ich fragte mich, wann man Prims Algorithmus und wann Kruskals verwenden sollte, um den minimalen Spannbaum zu finden? Beide haben eine einfache Logik, dieselben Worst-Cases, und der einzige Unterschied ist die Implementierung, die möglicherweise etwas andere Datenstrukturen umfasst. Also, was ist der entscheidende Faktor?

176
ebe

Verwenden Sie den Prim-Algorithmus, wenn Sie ein Diagramm mit vielen Kanten haben.

Für ein Diagramm mit [~ # ~] v [~ # ~] Eckpunkten [~ # ~] e [ ~ # ~] Kanten, Kruskal's Algorithmus läuft in O (E log V) Zeit und Prim's Algorithmus kann laufen in O (E + V log V) Amortisierte Zeit, wenn Sie einen Fibonacci-Haufen verwenden.

Der Algorithmus von Prim ist im Grenzfall bedeutend schneller, wenn Sie ein wirklich dichtes Diagramm mit viel mehr Kanten als Scheitelpunkten haben. Kruskal schneidet in typischen Situationen (spärliche Diagramme) besser ab, weil es einfachere Datenstrukturen verwendet.

190
Todd Gamblin

Ich habe einen sehr netten Thread im Netz gefunden, der den Unterschied auf sehr einfache Weise erklärt: http://www.thestudentroom.co.uk/showthread.php?t=232168 .

Der Kruskal-Algorithmus vergrößert eine Lösung aus der billigsten Kante, indem er die nächstbilligste Kante hinzufügt, vorausgesetzt, er erstellt keinen Zyklus.

Der Algorithmus von Prim vergrößert eine Lösung aus einem zufälligen Scheitelpunkt, indem er den nächstbilligsten Scheitelpunkt hinzufügt, den Scheitelpunkt, der sich derzeit nicht in der Lösung befindet, aber durch die billigste Kante mit dieser verbunden ist.

Im Anhang finden Sie ein interessantes Blatt zu diesem Thema.enter image description hereenter image description here

Wenn Sie sowohl Kruskal als auch Prim in ihrer optimalen Form implementieren: mit einem Union-Find- bzw. einem Finbonacci-Heap, werden Sie feststellen, wie einfach Kruskal im Vergleich zu Prim zu implementieren ist.

Prim ist bei einem Fibonacci-Heap schwieriger, vor allem, weil Sie eine Buchführungstabelle führen müssen, um die bidirektionale Verbindung zwischen Diagrammknoten und Heapknoten aufzuzeichnen. Bei einem Union Find ist es umgekehrt, die Struktur ist einfach und kann fast ohne zusätzliche Kosten direkt hergestellt werden.

94
Snicolas

Ich weiß, dass Sie nicht danach gefragt haben, aber wenn Sie mehr Verarbeitungseinheiten haben, sollten Sie immer Borůvkas Algorithmus in Betracht ziehen, da dies leicht parallelisiert werden kann - daher hat es einen Leistungsvorteil gegenüber Kruskal und Jarník- Prim-Algorithmus.

28
malejpavouk

Kruskal kann eine bessere Leistung erzielen, wenn die Kanten in linearer Zeit sortiert werden können oder bereits sortiert sind.

Prim ist besser, wenn die Anzahl der Kanten zu Eckpunkten hoch ist.

22

Wenn wir den Algorithmus in Middle Prim stoppen, erzeugt der Algorithmus immer einen verbundenen Baum, aber kruskal kann andererseits einen getrennten Baum oder Wald ergeben

16
Prakhar

Kruskal Zeitkomplexität Der schlimmste Fall ist O (E log E), weil wir die Kanten sortieren müssen. Prim Zeitkomplexität Der schlimmste Fall ist O (E log V) mit Prioritätswarteschlange oder noch besser O (E + V log V) mit Fibonacci Heap. Wir sollten Kruskal verwenden, wenn der Graph dünn ist, d. H. Wenn die Anzahl der Kanten gering ist, wie E = O (V), wenn die Kanten bereits sortiert sind oder wenn wir sie in linearer Zeit sortieren können. Wir sollten Prim verwenden, wenn der Graph dicht ist, d. H. Die Anzahl der Kanten hoch ist, wie E = O (V²).

12

Eine wichtige Anwendung des Kruskal-Algorithmus ist Single Link Clustering.

Betrachten Sie n Ecken und Sie haben ein komplettes Diagramm. Um ein Cluster dieser n Punkte zu erhalten. Führen Sie den Kruskal-Algorithmus über die ersten n- (k-1) Kanten des sortierten Satzes von Kanten aus. Sie erhalten ein k-Cluster des Diagramms mit Maximum Abstand.

5
Jaskaran

Die beste Zeit für Kruskal's ist O (E logV). Für Prims, die Fib-Heaps verwenden, können wir O (E + V lgV) erhalten. Daher ist Prim auf einem dichten Graphen viel besser.

3
Leon Stenneth

Im Kruskal-Algorithmus haben wir die Anzahl der Kanten und die Anzahl der Eckpunkte in einem gegebenen Graphen, aber für jede Kante haben wir einen Wert oder eine Gewichtung, für die wir einen neuen Graphen erstellen können, der nicht zyklisch sein darf oder von keiner Seite her geschlossen werden darf. Zum Beispiel

grafik wie folgt _____________ | | | | | | | __________ | | Geben Sie jedem Knoten a, b, c, d, e, f einen Namen.

2
Abhishek

Prims sind besser für dichtere Graphen, und in diesem Fall müssen wir auch den Zyklen durch Hinzufügen einer Kante nicht viel Aufmerksamkeit schenken, da es sich hauptsächlich um Knoten handelt. Prims sind bei komplexen Graphen schneller als Kruskals.

2
Sakshi