最近对伪代码示例

时间:2012-10-30 11:11:42

标签: algorithm graph-theory

我一直在阅读算法设计手册。我和What is the meaning of "from distinct vertex chains" in this nearest neighbor algorithm?有同样的问题,但我无法在那里听到答案。

  

一个不同的想法可能是重复连接最接近的一对端点,这些端点的连接不会产生问题,例如过早终止循环。每个顶点都以其自己的单个顶点链开始。在将所有内容合并在一起之后,我们将最终得到一个包含其中所有点的链。连接最后两个端点为我们提供了一个循环。在执行此最近对启发式过程中的任何步骤中,我们将有一组可用于合并的单顶点和顶点不相交链。在伪代码中:

ClosestPair(P)
    Let n be the number of points in set P.
    For i = 1  to n − 1 do
        d = ∞
        For each pair of endpoints (s, t) from distinct vertex chains
            if dist(s, t) ≤ d then sm = s, tm = t, and d = dist(s, t)
        Connect (sm, tm) by an edge
    Connect the two endpoints by an edge
Please note that sm and tm should be sm and tm.

我无法遵循上述逻辑。请演示the book-21, -5, -1, 0, 1, 3, and 11中给出的简单示例的计算。逐步显示计算,以便人们可以轻松地遵循上述代码。

1 个答案:

答案 0 :(得分:5)

第一个例子

在下面的表示法中,我使用括号表示链。每个顶点都以其第一个链开始。内循环遍历所有链端点对,即所有具有紧邻它们的括号写入的节点对,但仅限于两个端点来自不同链的那些对。这个内环的结果是一对端点,它们使距离d最小化。我假设对被排序s < t,而且这些对按字典顺序遍历。在这种情况下,由于代码中的d,将返回与最小匹配的最右边一对。

(-21), (-5), (-1), (0), (1), (3), (11)    d =  1, sm =   0, tm =  1
(-21), (-5), (-1), (0 ,  1), (3), (11)    d =  1, sm =  -1, tm =  0
(-21), (-5), (-1 ,  0 ,  1), (3), (11)    d =  2, sm =   1, tm =  3
(-21), (-5), (-1 ,  0 ,  1 ,  3), (11)    d =  4, sm =  -5, tm = -1
(-21), (-5 ,  -1 ,  0 ,  1 ,  3), (11)    d =  8, sm =   3, tm = 11
(-21), (-5 ,  -1 ,  0 ,  1 ,  3 ,  11)    d = 16, sm = -21, tm = -5
(-21 ,  -5 ,  -1 ,  0 ,  1 ,  3 ,  11)    d = 32 to close the loop

因此,在此示例中,代码按预期工作。

第二个例子

图1.4将给出一个示例,其中此代码不起作用,即将产生次优结果。像这样标记顶点

  A <--(1+e)--> B <--(1+e)--> C
  ^             ^             ^
  |             |             |
(1-e)         (1-e)         (1-e)
  |             |             |
  v             v             v
  D <--(1+e)--> E <--(1+e)--> F

在这种情况下,你会得到

(A), (B), (C), (D), (E), (F)  d = 1-e, sm = C, tm = F
(C, F), (A), (B), (D), (E)    d = 1-e, sm = B, tm = E
(C, F), (B, E), (A), (D)      d = 1-e, sm = A, tm = D
(C, F), (B, E), (A, D)        d = 1+e, sm = E, tm = F
(B, E, F, C), (A, D)          d = 1+e, sm = A, tm = B
(D, A, B, E, F, C)            d = sqrt((2+2e)^2+(1-e)^2) to close

这不是最佳解决方案。