求最近点对算法——C++

题目:

给定的二维平面上有n个点,找其中的一对点,使得在n个点的所有点对中,该点对的距离最小;


算法设计:

(1)蛮力法:计算出所有点对的距离,由此找到距离最小的点对。本题暂不考虑。

(2)分治法:将平面上的点集S按x坐标排序后,若只有1个点,则返回;若有两个点,则直接计算两点距离为最近距离;若有三个点,则两两计算出距离,得到最近距离。

若大于三个点,则将其线性分割成大小大致相等的2个子集S1,S2。最近点对只会出现在以下三种情况中:①点对在子集S1中;②点对在子集S2中;③一个点在S1中,另一个点在S3中。

因此,递归地在S1,S2上解最近点对问题,分别得到S1,S2中的最小距离d1,d2,取d1,d2中的最小距离d和点对。再找出跨越S1,S2的最近点对:合并S1,S2找到点集中x坐标在区间[mid-d,mid+d]范围内的所有点。按y坐标不减排序,循环每个点,找它后面7个点的最小距离,与d比较,比d小则更新d。最后即求得最近点对距离。


算法分析:

(1)蛮力法:n个点之间两两求距离的事件复杂度是O(n²)。

(2)分治法:在计算过程中,每次获得最短距离时,要记录下点对的位置信息。分治法的递归操作每次都是均等分,所以其递归树为logn层,递归函数中的操作均为线性,所以总的时间复杂度为O(nlogn)。

T(n) = 2T(n/2)+O(n)递推= O(nlogn)


<

评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值