递归与分治之最接近点对问题

最接近点对问题

给定平面上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中的点,证明如下:
在这里插入图片描述
因此,在合并答案时,最多要求检查6
n/2=3n个候选者,这显然是可以在线性时间内找到的。

那么如何确切地值得要检查哪6个点呢?我们可以将P1和P2中的点,按照y轴坐标排序,因为距离不超过d,则只需要检查p上下不超过d的q点即可。

伪代码如下:

在这里插入图片描述
时间复杂度为O(nlogn)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值