上次的博客写到一半宿舍停电了。。。。然而今天想起来补充完的时候发现博客园并没有自动保存哦,微笑。
首先来看最近对问题,最近对问题描述的就是在包含n个端的集合中找到距离最近的两个点,当然问题也可以定义在多维空间中,但是这里只是跟随书上的思路实现了二维情况下的最近对问题。假设所有讨论的点是以标准的笛卡尔坐标形式(x,y)给出的,那么在两个点Pi=(Xi,Yi)和Pj=(Xj,Yj)之间的距离是标准的欧几里得距离:
d(Pi,Pj)=sqrt( (X1-X2)2+(Y1-Y2)2 )
蛮力法的思路就是计算出所有的点之间的距离,然后找出距离最小的那一对,在这里增加效率的一种方式是只计算点下标 i
使用蛮力法求平面中距离最近的两点
BruteForceClosetPoints(P)
//输入:一个n(n≥2)的点的列表P,Pi=(Xi,Yi)
//输出:距离最近的两个点的下标index1和index2
dmin
for i
for j
d
if d
dmin=d; index1=i; index2=j;
return index1,index2
该算法的关键步骤是基本操作虽然是计算两个点之间的欧几里得距离,但是求平方根并不是像加法乘法那么简单。上面算法中,开平方函数导数恒大于0,它是严格递增的,因此我们可以直接只计算(Xi-Xi)2+(Yj-Yj)2,比较d2的大小关系,这样基本操作就变成了求平方。平方操作的执行次数是:<