递归计算最近的对

时间:2014-08-12 15:44:06

标签: algorithm recursion closest-points

我正在尝试执行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.让& #39; s还说第2点和第3点是这4点中最接近的一对。好吧,如果你继续递归地将这个子集分成两半,你最终会计算出1-2之间的最小值(在左边),你将计算3-4之间的最小值(在右边),你将返回这两对中的最小距离对..

然而 - 你完全错过了2-3之间的距离,因为你从来没有计算过,因为他们在对面......所以这个问题怎么解决了?注意步骤4是如何在这个递归过程之后出现的,它似乎是一个独立的步骤,仅适用于步骤3之后的最终结果,而不适用于步骤3中发生的每个子阵列的后续划分..是吗?还是有其他方法可以解决这个问题吗?

1 个答案:

答案 0 :(得分:3)

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

要使用您的示例,您将计算dLmin作为点1和2之间的距离,dRmin作为点3和4之间的距离,然后将dLRmin计算为点2和3之间的距离。因为dLRmin是您的最小点假设的情况下,它将被退回。