1.问题
最近点对问题,即平面上有n个点P1,P2,…,Pn,n>1,Pi的直角坐标为(Xi,Yi),i=1,2,…,n.求距离最近的两个点及他们之间的距离。
2.解析
分治法总体来说分为三个步骤:划分、求解子问题、合并
这题的思路是,将集合S分为左右两个子集S1和S2,两个子集分别含有n/2个点,先在每个子集中递归地求其最接近的点对,再求最近的两点分别在两个集合中的点对,最后比较得出对短距离。
3.设计
算法 Efficientclosestpair(P,Q)∥使用分治算法来求解最近点对问题
输入:数组P中存储了平面上的n≥2个点,并且按照这些点的x轴坐标升序排列
数组Q存储了与P相同的点,只是它是按照这点的y轴坐标升序排列
输出:最近点对之间的欧几里得距离
If(n≤3)
返回由蛮力算法求出的最小距离
else
将P的前「n/2˥ 个点复制到P1
将Ω的前「n/2˥ 个点复制到Q1
将P中余下的⎣Ln/2」个点复制到Pr
将中余下的⎣n/2」个点复制到Qr,
dl←Efficientclosestpair(P1, Q1)
dr ←Efficientclosestpair(Pr, Qr)
d←min{dl, dr}
m ←P[「n/2˥ -1 ].x
将Q中所有|x-m|<d的点复制到数组S[0..num-l]
dminsq ←d^2
for i←0 to (num-2) do
k←i+1
while k<= num-1 and (S[k].y-S[i].y)^2 < dminsq
dminsq ← min(S[k].x-S[i].x)^2+( S[k].y-S[i].y)^2, dminsq)
k←k+1
return sqrt(dminsg)
4.分析
利用分治法求最近点对与归并排序的结构上的相同,故时间复杂度为O(nlogn)