分治法最近对

1.问题
分治法最近对问题
2.解析
用分治法解决最近点对问题,就是将一个问题分解两个子问题,然后递归处理子问题,然后合并。可能两个点在每个子问题中,也可能两个点分别在两个子问题中,就这两种情况。则基本过程为:找一条中垂线m(坐位S集合x坐标的中位数)把n个元素分成左右两部分元素,然后分别求得两边的最短距离d1,d2,然后取两者中的最小者记为d,在中线两边分别取d的距离,记录该距离范围内点的个数,中线左边有L个元素,右边有R个元素,分别将两边的点按y坐标升序排列,在左边集合中每一个点,找右边集合的点,找到与之距离小于d的点,更新最短距离,直到循环结束,即可求出最短距离。
3.设计
若子集长度等于2,直接返回该两点的距离
集长度大于3,进行分治求解
Point *pts1 = new Point[length]; //开辟两个子集
Point *pts2 = new Point[length];

    sort(points, points + length, compareX);    //调用algorithm库中的sort函数对points进行排序,compareX为自定义的排序规则
    double mid = points[(length - 1) / 2].x;    //排完序后的中间下标值,即中位数

    for (i = 0; i < length / 2; i++)
        pts1[i] = points[i];
    for (int j = 0, i = length / 2; i < length; i++)
        pts2[j++] = points[i];

    d1 = ClosestPair(pts1, length / 2, a1, b1);             //分治求解左半部分子集的最近点  
    d2 = ClosestPair(pts2, length - length / 2, a2, b2);    //分治求解右半部分子集的最近点 

if (d1 < d2) { distance = d1; a = a1; b = b1; } //记录最近点,最近距离
else { distance = d2; a = a2; b = b2; }
4.分析
应用分治法求解含有n个点的最近对问题,其时间复杂性可由递推式表示:
T(n)=2*T(n/2)+f(n)。
由以上分析:合并子问题的解的时间f(n)=O(1)。进而可得分治法求最近对问题的时间复杂度为:T(n)=O(nlog2n)。
5.源码
(https://github.com/Lily-blog/boostore/blob/main/%E6%9C%80%E8%BF%91%E5%AF%B9.cpp)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值