5.5.1 最近对问题
【问题】最近对问题(nearest points problem)要求在包含n个点的集合中找出距离最近的两个点。严格地讲,距离最近的点对可能多于一对,简单起见,只找出其中的一对即可。
应用实例
在空中交通控制问题中,若将飞机作为空间中移动的一个点来处理,则具有最大碰撞危险的两架飞机,就是这个空间中最接近的一对点。这类问题是计算几何中研究的基本问题之一。
【想法】 简单起见,只考虑二维的情况,假设所讨论的点以标准笛卡儿坐标形式给出,两个点pi=(xi,yi)和pj=(xj,yj)之间的距离是欧几里得(Euclidean distance)距离:
【算法】 蛮力法求解最近对问题的过程是显而易见的:分别计算每一对点之间的距离,然后找出距离最小的那一对。为了避免对同一对点计算两次距离,可以只考虑iくj 的点对(pi,pj)。在求欧几里得距离时,可以免去求平方根操作,因为如果被开方的数越小,则它的平方根也越小。
【算法实现】 设数组x[n]和y[n]存储n个点的坐标,函数 ClosestPoints 的形参index1 和 index2 以传引用形式接收最近点对的下标,假设最大距离不超过1000,程序如下。
#include <iostream>
using namespace std;
int ClosestPoints(int x[