《算法分析与设计》作业5----最近点对问题(分治策略)

目录

 

1.问题

2.解析

3.设计

4.分析

5.源码


1.问题

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

 

2.解析

思路一(蛮力算法)

求两点最短距离最直观的方法就是蛮力算法

两层循环遍历两点的所有可能组合,记录最短的距离

但复杂度过高(O(n^2)),效率较低

 

思路二(分治策略)

把点集P按x轴坐标升序排序(课本上说把P复制到Q,Q按y轴升序,算法可以更方便,我需要研究一下)

2<=n<=3时,采用蛮力算法

 n>3时,在点集x轴方向上的中位数m处画一条垂线,将点集分成大小分别为⌈n/2⌉和⌊n/2⌋的两个子集Pl和Pr。然后通过递归求解子问题Pl和Pr来得到最近点对问题的解。其中dl和dr分别表示在Pl和Pr中的最近对距离,并定义d=min(dl,dr)。如下图所示:

   

        但实际最近点对可能在垂线两侧,所以还需要检查是否存在这样的点。为此,可以以垂线为中心线,在宽度为2d的范围中检查。如下图所示:

   

 

3.设计

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)

}

 

4.分析

        无论将问题划分成两个规模减半的子问题,还是合并子问题的解,该算法都只需要线性时间,因此,得到算法运行时间的递归式为:

        时间复杂度为O(nlogn)

 

        下面给出由递归式推出时间复杂度的过程:

                那个紧的界化不来,暂时不推了叭

 

5.源码

GitHub地址

  • 2
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值