算法分析与设计homework_5

该博客介绍了如何在二维平面上,给定n个点的情况下,通过分治算法有效地找出两两之间的最小距离。当n小于等于3时,直接比较点之间的距离;当n大于3时,采用递归的分治策略,结合排序,逐步缩小查找范围,最终达到O(nlogn)的时间复杂度。博客提供了算法解析、伪代码和时间复杂度分析。
摘要由CSDN通过智能技术生成

1.问题
在二位平面内,给定n(n>=2)个点,找出这n个点中两两之间的最小距离。
2.解析
当n=2时,直接输出两点的距离;
当n=3时,两两比较点之间的距离,输出其中最短的距离;
当n>3时,采用分治的方法,将点集不断二分找出最小集合内的最短距离d,但d不一定是分出的两个子集中的最短距离,再临近子集中的点与分割线上的点计算距离并与d比较,找出最小距离d依此方式递归,找出最短距离dmin。

3.设计
double length(两个点){
return 两点的距离
}
double EfficientClosesPair(Point* P,int s,int f){ //P存储点集并且以x升序排列,s为起点,f为终点
if(f-s == 1 ){
return length(起点,终点)
}
else if(f-s == 2){
d1= length(起点,第2点)
d2= length(起点,终点)
d3= length(终点,第2点)
return (d1,d2,d3中最短的)
}
else{
mid=(s+f)/2
Pl=P的前mid个点
Pr=P的mid+1到f的点集
dl=EfficientClosesPair(Pl,s,mid)
dr=EfficientClosesPair(Pr,mid+1,f)
d=min(dl,dr)
for(遍历P){
将P中所有点x坐标和P[mid].x比较,将差值小于d的点存入S
}
将S按y坐标升序排列
for(i遍历S所有点){
for(j=i+1;j<i+6且j<S点的总数;j++){
dmin=min(d,length(S[i],S[j]))
}
}
return dmin
}
}

4.分析
时间复杂度:O(nlogn)

5.源码
https://github.com/951390752/Algorithm_analysis_and_design-homework/blob/main/homework_5/lab_5.cpp

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值