分治算法-最邻近点问题Finding the closest pair of points

问题描述:

输入:空间平面上点集Q             输出:距离最近的两个点对

问题简化:如果是在一个直线上找最近的点对,则可以使用排序,之后找最近最近点。

分治思路:

Divide 将其划分为两个部分Q1,Q2   T(n) = O(n)

Conquer 分别找最近点对,   T(n) = 2T(n/2)

Merge 比较分开点附近的两个点距离和找出的的距离T(n)= O(n)

时间复杂度:T(n)=O(1)    n=2

                       T(n)=2T(n/2)+O(n)=O(nlogn)  n≥3


二维空间问题:

Divide阶段和Conquer阶段都和一维问题类似,使用x=m的直线划分为两个子部分,可以找出最近点对,

令d=min{,},则merge阶段的点一定在[m-d,m+d]范围内。

似乎是优化很多,但是最糟糕的的情况是在该范围内的点很多则对应起来还是会有n^2级复杂度。

更优化的方案:对一个点,在令一侧距离其小于d的点最多有6个。具体说明如下

如图,在L:x=m左侧区域中的点P(x0,y0),则距离其小于d的点在以P的圆心,半径为d的圆内,

则在L:x=m右侧的部分圆一定在以(m,y0-d)为左下角顶点,(m+d,y0+d)为右上角顶点的矩形内,即图中红色矩形区域内。


在对该矩形进行分6块,长为2d/3,宽为d/2,则每个小矩形的内的点最长距离为5d/6(对角线),即每个小矩形最多有一个点。

因为如果有两个点在同一个矩形则其最小距离不会是d。

因此对[m-d,m+d]范围内每个顶点最多有6个点需要判断。

需要注意的事项:

1.      要设定好数据结构便于处理

2.      要进行预处理,对点集分别按x,y排序,维护两个排序排序结合。

时间复杂度:T(n)=O(1)    n=2

                        T(n)=O(n)+2T(n/2)+O(n)=O(nlogn)  n≥3




你可能感兴趣的:(算法)