【问题标题】:Recursively compute closest pairs递归计算最接近的对
【发布时间】:2014-10-05 18:39:45
【问题描述】:

我正在尝试执行closest pairs algorithm - 但是有一个区域我完全被卡住了。

使用递归分治法可以在 O(n log n) 时间内解决该问题,例如,如下:

1) 根据 x 坐标对点进行排序。

2) 通过一条垂直线 x=xmid 将一组点分成两个大小相等的子集。

3) 在左右子集中递归求解问题。这分别产生了左侧和右侧的最小距离 dLmin 和 dRmin。

4) 求一组点对的最小距离 dLRmin,其中一个点位于分界线的左侧,第二个点位于右侧。

5) 最终答案是 dLmin、dRmin 和 dLRmin 中的最小值。

我的问题在于第 3 步:假设您已将 8 个元素的数组分成两半,在左半边有 4 个点 - 1、2、3 和 4。假设第 2 点和3 是这 4 个点中最接近的一对。好吧,如果你继续递归地把这个子集分成两半,你最终会计算出 1-2 之间的最小值(左边),你会计算 3-4 之间的最小值(右边),然后你会返回这两对的最小距离对..

但是 - 你完全错过了 2-3 之间的距离,因为你从来没有计算过它,因为它们在对立面......那么这个问题是如何解决的呢?请注意第 4 步是如何在此递归过程之后出现的,它似乎是一个独立的步骤,并且仅适用于第 3 步之后的最终结果,而不适用于第 3 步中发生的子数组的每个后续划分。是吗?或者有没有我想念的另一种方法?

【问题讨论】:

  • 您也在每个递归调用中执行步骤 4 和 5,这样您就不会错过任何可能性。
  • 太好了,这就是我的想法,但无法弄清楚..谢谢,这完全有道理..

标签: algorithm recursion closest-points


【解决方案1】:

这些步骤有点误导,因为步骤 2-5 都是递归的一部分。在每个递归级别,您都需要计算 dLmin、dRmin 和 dLRmin。这些中的最小值作为该递归级别的答案返回。

以您的示例为例,您可以将 dLmin 计算为点 1 和 2 之间的距离,dRmin 作为点 3 和 4 之间的距离,然后将 dLRmin 作为点 2 和 3 之间的距离。由于 dLRmin 在您的假设情况,它会被退回。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-09-03
    • 2016-07-15
    • 2018-08-29
    • 1970-01-01
    • 2016-08-26
    • 1970-01-01
    相关资源
    最近更新 更多