经典贪心:最大延时最小问题

问题描述

在这里插入图片描述

贪心方法试探

首先可以想到一些贪心方法,比如按执行时间排序做短作业优先的过程。我们分析它行不行,即尝试证明这种方法。

短作业优先的尝试证明

假设求出的处理序列有相邻两项 p r o j e c t i project_i projecti p r o j e c t i + 1 project_{i+1} projecti+1,按照约定, t i < t i + 1 t_i<t_{i+1} ti<ti+1。这两项交换不会影响其他项,所以只考虑这两项对自己的影响:
原来的延时二元组是 ( s u m + t i − d i , s u m + t i + t i + 1 − d i + 1 ) (sum+t_i-d_i ,\quad sum+t_{i}+t_{i+1}-d_{i+1}) (sum+tidi,sum+ti+ti+1di+1)
交换后的延时二元组是 ( s u m + t i + 1 − d i + 1 , s u m + t i + t i + 1 − d i ) (sum+t_{i+1}-d_{i+1} ,\quad sum+t_i+t_{i+1}-d_i) (sum+ti+1di+1,sum+ti+ti+1di)
其中 s u m = ∑ k = 1 i − 1 t k sum=\sum_{k=1}^{i-1}t_k sum=k=1i1tk
但是每个数都加了sum,因为只研究大小关系,sum早晚会消掉,可以忽略。
那么能否证明 m a x ( t i − d i , t i + t i + 1 − d i + 1 ) ⩽ m a x ( t i + 1 − d i + 1 , t i + t i + 1 − d i ) max(t_i-d_i ,\quad t_{i}+t_{i+1}-d_{i+1}) \leqslant max(t_{i+1}-d_{i+1} ,\quad t_i+t_{i+1}-d_i) max(tidi,ti+ti+1di+1)max(ti+1di+1,ti+ti+1di)
从而证明这种贪心的正确性呢?
很不幸,不能。可以想办法构造反例。

短作业优先的构造反例研究

如果能够造两个项目满足下面不等式组 { t i + t i + 1 − d i + 1 ⩾ t i − d i t i + t i + 1 − d i ⩽ t i + 1 − d i + 1 t i ⩽ t i + 1 ( 约 定 条 件 ) t i + t i + 1 − d i + 1 ⩾ t i + 1 − d i + 1 ( t i 非 负 自 然 满 足 ) \left\{ \begin{array}{l} t_{i}+t_{i+1}-d_{i+1} \geqslant t_i-d_i\\\\ t_i+t_{i+1}-d_i \leqslant t_{i+1}-d_{i+1}\\\\ t_i \leqslant t_{i+1}(约定条件)\\\\ t_{i}+t_{i+1}-d_{i+1} \geqslant t_{i+1}-d_{i+1}(t_i非负自然满足) \end{array} \right. ti+ti+1di+1tiditi+ti+1diti+1di+1titi+1()ti+ti+1di+1ti+1di+1(ti)
的话,那原来的答案延时 t i + t i + 1 − d i + 1 t_{i}+t_{i+1}-d_{i+1} ti+ti+1di+1 就会变成 t i + 1 − d i + 1 t_{i+1}-d_{i+1} ti+1di+1,从而变小。这样这种短作业优先的方法就不是最优的。
比如t1=1,d1=100,t2=2,d2=2这个样例就满足上面的不等式组,从而形成反例。

从反例不等式组推正确的贪心方法

如何让上面的反例不等式组无论如何也不可能满足呢?很自然发现只要保证 d i < d i + 1 d_i<d_{i+1} di<di+1就行。

期限早优先法的证明

通过上面的推算已经能猜出这种改进方法八九不离十是对的,即按这种办法排序后,交换两项后答案不可能变小。
同样考虑相邻两项:
即能否证明 m a x ( t i − d i , t i + t i + 1 − d i + 1 ) ⩽ m a x ( t i + 1 − d i + 1 , t i + t i + 1 − d i ) w h e n d i ⩽ d i + 1 max(t_i-d_i ,\quad t_{i}+t_{i+1}-d_{i+1}) \leqslant max(t_{i+1}-d_{i+1} ,\quad t_i+t_{i+1}-d_i)\\when \quad d_i \leqslant d_{i+1} max(tidi,ti+ti+1di+1)max(ti+1di+1,ti+ti+1di)whendidi+1
显然是可以的,因为此时一定存在
{ t i + t i + 1 − d i ⩾ t i − d i t i + t i + 1 − d i ⩾ t i + t i + 1 − d i + 1 m a x ( t i + 1 − d i + 1 , t i + t i + 1 − d i ) ⩾ t i + t i + 1 − d i \left\{ \begin{array}{l} t_i+t_{i+1}-d_i \geqslant t_i-d_i\\\\ t_i+t_{i+1}-d_i \geqslant t_{i}+t_{i+1}-d_{i+1}\\\\ max(t_{i+1}-d_{i+1} ,\quad t_i+t_{i+1}-d_i) \geqslant t_i+t_{i+1}-d_i \end{array} \right. ti+ti+1ditiditi+ti+1diti+ti+1di+1max(ti+1di+1,ti+ti+1di)ti+ti+1di
所以交换一定不会让答案变小。
而且任何不安这种贪心的顺序的序列都能一步一步相邻两个符合次序的相邻对交换为逆序相邻对得到,就像冒泡排序。所以答案会随着这样的交换一点点变大。所以这种 期限早优先法是对的。
这就是证明过程。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值