Answers:
当您的图形具有很多边时,请使用Prim算法。
对于具有V个顶点E边的图形,如果使用Fibonacci堆,则Kruskal算法的运行时间为O(E log V),而Prim算法的运行时间为O(E + V log V)摊销时间。
当您拥有一个非常密集的图形且其边缘比顶点多得多时,Prim的算法在极限上的速度明显更快。Kruskal在典型情况下(稀疏图)表现更好,因为它使用了更简单的数据结构。
我在网上找到了一个很好的线程,该线程以非常简单的方式解释了差异:http : //www.thestudentroom.co.uk/showthread.php?t=232168。
如果不创建循环,Kruskal的算法将通过添加下一个最便宜的边,从最便宜的边开始发展解决方案。
Prim的算法将通过添加下一个最便宜的顶点(该顶点当前不在解决方案中,但通过最便宜的边缘与其连接)来从随机顶点中生成解决方案。
附件是关于该主题的有趣的表格。
如果您以最佳形式同时实现Kruskal和Prim:分别使用并集查找和finbonacci堆,那么您将注意到与Prim相比,Kruskal易于实现。
对于Fibonacci堆,Prim较难,主要是因为您必须维护一个簿记表才能记录图节点与堆节点之间的双向链接。与Union Find相反,结构简单,甚至可以直接生产mst,几乎不需要任何额外费用。
V-1
边的时候已经找到了一棵树。
如果可以按线性时间对边缘进行排序或已经对边缘进行排序,则Kruskal可以具有更好的性能。
如果顶点的边数很多,则Prim会更好。
Kruskal时间复杂度最坏的情况是O(E log E),这是因为我们需要对边缘进行排序。 原始时间复杂度最坏的情况是带有优先级队列的O(E log V)甚至更好,具有Fibonacci Heap的O(E + V log V)。当图稀疏时,即边缘已经被排序或者可以在线性时间内对其进行排序时,我们应使用Kruskal,即边缘的数量少,例如E = O(V)。当图是密集的,即边数很高,例如E = O(V²)时,我们应该使用Prim。