Algorithm 递归计算最近对

Algorithm 递归计算最近对,algorithm,recursion,closest-points,Algorithm,Recursion,Closest Points,我正在努力做到这一点,但是有一个地方我完全被卡住了 可以使用递归分治方法在O(n logn)时间内解决问题,例如,如下所示: 1) 根据点的x坐标对点进行排序 2) 通过垂直线x=xmid将点集拆分为两个大小相等的子集 3) 在左子集和右子集中递归地解决问题。这将分别产生左侧和右侧的最小距离dLmin和dRmin 4) 求一对点之间的最小距离dLRmin,其中一点位于分割垂直线的左侧,第二点位于右侧 5) 最终答案是dLmin、dRmin和dLRmin中的最小值 我的问题是第3步:假设你已经将8

我正在努力做到这一点,但是有一个地方我完全被卡住了

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

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中发生的子阵列的每个后续分割。。它是?或者我还缺少另一种方法吗?

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


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

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