算法分析与设计(work5)
1、问题
给出\(n\)个平面上的点,求出距离最近的两个点的坐标以及最近距离。
2、解析
蛮力法:
对每对点之间相互比较,求出最小值即可。
分治法:
对所有点按照\(x\)轴或\(y\)轴进行排序,然后把这个集合里的点分成两半,依次分开,最后在一步一步合并起来即可。
3、设计
蛮力法:
for(int i=1;i<=n;i++){
for(int j=i+1;j<=n;j++){
double nowdis=dis(s[i],s[j]);
if(nowdis<min_dis){
min_dis=nowdis;
p1=s[i];
p2=s[j];
}
}
}
分治法
void solve(int l,int r)
{
if(r-l==1){
double nowdis=dis(s[l],s[r]);
if(min_dis>nowdis){
p1=s[l];
p2=s[r];
min_dis=nowdis;
}
}else if(r-l==2){
double nowdis=dis(s[l],s[l+1]);
if(nowdis<min_dis){
p1=s[l];
p2=s[l+1];
min_dis=nowdis;
}
nowdis=dis(s[l],s[r]);
if(nowdis<min_dis){
p1=s[l];
p2=s[r];
min_dis=nowdis;
}
nowdis=dis(s[l+1],s[r]);
if(nowdis<min_dis){
p1=s[l+1];
p2=s[r];
min_dis=nowdis;
}
}else{
int mid=(l+r)/2;
solve(l,mid);
solve(mid+1,r);
temp.clear();
for(int i=l;i<=r;i++){
if(s[i].x-s[mid].x<min_dis){
temp.push_back(s[i]);
}
}
for(int i=0;i<temp.size();i++){
for(int j=i+1;j<temp.size();j++){
double nowdis=dis(temp[i],temp[j]);
if(nowdis<min_dis){
min_dis=nowdis;
p1=temp[i];
p2=temp[j];
}
}
}
}
}
4、分析
蛮力法:
需要每对点之间进行比较,可以推出时间复杂度\(O(n^2)\)
分治法
对点排序时间复杂度\(O(nlogn)\),对点进行分治时间复杂度\(O(logn)\),需要遍历到每个点,时间复杂度\(O(n)\),总时间复杂度\(O(nlogn)\)。
5、源码
github源码:https://github.com/HaHe-a/Algorithm-analysis-and-design-code
越自律,越自由