Prim的算法时间复杂度

时间:2009-04-04 02:07:18

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

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

由于Prim的算法用于密集图,E可以接近V ^ 2,但是当它接近时,堆的时间复杂度变为O(V ^ 2 lg(V)),大于O(V ^ 2) )。显然,堆只会提高性能,而不仅仅是搜索数组,但时间复杂度则表示不然。

算法如何通过改进实际减速?

3 个答案:

答案 0 :(得分:11)

即使堆使您无法搜索数组,它也会减慢算法的“更新”部分:数组更新为O(1),而堆更新为O(log(N))。

从本质上讲,你在算法的一部分中交换速度以换取另一部分的速度。

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

我头脑中的另一个例子是搜索数组中的元素。 如果你只做一次,线性搜索是最好的 - 但如果你做了很多查询,最好对它进行排序并每次都使用二进制搜索。

答案 1 :(得分:3)

从算法导论(卡门)

时间=Θ(V)·T(EXTRACT-MIN)+Θ(E)·T(减少键)

                   T(EXTRACT-MIN)   T(DECREASE-KEY)   Total

1. array            O(V)             O(1)              O(V^2)
2. binary heap      O(lgV)           O(lgV)            O(E lgV)
3. Fibonacci heap   O(lgV)           O(1)              O(E + VlgV)

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

答案 2 :(得分:0)

我认为你在某种程度上读错了。 对于密集图,文章讨论了使用时间复杂度为O(E + V log V)的Fibonacci堆,这明显更好。