问题描述
在二维平面的N个点中,用分治法找出距离最近的一对点
解析
可以采取蛮力法和分治法,虽然这篇博客要讲的是分治法,但是也要提一下蛮力法
蛮力法
这种方法要计算每一对点的距离,避免同一对点计算两次,只考虑点的下标符合i<j的情况,这样要计算n(n-1)次,复杂度为O(n^2)。
分治法
分治法解决该问题,就是把平面上点的集合P先按照x轴坐标升序排列,为了更加方便,还可以按照点的y轴坐标在另一个列表中升序排列,这个列表示为Q。
当2<=N<=3时,这个问题可以用蛮力法求解
当n>3
- 可以利用点集在x轴方向上的中位数m,在该处做一条垂线,将点集分成大小分为左右两部分
- 分别求得两边的最短距离d1,d2
- 取两者中的最小者记为d,在中线两边分别取d的距离,记录该距离范围内点的个数,左边L个,右边R个
- 分别将两边的点按照y坐标升序排列
- 在左边集合中每个点,找右边集合的点,找与之距离小于d的点更新距离
- 循环直到结束,即可求出最短距离
设计
伪代码
EfficentClosestPair(P,Q)
//使用分治法求解
//输入:数组P中存储了平面上n>=2个点,并且按照这些点的x轴坐标升序排序
// 数组Q中存储了与P相同的点,它按照这些点的y轴