1 .问题
最近对问题
在一个包含n个点的集合中,找出距离最近的两个点。
2.解析
n=2时,两点之间的距离就可以直接得出。
当n>=3时,可以利用点集在x轴方向上的中位数m,在该处作一条垂线,将点集分成大小分别为[n/2] 和[n/2]的来给两个子集P1和Pr。得其中[n/2]个点在线的左边或线上,另外的[n/2]个点在线的右边或线上。然后通过递归求解子问题P1和Pr来得到最近点对问题的解。其中d1和dr分别表示在P1和Pr中的最近对距离,并定义d=min{d1,dr}。
3.设计
double partition(node p[],int left,int right)
{
if(right - left == 1){
return dis(p[left],p[right]);
}
if(right - left == 2){
double d1 = dis(p[left],p[left+1]);
double d2 = dis(p[left],p[right]);
double d3 = dis(p[left+1],p[right]);
d2 = min(d1,d2);
d3 = min(d2,d3);
return d3;
}
int m = (left + right)/2;
double d1 = partition(p,left,m);
double d2 = partition(p,m+1,right);
double d = min(d1,d2);
int l=left,r=right;
while(p[l].x<p[m].x-d && l<=right){
l++;
}
while(p[r].x>p[m].x+d && l<=left){
r--;
}
double d3;
sort(p+l,p+r+1,compare2);
for(int i=l;i<r;i++){
for(int j=i+1;j<r;j++){
if(p[j].y-p[i].y > d){
break;
}
else{
d3 = dis(p[i],p[j]);
if(d3 < d){
d = d3;
}
}
}
}
}
4.分析
5.源码
https://github.com/land555/algorithm-analy-sis/blob/main/week5.cpp