我一直在研究Cormen等人的书,我对他们提供的算法感到有些困惑。我已经理解了Prim算法的概念是如何通过维基百科工作的,但我不能模仿使用我书中提供的算法。
请参阅本章的在线副本: http://www.cs.cmu.edu/afs/cs/academic/class/15451-s04/www/Lectures/minimumSpanningTrees.pdf
算法在上面链接的第13页给出,示例图在上一页。
现在,在示例案例中使用算法,在第一步:
u< ---节点A到ExtractMin(Q)。 然后根据图表在Adj [u]中有两个条目:节点b和节点h。
现在首先设置v< ----节点b。然后检查v是否属于Q.确实如此。检查w(u,v)<键[V]。真正。所以PI [v]< --- u和key [v]< --- w(u,v)。 我得到了这么多。这显示在第12页的图表的(b)中。
但算法说“对于Adj [u]中的每个v”。
所以下一步应该设置v< --- node h。 然后检查v是否属于Q.确实如此!并且是w(u,v)<键[V]?它是!因为键[v] =无穷大! 但该图显示了(c)部分中的不同步骤!
Aaaaaah!为什么呢?
答案 0 :(得分:4)
MO的其中一个人很友善地通过电子邮件回答。 问题是我没有注意到通过ExtractMin(Q)操作一次添加一个树节点。
以下是他给出的答复:
*您的分析实际上完全正确,但您(和我) 对于更新密钥[v]和pi(v)的含义感到困惑。在 特别是,当您更新pi(v)时,不将其添加到树中。一个 节点u被添加到树中(沿着连接到它的边缘) 父pi(u))只有从Q中提取出来。所以一切都在进行 就像你描述的那样,但最后,你只完成了一步 (a),而非步骤(c)。这是该计划所做的事情的破败 情况下:
答案 1 :(得分:0)
您的描述是正确的,算法确实设置了键[h] = 8,正如您在步骤a中描述的那样。
步骤c有一个关键点,你可以选择h,但是这个例子选择了c。
查看它的最佳方法是查看每个步骤(就在ExtractMin之前)优先级队列中的(非无限)元素:
1: Q = (a, 0) - removes a, sets key[b]=4, key[h]=8
2: Q = (b, 4), (h, 8) - removes b, sets key[c]=8
3: Q = (h, 8), (c, 8) - could pick either h or c, they have the same key