实验5-算法设计

实验报告介绍了《算法分析与设计》课程中关于寻找平面上n个点的最小距离点对的算法。采用分治法思想,通过递归地在两个子集中找到最接近点对,并进行合并步骤。具体实现中,对点进行排序并比较,最终得到最小距离。算法的时间复杂度为O(nlogn)。提供了源码链接以供参考。
摘要由CSDN通过智能技术生成

实验报告

课程名称 《算法分析与设计》 实验日期 2021 年 4 月 12 日 至 2021 年 4 月 19日
学生姓名 石晨昊 所在班级 计算机194 学号 2019212212322
实验名称 最小对算法
实验地点 同组人员

1.问题
给定平面上n个点,找其中的一对点,使得在n个点的所有点对中,该点对的距离最小。严格地说,最接近点对可能多于1对。为了简单起见,这里只限于找其中的一对。
2.解析
采用分治法思想,考虑将所给的n个点的集合S分成2个子集S1和S2,每个子集中约有n/2个点,然后在每个子集中递归地求其最接近的点对。在这里,一个关键的问题是如何实现分治法中的合并步骤,即由S1和S2的最接近点对,如何求得原集合S中的最接近点对,因为S1和S2的最接近点对未必就是S的最接近点对。

3.设计

double mindist(int l,int r)
{
    double d=INF;
    if(r==l)
        return d;
    if(r-l==1)
        return dist(p[l],p[r]);
    if(r-l==2)
        ret
    int k=0;
    for(int i=l;i<=r;i++)
        if(fabs(p[i].x-p[mid].x)<=d)
        {
            tmp[k++]=p[i];
            if(k>5) break;//最多只有6个点
        }
    std::sort(tmp,tmp+k,cpy);
    for(int i=0;i<k;i++)
        for(int j=i+1;j<k&&tmp[j].y-tmp[i].y<d;j++)
        {
            double t=dist(tmp[i],tmp[j]);
            if(t<d) d=t;
        }

    return d;
}

4.分析
T(n)=O(nlogn)。
5.源码
https://github.com/695950719/Algorithm-design/blob/main/lab5.cpp

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值