最近对问题

最近对问题:P为笛卡尔平面上n>1个点构成的集合,求最近的两个点的距离(n=2k)。

1.解析
1)蛮力算法:
两层遍历,将每个点与其他点进行计算,求得最短的距离,复杂度较高,效率低。
2)分治算法:
把点集P(点个数为n)按照x轴升序排序。当n<=3时,使用蛮力算法;当n>3时,将点集分为左右大小为⌈n/2⌉和⌊n/2⌋的子集Pl和Pr,通过递归调用每次将子集一分为二,求得子集中的最短距离,最后通过递归求得整个点集的最短距离。其中dl和dr分别表示在Pl和Pr中的最近对距离,并定义d=min(dl,dr)。
最近点对还可能在垂线两侧,需检查是否存在这样的点,应在宽度为2d的范围中检查。

2.设计
efficientClosestPair( P ){
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)
}

3.分析
蛮力算法:复杂度O(n2)
分治算法:复杂度W(n)=2W(n/2)+O(n)
W(n)=O(nlogn)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值