一、贪心算法
定义:一个算法是贪心算法,如果它是通过一些小的步骤来一个求解,并且在每一步根据局部情况选择一个决定,使得某些主要的指标得到优化。
二、区间调度问题
1. 问题:我们有一组需求{1,2,3,......,N},第i个需求与一个开始时间s(i),结束时间f(i)相对应。如果没有两个需求在时间上重叠,我们就说需求的子集是相容的。
2. 目标:寻找一个最大的相容子集O.
3. 算法:
初始令R是所有需求的集合,设A为空
While ( |R| > 0 )
选择一个最早结束的需求
把i加入到A中
在R中删除所有与i不相容的需求
End
返回集合A作为被接受的需求的集合
算法规则:该贪心算法的规则是,每一步选择一个最早结束的需求,尽快释放资源。
4. 证明算法的正确性:
假设O是最优解,由于最优解可能有多个,所以,我们只需要证明|A|=|O|,既证明集合A与集合O包含的需求个数相等。显然,A,O都是相容的,既A,O中的任意两个需要都不会重叠。
算法思想:该证明主要是想找出这样一种认识,我们的贪心算法“领先”于这个最优解O. 我们把贪心算法构造的部分解与最优解O初始的一段进行比较,并且证明贪心算法以一步接一步的方式做的更好。
假设,A = { i1,i2,......,ik }, O = { j1,j2,......,jm } ,既我们要证明k=m;同时&