问题
设S是平面上n>1个点构成的集合,假设集合中的每个点都不一样,最近对问题就是找出集合S中距离最近的点对。
解析
当n大于等于2小于等于3时,问题可以通过蛮力算法求解;当n大于3时,可以将集合分成两个子集S1和S2,然后通过递归求解子问题S1和S2来得到最近对问题的解。
设计
输入:按x坐标升序排列的n(n>1)个点的集合S={(x1,y1 ),(x2,y2 )…y.n)
输出:最近点对的距离
如果n等于2,则返回(x1,y1 )和(x2,Y2 )之间的距离,算法结束;
划分:m=S中各点x坐标的中位数;
d1 =计算{(x1,y1 )… (xmYm )}的最近对距离; ——递归调用
d2 =计算{(xmYm … (xm,Yn )}的最近对距离; ——递归调用
d = min {d1, d2};
依次考察集合S中的点p(x,y),如果(x<= xm并且x>= xm-d),则将点p放入集合P1中; 如果(x> xm并且x<=xm +d),则将点p放入集合中P2;
将集合P1和P2按y坐标升序排列;
对集合P1和P2中的每个点p(x,y),在y坐标区间[y,y + d]内最多取出8个候选
点, 计算与点p的最近距离d3;
返回min {d, d3};
分析
时间复杂度为O(nlogn)
源码
https://github.com/yaoshuangice/yaoshuang