作业555

实验报告

课程名称 《算法分析与设计》
实验日期 2021年 4 月 12 日 至 2021年 4 月 18日

实验名称 实验五:最近对问题
实验地点 同组人员 无

  1. 问题
    课本149页,用分治法解最近对问题,找出距离最近的两个点。

  2. 解析
    分治法总体来说分为三个步骤:划分、求解子问题、合并。
    当2<=n<=3,通过蛮力算法求解;当n>3,对所有的点按照坐标从小到大排序,利用点集在坐标方向的中位数m,在该处做一条垂线,将点集分为n/2和n/2两个子集P1和Pr,对左右两个部分分别求最近点对的距离d,然后进行合并。最近距离不一定存在于两个集合中,可能一个点在P1,一个点在Pr,而这两点间距离小于d。

  3. 设计
    [核心伪代码]
    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)
    }

  4. 分析
    [算法复杂度推导]
    算法时间复杂度为O(nlog2n)。
    在这里插入图片描述

  5. [github源码地址]
    https://github.com/zjk715/–homework

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值