实验报告
实验名称: 最近对问题
1.问题
P为笛卡尔平面上n>1个点构成的集合,求最近的两个点的距离(n=2^k)。
2.解析
3.设计
[核心伪代码]
double ClosestPair(Point points[], int length, Point &a, Point &b){
double min;
double d1,d2;
int i=0,j=0,k=0,x=0;
Point a1,b1,a2,b2;
if(length<2)
return INF;//INFINITE_DISTANCE;
else if(length==2){
a=points[0];
b=points[1];
min = Distance(points[0], points[1]);
}
else{
Point *p1=new Point[length];
Point *p2=new Point[length];
sort(points,points+length,comp1);
double mid=points[(length-1)/2].x;
for(i=0;i<length/2;i++){
p1[i]=points[i];
}
for(int l=0,m=length/2;m<length;m++){
p2[l++]=points[m];
}
d1=ClosestPair(p1,length/2,a1,b1);
d2=ClosestPair(p2,length-length/2,a2,b2);
if(d1<d2){
min = d1;
a=a1;
b=b1;
}
else{
min=d2;
a=a2;
b=b2;
}
Point *p3=new Point[length];
for(i=0,k=0;i<length;i++){
if(abs(points[i].x-mid)<=min){
p3[k++]=points[i];
}
}
sort(p3,p3+k,comp2);
for (i=0;i<k;i++){
if(p3[j].x-mid>=0){
continue;
}
x=0;
for(j=i+1;j<=i+6+x && j<k;j++){
if(p3[j].x-mid<0){
x++;
continue;
}
if(Distance(p3[i],p3[j])<min){
min=Distance(p3[i],p3[j]);
a=p3[i];
b=p3[j];
}
}
}
}
return min;
}
4.分析
[算法复杂度推导]
时间复杂度为 O(nlog2n)
5.源码
[github源码地址]
https://github.com/Ayong-xie/Algorithm-suanfa/blob/main/%E6%9C%80%E8%BF%91%E5%AF%B9%E9%97%AE%E9%A2%98