了解何时对最小生成树使用 Prim 或 Kruskal

Understanding when to use Prim or Kruskal for Minimum Spanning Tree

我正在尝试将 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) 具有相似的时间复杂度。

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

当你有一个边比顶点多得多的非常密集的图时,Prim 的算法会更快。 Kruskal 在稀疏 graphs.Because 中表现更好 prim 的算法总是将一个新顶点连接到一个已经访问过的(旧)顶点,因此每个阶段都是一棵树。 Kruskal 允许 "new" 到 "new" 和 "old" 到 "old" 连接,因此这可能导致创建一个电路,算法必须每次都检查它们。所以 Kruskal 的复杂性比 Prim.So 更大,它取决于边数顶点比率。