我正在尝试将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)
具有相似的时间复杂度。
答案 0 :(得分:2)
由于每种算法的性质,对于边数适中的图形,应使用Kruskal算法。 Prim的算法在包含许多边的图形中运行更快,因为它仅比较每个循环中有限数量的边,而Kruskal首先对列表中的所有边进行排序,然后再次遍历它们以检查边是否为最小跨度的一部分树(MST)与否。因此,就您的问题而言,尽管两种算法的运行时间相似,但是在您决定算法之间时,图形中的边数应是主要组成部分。与顶点相比,边缘更多,请使用Prim's,否则,请使用Kruskal。
答案 1 :(得分:0)
当您拥有一个非常密集的图形且其边缘比顶点多得多时,Prim的算法会更快。 Kruskal在稀疏图中表现更好,因为prim的算法总是将新顶点连接到已经访问过的(旧)顶点上,因此每个阶段都是一棵树。 Kruskal允许“新”到“新”以及“旧”到“旧”建立连接,因此这可能导致创建电路,并且算法每次都必须对其进行检查。因此Kruskal的复杂度要比Prim大。这取决于边数顶点的比率。