我正在查看Wikipedia entry的Prim算法,我注意到它的邻接矩阵的时间复杂度为O(V ^ 2),其堆和邻接列表的时间复杂度为O(E lg( V))其中E是边数,V是图中顶点数。
由于Prim的算法用于密集图,E可以接近V ^ 2,但是当它接近时,堆的时间复杂度变为O(V ^ 2 lg(V)),大于O(V ^ 2) )。显然,堆只会提高性能,而不仅仅是搜索数组,但时间复杂度则表示不然。
算法如何通过改进实际减速?
答案 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堆,这明显更好。