实验报告
课程名称 《算法分析与设计》
实验日期 2021年 4 月 12 日 至 2021年 4 月 18日
实验名称 实验五:最近对问题
实验地点 同组人员 无
-
问题
课本149页,用分治法解最近对问题,找出距离最近的两个点。 -
解析
分治法总体来说分为三个步骤:划分、求解子问题、合并。
当2<=n<=3,通过蛮力算法求解;当n>3,对所有的点按照坐标从小到大排序,利用点集在坐标方向的中位数m,在该处做一条垂线,将点集分为n/2和n/2两个子集P1和Pr,对左右两个部分分别求最近点对的距离d,然后进行合并。最近距离不一定存在于两个集合中,可能一个点在P1,一个点在Pr,而这两点间距离小于d。 -
设计
[核心伪代码]
Closest §{
if n<=3
返回蛮力算法求得的最小距离
else{
将P的前⌈n/2⌉个点复制到Pl
将P中余下的⌊n/2⌋个点复制到Pr
dl=efficientClosestPair(Pl)
dr=efficientClosestPair(Pr)
m=P[⌈n/2⌉-1].x
将P中所有|x-m|<d的点复制到数组s[0…num-1]
dminsq=d2
for i=0 to num-2
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++
return sqrt(dminsq)
} -
分析
[算法复杂度推导]
算法时间复杂度为O(nlog2n)。
-
[github源码地址]
https://github.com/zjk715/–homework