Vor ungefähr einem Jahr dachten ein Freund und ich über eine Möglichkeit nach, den Kruskal-Algorithmus für dichte Graphen besser als in der üblichen Grenze ( zu implementieren (ohne die Annahme von vorsortierten Kanten). Insbesondere erreichen wir in allen Fällen , ähnlich wie bei Prims, wenn sie unter Verwendung von Adjazenzmatrizen implementiert werden.Θ ( n 2 )
Ich habe ein bisschen über den Algorithmus in meinem Blog geschrieben , einschließlich C ++ - Code und Benchmarks, aber hier ist die allgemeine Idee:
Pflegen Sie für jede angeschlossene Komponente einen repräsentativen Knoten. Anfangs repräsentieren sich alle Knoten.
Pflegen Sie einen Vektor
dist[i]
so, dass für jede Komponentei
die leichteste Kante auftritt, die die Komponente kreuzti
.Wenn Sie die leichteste Kante finden, die Partitionen überquert, müssen Sie einfach in linearer Zeit
i
das Gewicht von minimierendist[i]
.Wenn Sie zwei Komponenten und , ändern Sie die Adjazenzmatrix so, dass nun für alle Komponenten und markieren i als nicht mehr repräsentativ für seine angeschlossene Komponente (nur j bleibt jetzt übrig).
Das Zusammenziehen der leichtesten Kante und das Auffinden dieser Kante kann somit beide in linearer Zeit erfolgen. Wir machen dies mal, um den MST zu finden. Ein wenig Buchhaltung ist erforderlich, um tatsächlich herauszufinden, welche Kante wir dem MST hinzufügen möchten, erhöht jedoch nicht die Komplexität. Die Laufzeit ist also . Die Implementierung ist nur ein paar für Schleifen.
Ist diese Version von Kruskal in der Literatur bekannt?
quelle