了解何时将Prim或Kruskal用于最小生成树

时间:2018-11-26 05:56:51

标签: time-complexity graph-theory minimum-spanning-tree kruskals-algorithm prims-algorithm

我正在尝试将Prim或Kruskal的算法应用于某些情况。我知道在图密集时使用Prim(例如:将优先级队列作为无序数组的邻接矩阵用于E = O(V^2)的密集树。在图稀疏时使用Kruskal(例如:作为邻接列表)快速排序,其中E = O(V)。我不确定是介于两者之间。例如,一个边数适中的图形,例如

E = O(V log V)

这将是Prim还是Kruskal?我认为可能是两者之一,因为Prim O(E log V)和Kruskal O(E log E)具有相似的时间复杂度。

2 个答案:

答案 0 :(得分:2)

由于每种算法的性质,对于边数适中的图形,应使用Kruskal算法。 Prim的算法在包含许多边的图形中运行更快,因为它仅比较每个循环中有限数量的边,而Kruskal首先对列表中的所有边进行排序,然后再次遍历它们以检查边是否为最小跨度的一部分树(MST)与否。因此,就您的问题而言,尽管两种算法的运行时间相似,但是在您决定算法之间时,图形中的边数应是主要组成部分。与顶点相比,边缘更多,请使用Prim's,否则,请使用Kruskal。

答案 1 :(得分:0)

当您拥有一个非常密集的图形且其边缘比顶点多得多时,Prim的算法会更快。 Kruskal在稀疏图中表现更好,因为prim的算法总是将新顶点连接到已经访问过的(旧)顶点上,因此每个阶段都是一棵树。 Kruskal允许“新”到“新”以及“旧”到“旧”建立连接,因此这可能导致创建电路,并且算法每次都必须对其进行检查。因此Kruskal的复杂度要比Prim大。这取决于边数顶点的比率。