【发布时间】: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