【问题标题】:Prim's Algorithm Time ComplexityPrim 算法时间复杂度
【发布时间】:2010-10-17 12:15:47
【问题描述】:

我正在查看 Prim 算法的 Wikipedia entry,我注意到它与邻接矩阵的时间复杂度为 O(V^2),而其与堆和邻接列表的时间复杂度为 O(E lg(V) ) 其中 E 是边数,V 是图中的顶点数。

由于Prim的算法用于更密集的图中,E可以接近V^2,但是当它接近时,堆的时间复杂度变为O(V^2 lg(V)),大于O(V^2 )。显然,堆比仅搜索数组会提高性能,但时间复杂度却另有说明。

算法实际上是如何随着改进而变慢的?

【问题讨论】:

    标签: algorithm graph-theory time-complexity prims-algorithm


    【解决方案1】:

    尽管堆可以让您免于搜索数组,但它会减慢算法的“更新”部分:数组更新是 O(1),而堆更新是 O(log(N))。

    本质上,您可以用算法的一个部分的速度来换取另一部分的速度。

    无论如何,您都必须搜索 N 次。 但是,在密集图中,您需要更新很多 (~V^2),而在稀疏图中则不需要。

    我想到的另一个例子是在数组中搜索元素。 如果你只做一次,线性搜索是最好的——但如果你做很多查询,最好每次都进行排序并使用二分搜索。

    【讨论】:

      【解决方案2】:

      从算法入门(卡门)

      时间= Θ(V)·T(EXTRACT-MIN) + Θ(E)·T(DECREASE-KEY)

      T(EXTRACT-MIN) T(DECREASE-KEY) 总计 1. 数组 O(V) O(1) O(V^2) 2.二叉堆 O(lgV) O(lgV) O(E lgV) 3. 斐波那契堆 O(lgV) O(1) O(E + VlgV)

      使用不同的数据结构会导致不同的时间复杂度。

      【讨论】:

        【解决方案3】:

        我认为你在某种程度上读错了。 对于稠密图,文章谈到了使用时间复杂度为 O(E + V log V) 的斐波那契堆,效果明显更好。

        【讨论】:

        • 但即便如此,作为E->V^2,时间复杂度达到O(V^2+Vlog(V)),大于O(V^2)。
        • O(V^2+Vlog(V)) == O(V^2) 学习算法课程后应该很明显......
        • 我的主要观点是他kevmo314在某种程度上读错了文章。文章说斐波那契堆用于足够密集的图形,即 E = w(v)。这篇文章没有提到使用 Prim 算法来处理更密集的图,而是提到了斐波那契堆。足够密集以至于 E=w(V) 而不是 E=w(V^2)。
        • 我认为他没有;他指出,这两种基于堆的方法的复杂性都比基本方法差,这让他感到惊讶。您对文章中关于斐波那契堆的说法是正确的,但这与 OP 几乎无关