最小生成树的Prim算法 - 算法混淆

时间:2009-12-19 05:12:33

标签: algorithm minimum-spanning-tree prims-algorithm

我一直在研究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!为什么呢?

2 个答案:

答案 0 :(得分:4)

MO的其中一个人很友善地通过电子邮件回答。 问题是我没有注意到通过ExtractMin(Q)操作一次添加一个树节点。

以下是他给出的答复:

*您的分析实际上完全正确,但您(和我) 对于更新密钥[v]和pi(v)的含义感到困惑。在 特别是,当您更新pi(v)时,将其添加到树中。一个 节点u被添加到树中(沿着连接到它的边缘) 父pi(u))只有从Q中提取出来。所以一切都在进行 就像你描述的那样,但最后,你只完成了一步 (a),而非步骤(c)。这是该计划所做的事情的破败 情况下:

  • (第1-3行)所有节点都放在Q中(节点集不在 树),他们的父母被宣布为NIL,以及他们的钥匙(即 沿单个边缘到现有树的最小距离)设置为 无穷大
  • (第4行)根节点(节点a)的密钥设置为0
  • (第6行)具有最小密钥的节点u(根节点a)是 从Q中删除并添加到树
  • (第8-11行)节点b和h的键更新为4和8,并且 pi(b)和pi(h)被设置为u(但是b和h 从Q中提取)。 这完成了步骤(a)
  • (第6行)具有最小密钥的节点u(现在是节点b,带有 key = 4)从Q中删除并通过其父级添加到树中( 是pi(b)= a)
  • (第8-11行)节点c的键更新为8,pi(c)设置为 湾由于key(​​h)= 8小于11 = w(b,h),h的密钥和父亲 没有更新。这完成了步骤(b)
  • (第6行)具有最小密钥的节点u(节点c,密钥= 8,但它 也可以是节点h,其中也有密钥= 8)从Q中删除 并通过其父级(即pi(c)= b)
  • 添加到树中
  • (第8-11行)更新节点d,i和f的密钥和父节点,完成步骤(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