对间距大小的贪心选择。

来源:互联网 发布:doss攻击软件 编辑:程序博客网 时间:2024/04/28 17:23

点区域覆盖的问题是这样的:
                        n个点排列在一直线上,设计一个算法,最少需要多少单位长度的闭区间线段才能完全覆盖这n个点。
算法设计如下:
                        首先计算各个相邻点之间的间距。先划一条线段覆盖整个点区域,如果此线段长度小于等于单位长度,则结束,反之,找出最大间距的两点,从中划开,继续观察划开的2个区域线段长度...直到所有线段都小于等于单位长度。
                     
这个问题选择的是对间距大小的贪心选择。

可本菜鸟想了半天也不知道怎么证明其正确性,求虾米指点一二,本人不甚感激。 

假设点的序列为x1,x2,x3......xn,且x1 <=x2 <x3 <=..... <=xn;

那么从x1开始,用一个单位长度的线段去覆盖,假设可以覆盖到xj;
那么下一次从x(j+1)开始用单位长度的线段去覆盖;

大致的伪代码如下:

count=0;
j=1;
for(i=1;i <=n;i++)
{
    if   (x[i]-x[j])> 1
    {
        count++;
        j=i+1;
    }
}
if   (i> =j)   count++;


可以证明是最优的:
1)假设以x1为起点的单位线段可以覆盖到xj,即xj-x1 <=1   and   x(j+1)-x1> 1;

2)再假设存在一个最优的覆盖法,该方法覆盖x1点的单位线段(假设为[x',y'])不以x1为起点,即x' <x1 <=y';
那么y' <=x'+1 <x1+1 <x(j+1);即该单位线段最多能覆盖到xj;

去除覆盖x1点的单位线段后,第一个方法剩下的区间   是   第二个最优的方法剩下的区间的子集;覆盖第一个方法剩下的区间需要的单位线段   不会   比   覆盖第二个最优的方法剩下的区间需要的单位线段   多;
所以   第一个方法用到的总的单位线段的个数   不多于   最优的覆盖法

证毕! 

 

原创粉丝点击