平面最近点对
方法:
暴力求解法
分治法
1.暴力求解法:已知集合S中有n个点,一共可以组成n(n-1)/2对点对,暴力求解法就是对这n(n-1)/2对点对逐对进行距离计算,通过循环求得点集中的最近点对
核心代码
double minn=123456;//minn用于存储最近点对之间的距离
int s1,s2;//存储最近点对的两个点编号
for(int i=1;i<n;i++)
for(int j=i+1;j<=n;j++){
double dis=D(i,j);//D(i,j)表示点i和点j之间的距离
if(dis<minn){//如果此两点间的距离小于当前最小距离就更新信息
minn=dis;
s1=i;
s2=j;
}
}
2.分治法
算法描述:
分治法的思想就是将S进行拆分,分为2部分求最近点对。算法每次选择一条垂线L,将S拆分左右两部分为SL和SR,L一般取点集S中所有点的中间点的x坐标来划分,这样可以保证SL和SR中的点数目各为n/2
这个方法可以用递归实现,对于当前状态下的垂线L,最近点对可能会有三种情况
<1>最近点对出现在L的左侧
<2>最近点对出现在L的右侧
<3>最近点对跨过L,即最近点对一个点在L左侧,一个点在L右侧
于是我们要先算出L左侧的最近点对和L右侧的最近点对,取这两个最近点对之间的距离较小值记为d,再从L向左右分别扩展长为d的距离,枚举在这一段范围内的点两两匹配,找到跨过L的最近点对再和d比较,这样就可以得到所有n个点中的最近点对了

浙公网安备 33010602011771号