算法分析与设计实践(作业五):最近点对问题 [分治策略]
1. 问题
P为笛卡尔平面上n>1个点构成的集合,找出最接近的一对点(n=2^k)。
2. 解析
方法一:暴力
暴力,遍历所有的点的组合,寻找距离最近的点,但复杂度过高为O(n^2)。
方法二:分治
分治策略,递归求解子问题来得到最近点对问题的解。
- 把点集按x轴的坐标进行升序排列。
- 在2 <= n <= 3时采用蛮力算法,n > 3时,将n个点的点集分成大小为[n/2]的点集合S1和S2。
- 在S1、S2和划分线两侧寻找是否存在这样的一对点。
3. 分析
Pair(P){
if n<=3
蛮力算法求得的最小距离(距离公式)
Else
分成左右两段
将S的前⌈n/2⌉个点复制到S, 将S中余下的⌊n/2⌋个点复制到S2;
S1=Pair(lf)
S2=Pair(rt)
m=S[⌈n/2⌉-1].x //求分割线的值
将S中所有|x-m|<d的点复制到数组S[]
dmin=d2
for i=0 to num-2
k=i+1
while k<=num-1 and (s[k].y-s[i].y)2 < dmin
dmin=min((s[k].x-s[i].x)2+(s[k].y-s[i].y)2,dminsq)
k++
end if
return sqrt(dmin)
}
4. 设计
蛮力: O(n^2)
分治: O(nlog2n)