算法分析与实践作业五
1. 问题
已知一平面上共有n个点,求距离最近的两个点间的距离。
2. 解析
分解:
已知集合S中有n个点,分治法的思想就是将S进行拆分。对所有的点按照x坐标(或者y)从小到大排序。根据下标进行分割,使得点集分为两个集合。算法每次选择一条垂线L,将S拆分左右两部分为SL和SR。依次找出这两部分中的最小点对距离:δL和δR,记SL和SR中最小点对距离dis = min{δL,δR}。
合并(算法核心步骤):
那么一个点在集合A,一个在集合B中的情况,可以针对此情况,用之前分解的标准值,即按照x坐标(或者y)从小到大排序后的中间点的x坐标作为mid,划分一个[mid−dis,mid+dis][mid-dis,mid+dis] [mid−dis,mid+dis]区域,如果存在最小距离点对,必定存在这个区域中。
3. 设计
EfficientClosestPair(P,Q)
//使用分治算法来求解最近点对问题
//输入:数组P中存储了平面上的n>=2个点,并且按照这些点的x轴坐标升序排列
//数组Q存储了与P相同的点,只是它是按照这点的y轴坐标升序排列
//输出:最近点对的欧几里得距离
if n<=3
返回由蛮力算法求出的最小距离
else
将P的前[n/2]个点复制到P1
将Q的前[n/2]个点复制到Q1
将P的余下的[n/2]个点复制到Pr
将Q的余下的[n/2]个点复制到Qr
d1<- EfficientClosestPair(P1,Q1)
dr<- EfficientClosestPair(Pr,Qr)
d<-min{d1,dr}
m<-P[⌈n/2 ⌉-1].x
将Q中所有|x-m|<d的点复制到数组S[0..num-1]
dminsq<-d*d
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(dminsq)
4. 分析
时间复杂度O(nlog2n)

5. 源码
github地址:https://github.com/122cmy/myGitTemp5
博客地址:https://www.cnblogs.com/122cmy/

浙公网安备 33010602011771号