最近点对

本文探讨了最近点对问题,分析了暴力算法的O(n²)时间复杂度,并介绍了利用分治法来优化求解过程,通过不断缩小问题规模来提高效率。

1.问题

最近点对问题:在一个平面上随机分布着 n 个点,现给定 n 个点的坐标,要求给出最近的两个点之间的距离。

2.解析

1.暴力算法
在双重for暴力的情况下,该问题的时间复杂度为O(n²),当 n 的值不断增大时,这个方法处理起来就显得效率很低。
2.分治法
分治法的思想是将平面上的点分成左右两半,分别求左右两半的最小距离,然后取一个最小值,整个问题的规模为n个点,将这n个点一分为二,就变成两个求解n/2个点规模下最近点对的距离问题,如此不断缩小规模,当变成两个点的规模下求解最近点对问题时,即为这两个点的距离。当然,最近点对还可能会有这样的情况,即一个点在左半边,一个点在右半边。

分解:
对所有的点按照x坐标从小到大排序(排序方法时间复杂度O(nlogn))。
根据下标进行分割,使得点集分为两个集合。
解决:
递归的寻找两个集合中的最近点对。
取两个集合最近点对中的最小值dis。
合并:
最近距离不一定存在于两个集合中,可能一个点在集合A,一个点在集合B,而这两点	间距离小于dis。
其中合并的这一步具体展开:
我们假设从两部分分别求出的最近距离为 dis1 和 dis2 , dis = min( dis1, dis2 ),再假设分属两部分的情况下,A ( x1 , y1 ) 属于第一部分 ,B ( x2 , y2 )属于第二部分,且以 x 轴作为分割的量,我们可以断定,如果存在解,A 、B 两点一定处在中心分割线两侧 2*dis 长度之内的区间内,且经过相关证明,在这范围内的点不会超过6个。

在这里插入图片描述

3.设计

float closest(Point* points, int n, Point& a, Point& b) {
   
   
	//递归函数出口,两个点直接返回距离,一个点时返回
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值