分治法求最近对
1. 问题
设p1=(x1, y1), p2=(x2, y2), …, pn=(xn, yn)是平面上n个点构成的集合S,设计算法找出集合S中距离最近的点对。
2. 解析
可以划一条垂线,把点集分成两半:PL和PR。于是最近点对或者在PL中,或者在PR中,或者PL,PR各有一点。
把三种距离情况定义为dL, dR, dC.
其中dL, dR可以递归求解,于是问题就变为计算dC。
设s=min(dL, dR). 通过观察能得出结论:如果dC<s,则只需计算dC。如果dC满足这样的条件,则决定dC的两点必然在分割线的s距离之内,称之为带(strip)
否则不可能满足dC<s, 于是缩小了需要考虑的点的范围。
3. 设计
int ClosestPoints(int n, int x[ ], int y[ ]){
minDist=Double.POSITIVE_INFINITY;;
for (i=1; i< n; i++)
for (j=i+1; j<=n; j++)
{
d=(x[i]-x[j])* (x[i]-x[j])+(y[i]-y[j])* (y[i]-y[j]);
if (d< minDist) {
minDist=d;
index1=i;
index2=j;
}
}
return minDist;
}
4. 源码
https://github.com/Marshmello11/Algorithm/tree/master/Experiment_5