这是一个旧的考试问题。
在(V,E)的什么条件下我们应该实现Prim的最小优先级队列 算法使用数组(由顶点索引)而不是堆(具有对数时间) Extract-Min和Decrease-Key操作的实现)?
在(V,E)的什么条件下我们应该实现Prim的最小优先级队列 使用有序数组的算法?
答案 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并从阵列中删除它将不需要很多操作。在这种情况下,使用堆不是必需的,并且由于构建堆所需的操作,它甚至可能比数组慢。