Given n points in the plane, find a pair with smallest Euclidean distance between them.
题目很简单,就是在二维平面上寻找到距离最近的点对。
最直接的算法就是暴力寻找法。一个一个找呗,复杂度显然是O(n^2)。
public static int minDis(Point[] Ps,int start,int end){
//暴力找出最小距离
if(end-start+1<2){
return 0;
}
int min=calculateDistance(Ps[start],Ps[end]);
int temp=min;
for(int i=start;i<end;i++){
for(int j=i+1;j<=end;j++){
temp=calculateDistance(Ps[i],Ps[j]);
if(temp<=min){
min=temp;
}
}
}
return min;
}
还是那个问题,我们能做得更好吗?显然是可以的。下面我们将用分治法将它降到O(nlog(n));
运用分治法:要找到整个平面的最近点对,我们可以先找左右两边最近的点对: