寻找最近点对算法一般而言需要O(n^2)的时间复杂度,即枚举法,分别计算每两个点对之间的距离,取最小。
但是还有一种分治算法理论上可以将时间复杂度减小到O(n.log n)的级别。但是由于递归的开销,可能效果并不一定好,具体还要看问题特点。
算法描述:
①若问题规模小于3,直接枚举法求解。
②否则,将点集按照x坐标排序,取中间点。
③以中间点的xm坐标为边界,左右分别递归求解,得到左右最短距离
④取左右两边递归结果的最小值a,取出x坐标在xm-a到xm+a之间的点集
⑤对于中间区域的点集,按照y坐标排序
⑥对于每一个点,依次计算y坐标比它大的7个点,计算最小距离。
⑦将中间区域的最小距离与a比较,取最小值返回。
下面是java代码:
/**
* @param pointList