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