问题描述
贪心方法试探
首先可以想到一些贪心方法,比如按执行时间排序做短作业优先的过程。我们分析它行不行,即尝试证明这种方法。
短作业优先的尝试证明
假设求出的处理序列有相邻两项projecti和projecti+1,按照约定,ti<ti+1。这两项交换不会影响其他项,所以只考虑这两项对自己的影响:
原来的延时二元组是(sum+ti−di,sum+ti+ti+1−di+1)
交换后的延时二元组是(sum+ti+1−di+1,sum+ti+ti+1−di)
其中sum=k=1∑i−1tk
但是每个数都加了sum,因为只研究大小关系,sum早晚会消掉,可以忽略。
那么能否证明max(ti−di,ti+ti+1−di+1)⩽max(ti+1−di+1,ti+ti+1−di)
从而证明这种贪心的正确性呢?
很不幸,不能。可以想办法构*例。
短作业优先的构*例研究
如果能够造两个项目满足下面不等式组⎩⎪⎪⎪⎪⎪⎪⎪⎪⎨⎪⎪⎪⎪⎪⎪⎪⎪⎧ti+ti+1−di+1⩾ti−diti+ti+1−di⩽ti+1−di+1ti⩽ti+1(约定条件)ti+ti+1−di+1⩾ti+1−di+1(ti非负自然满足)
的话,那原来的答案延时 ti+ti+1−di+1 就会变成 ti+1−di+1,从而变小。这样这种短作业优先的方法就不是最优的。
比如t1=1,d1=100,t2=2,d2=2这个样例就满足上面的不等式组,从而形成反例。
从反例不等式组推正确的贪心方法
如何让上面的反例不等式组无论如何也不可能满足呢?很自然发现只要保证di<di+1就行。
期限早优先法的证明
通过上面的推算已经能猜出这种改进方法八九不离十是对的,即按这种办法排序后,交换两项后答案不可能变小。
同样考虑相邻两项:
即能否证明max(ti−di,ti+ti+1−di+1)⩽max(ti+1−di+1,ti+ti+1−di)whendi⩽di+1
显然是可以的,因为此时一定存在
⎩⎪⎪⎪⎪⎨⎪⎪⎪⎪⎧ti+ti+1−di⩾ti−diti+ti+1−di⩾ti+ti+1−di+1max(ti+1−di+1,ti+ti+1−di)⩾ti+ti+1−di
所以交换一定不会让答案变小。
而且任何不安这种贪心的顺序的序列都能一步一步相邻两个符合次序的相邻对交换为逆序相邻对得到,就像冒泡排序。所以答案会随着这样的交换一点点变大。所以这种 期限早优先法是对的。
这就是证明过程。