【问题标题】:Prim's algorithm for minimum spanning trees - confusion in algorithmPrim 的最小生成树算法 - 算法混淆
【发布时间】:2009-12-19 05:12:32
【问题描述】:

我一直在学习 Cormen 等人的书,但我对他们提供的算法有点困惑。我已经通过 wikipedia 了解 Prim 算法的概念是如何工作的,但我无法使用我书中提供的算法来模仿这种工作方式。

请参阅该章节的在线副本: http://www.cs.cmu.edu/afs/cs/academic/class/15451-s04/www/Lectures/minimumSpanningTrees.pdf

算法在上述链接的第 13 页给出,示例图在前一页。

现在,在示例案例中使用算法,第一步:

u

现在首先设置 v

但是算法说“对于 Adj[u] 中的每个 v”。

所以下一步应该设置v

啊啊啊!为什么?

【问题讨论】:

  • 您不妨考虑在mathoverflow.net 上提出这个问题。
  • 哇,这个问题在那边没有得到很热烈的欢迎。这不是我所期望的。

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


【解决方案1】:

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

这是他给的回复:

*您的分析实际上是完全正确的,但是您(和我) 对更新 key[v] 和 pi(v) 的含义感到困惑。在 特别是,当您更新 pi(v) 时,您不要将它添加到树中。一种 节点 u 被添加到树中(沿着连接它的边 父 pi(u)) 仅当它从 Q 中提取时。所以一切都进行 就像你描述的那样,但最后,你只完成了一步 (a),而不是步骤 (c)。这是该程序在其中的作用的简要说明 案例:

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

【讨论】:

    【解决方案2】:

    您的描述是正确的,算法确实按照您在步骤 a 中的描述设置了 key[h] = 8。

    步骤 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
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多