分治策略解决最近对问题

该博客介绍了如何使用分治策略解决寻找n个点中欧几里得距离最小的点对问题。当点按x轴升序排列后,通过中位数分割点集并递归求解,最终实现线性时间复杂度的解决方案。伪代码和算法分析展示了该方法的效率,并提供了源码链接供进一步研究。
摘要由CSDN通过智能技术生成

1.问题
n个点在公共空间中,求出所有点对的欧几里得距离最小的点对。
2.解析
令P为笛卡儿平面上n>1个点构成的集合,简单起见,假设集合中的每个点都不一样,且这些点按照x轴坐标升序排列,并将这个列表示为Q。
当2<=n<=3时,问题就可以通过蛮力算法求解。当n>3时,可以利用点集在x轴方向上的中位数m,在该处做一条垂线,将点集分成大小分别为n/2(向上取整),n/2(向下取整)的两个子集Pl和Pr。然后就可以通过递归求解子问题Pl和Pr来得到最近对问题的解。其中dl和dr分别表示在Pl和Pr中最近对距离,并定义d=min{dl,dr}
3.设计
核心伪代码,课本P148
(尽量避免在最内层循环中计算平方根)
EfficientClosest Pair(P,Q)//(分治)
//输入 (1)P存n≥2个点,按其x轴坐标升序排序;
(2)Q存和P相同的点,按其y轴坐标升序排序;
//输出:最近点对之间的欧几里得距离;

if n≤3 返回蛮力算法求出dmin;
else
将P的前半部分(n/2)个点复制到P1,Q的前半部分(n/2)个点复制到Q1中;
将P的余下部分(n/2)个点复制到Pr,Q的余下部分(n/2)个点复制到Qr中;

d1←EfficientClosest Pair(P1,Q1)
dr←EfficientClosest Pair(Pr,Qr)
d←min{d1,dr}
m←P[前半部分(n/2)-1].x
将Q中所有绝对值(x-m)<d的点复制到数组S[0…num-1]
dmin=sqrt((y2-y1)(y2-y1)+(x2-x1)(x2-x1))
dminsq←dd
for i←0 to num-2 do
k←i+1
while k≤num-1 and (S[k].y-S[i].y)(S[k].y-S[i].y)<dimsq
dminsq←min((S[k].x-S[i].x)(S[k].x-S[i].x)+(S[k].y-S[i].y)(S[k].y-S[i].y)),dminsq)
k←k+1
return sqrt(dminsq)
3.分析
无论将问题划分成两个规模减半的子问题,还是合并子问题的解,该算法都只需要线性时间,因此,假设n是2的幂,可以得到算法运行时间的递归式:T(n)=2T(n/2)+f(n);
4.源码
https://github.com/Marvisss/Cloestdistance/tree/main

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值