"贪心....是好事,贪心是对的,贪心是成功的"
贪心算法(又称贪婪算法)是指,在对问题求解时总是做出在当前看来是最好的选择。不从整体最优上加以考虑,他所做出的仅是在某种意义上的局部最优解。贪心算法不是对所有问题都能得到整体最优解,但对范围相当广泛的许多问题他能产生整体最优解或者是整体最优解的近似解。
——即使一个贪心算法不能精确得到最优解,它也能够产生一个保证接近于最优解的解
分析风格
i)贪心算法领先概念
ii)交换论证
著名应用
图中的最短路径
最小生成树问题
实现数据压缩构造Huffman码
最小生成树与长期研究的聚类问题之间有趣关系
最小费用有向树问题
区间调度:贪心算法领先
区间调度问题:
我们有一组需求{1,2,..,n},第i个需求始于s(i)且止于f(i)的时间区间相对应
如果没有两个需求在时间上重叠,我们就说需求的子集是相容的
我们的目标是接受一个最大的相容子集:最优子集
贪心算法
初始 令R是所有需求的集合,设A为空 While R不空 选择一个有<strong>最小结束时间的需求i</strong>属于R 把i加到A中 从R中删除与需求i<strong>不相容</strong>的所有需求 Endwhile 返回集合A作为被接受的需求集合<em> </em>
A是一个相容的需求集——用i1,i2,..,in表示
易证
对所有指标r<=k,有f(i~r)<=f(j~r)——(设最优集合O用j1,j2,....,jn表示)
归纳,当i=1时显然成立
当f(i~r-1)<=f(j~r-1)时,f(j~r-1)<=s(j~r),所以f(i~r-1)<=s(j~r)
根据构造原理,j~r考虑在A集i~r构造中,所以f(i~r)<=f(j~r)
归纳成立
贪心算法返回一个最优的集合A
反证,如果A不是最优的(k个),那么O一定有更多的需求(m个)
设m>k,令r=k,由f(i~k)<=f(j~k),R非空,然而算法结束,矛盾
推广
i)动态调度:调度员在获悉全部需求集合之前做出接受或者拒绝某个需求的决定,
如果调度员为收集其他信息而话费过多时间,需求者可能会失去耐心放弃而离开
——在线算法,不断做决定
ii)加权调度:需求附加的价值(权),每个需求 i可能有一个vi值
——最后的目标是令∑vi最大
一个有关的问题:调度所有的区间
问题即用最少的行数(资源)覆盖所有的需求
区间集合的深度:通过时间线上任何一点的最大区间数
命题:在任何区间划分的实例中,资源数必须至少是区间集合的深度
易证
算法:
{1,2,...,d}为集合深度
任意打破区间的并列,根据开始时间排序 设I1,I2,.....,In为上述<strong>时间排序</strong> For j-1,2,...,n For 每个按照上述次序领先于Ij并且与它<strong>重叠</strong>的区间Ii,从对Ij的考虑中<strong>排除Ii</strong>的标签 Endfor If 在{1,2,...,d}中存在任何还没有被排除的标签 then分配一个没被排除的标签给Ij <em>Else 保留Ij不分配标签</em> Endif Endfor
命题:执行上述算法,每个区间将被分配一个标签,且没有两个重叠的区间接受同样的标签
1)先指出不会有区间在结束时分配不到标签,假设存在t个区间在次序上比它早且重叠,那么1+t<=d,于是t<=d-1,那么至少还有1个标签可以用
2)考虑任何两个重叠的区间,I时间次序上领先I‘,那么算法考虑I时候,I’已经被排除标签
定理:上述贪心算法使用与集合深度等量的资源为每个区间安排一个资源,这是所需资源的最优数量
最小延迟调度——一个交换论证
每个任务有最晚完成时间di,和需要持续的时间ti。
真实安排这些任务时,每个任务真实的开始时间si和结束时间fi。称一个任务的延迟时间为fi-di。
目的:找一个安排任务的方案,使所有任务的总的延迟最小。
设计算法:
1)按长度ti的次序顺序排列,短任务尽快结束——不妥
2)di-ti——有效松弛时间增长对任务排序——不妥
3)最早截止时间优先
分析算法:
交换论证——考虑一个最优调度O,逐步修改,每步确保其最优性,最终转化为最优调度
空闲时间——存在任务要做,机器却空闲,流失的时间
命题:
存在一个没有空闲时间的最优调度
命题:
所有没有逆序也没有空闲时间的调度有相同的最大延迟
定理:
存在一个既没有逆序也米有空闲时间的最优的调度
交换逆序,最大延迟不大于之前O的最大延迟
定理:
由这个贪心算法产生的调度A有最优的最大延迟