Wann sollte ich Kruskal im Gegensatz zu Prim verwenden (und umgekehrt)?


192

Ich habe mich gefragt, wann man Prims Algorithmus verwenden sollte und wann Kruskals , um den minimalen Spannbaum zu finden. Beide haben eine einfache Logik, dieselben schlimmsten Fälle, und der einzige Unterschied besteht in der Implementierung, die möglicherweise etwas unterschiedliche Datenstrukturen umfasst. Was ist der entscheidende Faktor?

Antworten:


199

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

Bei einem Graphen mit V Eckpunkten E Kanten wird der Kruskal-Algorithmus in der Zeit O (E log V) und der Prim-Algorithmus in der amortisierten Zeit O (E + V log V) ausgeführt , wenn Sie einen Fibonacci-Heap verwenden .

Der Algorithmus von Prim ist im Limit deutlich schneller, wenn Sie ein wirklich dichtes Diagramm mit viel mehr Kanten als Scheitelpunkten haben. Kruskal bietet in typischen Situationen eine bessere Leistung (spärliche Diagramme), da es einfachere Datenstrukturen verwendet.


8
Ich würde "typische Situationen" anstelle von "Durchschnitt" sagen. Ich denke, es ist ein dunkler Begriff, zum Beispiel, was ist die "Durchschnittsgröße" einer Hash-Tabelle? keine Ahnung.
Yairchu

2
@ SplittingField: Ich glaube, Sie vergleichen Äpfel und Orangen. Die amortisierte Analyse ist ein einfacher Weg, um eine Messung der Funktion zu erhalten (sozusagen) - ob es sich um den schlimmsten oder einen durchschnittlichen Fall handelt, hängt davon ab, was Sie beweisen. Tatsächlich (wie ich jetzt nachschaue) verwendet der Wiki-Artikel eine Sprache, die impliziert, dass sie nur für Worst-Case-Analysen verwendet wird. Die Verwendung einer solchen Analyse bedeutet nun, dass Sie keine so starken Versprechungen über die Kosten einer bestimmten Operation machen können, aber wenn der Algorithmus fertig ist, wird dies tatsächlich durch O (E + VlogV) geschehen, sogar im schlimmsten Fall.
gegen

10
Das hört sich theoretisch gut an, aber ich wette, nur wenige Leute können einen Fibonacci-Haufen implementieren
Alexandru

2
@tgamblin, im schlimmsten Fall kann es C (V, 2) Kanten geben. Reduziert sich die Zeitkomplexität von Prims Algorithmus nicht auf O (V ^ 2 + VlogV), dh O (V ^ 2) im Falle eines Fibonacci-Haufens?
Grüner Kobold

7
Es gibt noch einen weiteren wichtigen Faktor: Die Ausgabe von Prims ist nur dann eine MST, wenn der Graph verbunden ist (die Ausgabe scheint mir ansonsten nicht von Nutzen zu sein), aber die Ausgabe von Kruskal ist die Minimum Spanning-Gesamtstruktur (mit einiger Verwendung).
Andrei I

100

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

Der Kruskal-Algorithmus wird eine Lösung von der billigsten Kante aus hinzufügen, indem die nächstbilligste Kante hinzugefügt wird, vorausgesetzt, er erzeugt keinen Zyklus.

Der Prim-Algorithmus 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 ihm verbunden ist.

Hier ist ein interessantes Blatt zu diesem Thema beigefügt.Geben Sie hier die Bildbeschreibung einGeben Sie hier die Bildbeschreibung ein

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 mit einem Fibonacci-Heap schwieriger, hauptsächlich weil Sie eine Buchhaltungstabelle führen müssen, um die bidirektionale Verbindung zwischen Graphknoten und Heapknoten aufzuzeichnen. Bei einem Union Find ist das Gegenteil der Fall, die Struktur ist einfach und kann sogar fast ohne zusätzliche Kosten direkt das erste produzieren.


2
Nitpick: Die letzte Folie sollte jeweils "Wiederholen, bis Sie einen Spannbaum haben" lauten. erst MST, was eine rekursive Aufgabe ist - woher weiß ich, dass sie minimal ist - deshalb folge ich zunächst Prims / Kruskals!
OJFord

@OllieFord Ich habe diesen Thread gefunden, weil ich nach einer einfachen Illustration der Prim- und Kruskal-Algorithmen gesucht habe. Die Algorithmen garantieren, dass Sie einen Baum finden und dieser Baum ein MST ist. Und Sie wissen, dass Sie einen Baum gefunden haben, wenn Sie genau V-1 Kanten haben.
mikedu95

@ mikedu95 Du hast Recht und machst den gleichen Punkt wie mein früherer Kommentar aus einem anderen Blickwinkel.
OJFord

Aber ist es nicht eine Voraussetzung, dass Sie nur mit einem einzigen Gewicht zwischen den Eckpunkten wählen müssen? Sie können das Gewicht 2 nicht mehr als einmal aus der obigen Grafik auswählen. Sie müssen das nächste Gewicht wählen, z.
B

30

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


23

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.


19

Der schlimmste Fall der Kruskal- Zeitkomplexität ist O (E log E) , weil wir die Kanten sortieren müssen. Der schlimmste Fall der Komplexität der Prim- Zeit 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, eine kleine Anzahl von Kanten, 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, dh die Anzahl der Kanten hoch ist, wie E = O (V²).


Es scheint mir, dass Prim in Bezug auf die Geschwindigkeit niemals schlechter ist als Kruskal. Da E mindestens V-1 sein sollte, gibt es einen Spannbaum. Ich denke, der Grund, warum wir Kruskal für ein spärliches Diagramm bevorzugen, ist, dass seine Datenstruktur sehr einfach ist.
Yu Gu

16

Wenn wir den Algorithmus im mittleren Prim stoppen, generiert der Algorithmus immer einen verbundenen Baum, aber kruskal kann andererseits einen getrennten Baum oder Wald ergeben


5

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

Betrachten Sie n Eckpunkte und Sie haben ein vollständiges Diagramm. Um ak-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 k-Cluster des Diagramms mit Maximum Abstand.


3

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


2

Prims sind besser für dichtere Graphen, und dabei müssen wir auch den Zyklen durch Hinzufügen einer Kante nicht viel Aufmerksamkeit schenken, da wir uns hauptsächlich mit Knoten befassen. Prims ist bei komplexen Graphen schneller als Kruskals.


2

Im Kruskal-Algorithmus haben wir die Anzahl der Kanten und die Anzahl der Eckpunkte in einem bestimmten Diagramm, aber an jeder Kante haben wir einen Wert oder ein Gewicht, für das wir ein neues Diagramm erstellen können, das nicht zyklisch sein oder von keiner Seite schließen darf. Zum Beispiel

Grafik wie diese _____________ | | | | | | | __________ | | Geben Sie jedem Scheitelpunkt a, b, c, d, e, f einen Namen.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.