我正在看维基百科的词条,看看如何解决这个问题。它列出了五个步骤
1.沿x坐标排序点
2.用垂直线x= xmid将点集分割成两个大小相等的子集
3.在左子集中和右子集中递归地解决问题。这将分别给出左侧和右侧的最小距离dLmin和dRmin。
4.求出两点间的最小距离dLRmin,其中一点位于分割线的左边,第二点位于分割线的右边。
5.最终答案是dLmin、dRmin和dLRmin中的最小值。
第四步,我有理解上的困难。如何选择直线左侧的点与直线右侧的点进行比较。我知道我不应该比较所有的点,但我不清楚如何选择要比较的点。请不要给我一个链接,我已经搜索了,去了许多链接,还没有找到一个解释,帮助我理解第四步。
谢谢
Aaron
发布于 2011-04-24 23:39:09
你的问题的答案在维基百科文章的下一段:
结果表明,步骤4可以在线性时间内完成。同样,天真的方法将需要计算所有左右对的距离,即在二次时间内。关键观察值基于点集的以下稀疏性属性。我们已经知道,最近的一对点的距离不会比dist = min(dLmin,dRmin)更远。因此,对于分割线左侧的每个点p,我们必须将距离与分割线右侧的尺寸矩形(dist,2* dist)中的点进行比较,如图所示。更重要的是,这个矩形最多只能包含6个两两距离至少为dRmin的点。步数的递推关系可以写成T(n) = 2T(n / 2) + O( n),我们可以用主定理来求解,得到O(n )。
我想我不能比他们说得更清楚了,但是你对算法的这一步有什么具体的问题吗?
https://stackoverflow.com/questions/5773899
复制相似问题