圆排列问题

  1. 问题
    给定n个圆的半径序列,将它们放到矩形框中,各圆与矩形底边相切,求具有最小排列长度的圆排列。
  2. 解析
    该问题是一个排列问题,问题的解存储在序列r={r1,r2,r3…}中,问题的解空间树是一颗排列树。用x={x1,x2,x3…}表示当前排列的各个圆的圆心。
    下界函数:用Center(t)计算新增圆的圆心,每次新增一个圆则排列的序列会增长,比较center(t)+r[t]+r[0]这个值(注意不是序列中总长,只是t号圆的最右端的长度)和已知序列长度min比较,如果大于min则剪枝。
    在这里插入图片描述
    用compute计算整个序列的长度,遍历每一个圆,记录左端low和右端high,迭代得到low的最小值和hight的最大值,最后做差即可得到序列长度。
  3. 设计
    float center(int t)
    {
    float res=0;
    for(int i=0;i<t;i++)
    {//(rt+rj)2-(rt-rj)2=4rjrt
    float temp=x[i]+2.0*sqrt(r[t]*r[i]);
    if(temp>res) res=temp;
    }
    return res;
    }
    void compute()
    {
    float low=0,high=0;
    for(int i=0;i<n;i++)
    {
    float tempLow=x[i]-r[i];
    float rempHigh=x[i]+r[i];
    if(tempLow<low) low=tempLow;
    if(rempHigh>high) high=rempHigh;
    }
    if(high-low<minx) minx=high-low;
    }
  4. 分析
    时间复杂度:对于排列树,共有n!次计算;另外在每次计算圆心的过程中有O(n)次计算时间,因此整体算法时间复杂度为T(n)=O((n+1)!)
  5. 源码
    https://github.com/CunHua-YYT/CunHua-YYT/blob/master/CircleSort.cpp
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值