何时分别为Prim算法使用数组和优先级队列?

时间:2013-12-12 11:36:00

标签: arrays conditional-statements priority-queue prims-algorithm

这是一个旧的考试问题。

在(V,E)的什么条件下我们应该实现Prim的最小优先级队列 算法使用数组(由顶点索引)而不是堆(具有对数时间) Extract-Min和Decrease-Key操作的实现)?

在(V,E)的什么条件下我们应该实现Prim的最小优先级队列 使用有序数组的算法?

2 个答案:

答案 0 :(得分:0)

Prim在O(mlog(n))时间内运行二进制堆实现,m是边缘数,n是顶点数。但是,当图形非常密集时,m非常大,则Prim在O(n ^ 2log(n))中运行。您可以创建一个包含大量(n)顶点的图形,并将所有顶点相互连接以说服自己。所以....(n-1)+(n-2)+(n-3)......(n-n + 1)。

这可以重写为

n(n + 1)/ 2,其为O(n ^ 2),如

所述

优先级队列数组实现在O(n ^ 2)时间内运行,这在维基百科页面上有记录,虽然我没有证明它。

因此,当m非常大时,最好使用邻接矩阵。

你问了一个条件,我会说当m非常大且与n的顺序相同。

答案 1 :(得分:0)

当E很大时,最好使用堆作为优先级队列,因为队列中将有许多节点。从数组O(n)/ O(n)中找到min / remove min需要花费时间,而堆只需要O(1)/ log(n)。

如果E很小,我们将在队列中有很少的节点,因此,在这种情况下,找到min并从阵列中删除它将不需要很多操作。在这种情况下,使用堆不是必需的,并且由于构建堆所需的操作,它甚至可能比数组慢。