最接近点对问题
给定平面上n个点的集合S,找其中的一对点,使得在n个点组成的所有点对中,该点对间的距离最小。
首先我们考虑一维情况下,此时空间S中的n个点可以看为x轴上的n个实数,最接近点对就变成了n个实数中最接近的2个数。
当然我们可以用暴力的方式,求没两个临近的点的距离,记录并比较找到最小值,但是我们现在是在为这两个点在空间中解决方案铺路,空间中的点如果进行暴力求解,其复杂度将大的惊人,因此,我们选择分治法来解决这一问题。
我们将x轴用某一个点分为两部分,分别对两部分递归求解最小距离然后比较取最小值是否可行呢?
当然是可行的,但是有一个问题,如果产生最小距离的两个点位于两个集合内呢?因此我们要考虑上两个集合边界上的点对距离,跟集合内的最小距离比较才能得到最佳答案。
抽象而言,要递归地在S1和S2上找出其最接近点对{p1,p2}和{q1,q2},并设d=min{|p1-p2|,|q1-q2|},然后求解S1上最接近分界点的点到最接近分割点的S2上的点的距离,比较取最小值。
OK,类比一维情况,我们来求解二维下的问题的解。
选取垂直线L:x=m来分割直线,其中m为S中个点的中位数,将空间S分割为S1和S2。
递归地在S1和S2上找出最小距离d1,d2设d=min(d1,d2),S中的最接近点对或者是d,或者是某个点对{p,q},其中p∈P1,q∈P2。
那么如何找到{p,q}呢?
考虑P1中任意点p,他如果与P2中的点q构成最接近点对的候选者,那么一定有|pq|<d。
满足这个条件的P2的点,一定落在一个d2d的矩形R中,如下图所示:
由d的意义可知,P2中任意两个点的距离不超过d,因此可以得知,R中最多有6个S中的点,证明如下:
因此,在合并答案时,最多要求检查6n/2=3n个候选者,这显然是可以在线性时间内找到的。
那么如何确切地值得要检查哪6个点呢?我们可以将P1和P2中的点,按照y轴坐标排序,因为距离不超过d,则只需要检查p上下不超过d的q点即可。
伪代码如下:
时间复杂度为O(nlogn)