算法-分治法-最近对问题

蛮力法的最近对问题:https://blog.csdn.net/qq_40452317/article/details/88040973

用分治法解决问题就是将集合s分为两个集合s1和s2。每个解合都有n/2个点,接着在子集和中递归求解最近的点。

一维情况

为了简单化问题,我们先考虑一维情形,即所有的点都在x轴上(假如顺序是有序的,也可以排好序,为简单,直接输入有序序列),x轴上某个点m将集合划分为s1和s2,并且两个集合的点数都是相同的,递归的求解两个子集最近对的点,(p1,p2)和(q1,q2)。如果,两个集合的最近点对都在子集s1和s2中,则

                                                          d = min{ |p1-p2| , |q1-q2| } 

如果,最近点对分别在s1和s2中,则一定是(p3,q3)。|p3-q3|<d,则p3和q3两者与m的距离都不超过d,且在区间(m-d,d]和(d,m+d]各有且仅有一个点。这样,就可以在线性时间内实现合并。

                       

一维情形下的最近点对时间复杂度为O(nlogn)。

二维情况

推广一维,来看二维,我们仿照一维的情况先把所有点按照x(横坐标)从左到右升序排列。以X横坐标中间的点作为分界线.将平面的点分成左边和右边。找到左边的点中最近点对的距离d1,和右边最近点对的距离d2。d=min{d1,d2}。如下如:

                    

当前的d1,d2都是两边各自的点的最近距离,但是没有考虑到两边的点相互配对的情况,即是点对一个在左边区域,一个在右

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值