为什么Kruskal和Prim MST算法对稀疏和密集图有不同的运行时间?

时间:2010-01-06 08:45:55

标签: algorithm graph kruskals-algorithm prims-algorithm

我试图理解为什么Prim和Kruskal在稀疏和密集的图形方面有不同的时间复杂性。在使用几个小程序来演示每个小程序如何工作之后,我仍然对图的密度如何影响算法感到困惑。我希望有人能给我一个正确方向的推动。

3 个答案:

答案 0 :(得分:4)

维基百科根据 E ,边数和 V (顶点数)给出了这些算法的复杂性,这是一个很好的做法,因为它让你做了这种分析。

Kruskal的算法是O( E log V )。 Prim的复杂性取决于您使用的数据结构。使用邻接矩阵,它是O( V 2 )。

现在,如果你为 E 插入 V 2 ,那么你会看到你在评论中引用的密集图的复杂性,以及如果您为 E 插入 V ,那么你会得到稀疏的。

为什么我们为密集图插入 V 2 ?即使在最密集的图形中,也不能有 V 2 边缘,所以很明显 E = O( V 2 )。

为什么我们为稀疏图插入 V ?好吧,你必须通过稀疏来定义你的意思,但是如果每个顶点的边数不超过五个,我们称之为稀疏的图形。我会说这些图很稀疏:一旦你进入数千个顶点,邻接矩阵将主要是空的空间。这意味着对于稀疏图, E ≤5 V ,因此 E = O( V )。< / p>

答案 1 :(得分:1)

这些顶点的数量是否有任何不同的复杂性?

对于稀疏图,通常有一个略微粗略的论证,即E = O(V)的边数,其中V是顶点数,对于密集图E = O(V ^ 2)。因为两个算法都可能具有依赖于E的复杂性,当你将它转换为依赖于V的复杂性时,你会得到不同的复杂性,这取决于密集或稀疏的图形

编辑:

不同的数据结构也会影响复杂性当然维基百科在this上有分解

答案 2 :(得分:0)

Cormen等人的算法确实给出了分析,在两种情况下都使用图的稀疏表示。使用Kruskal的算法(链接顶点在不相交的组件中,直到所有东西都连接起来),第一步是对图形的边缘进行排序,这需要时间O(E lg E),并且它们只是确定没有其他时间比这更长。使用Prim的算法(通过添加最近的顶点来扩展当前树),他们使用Fibonacci堆来存储待定顶点的队列并获得O(E + V lgV),因为Fibonacci树减少了到顶点的距离在队列中只有O(1),并且每个边缘最多只执行一次。