秒懂算法 | 活动安排问题贪心算法
通过例子分析求解活动安排问题的最好贪心策略、展示按照贪心策略求解该问题的过程。
活动安排问题来源于实际,无论任何与时间分配有关的问题都要考虑:如何安排来达到占用公共资源最少且花费时间最短的要求。
活动安排问题:设有n个活动的集合C={1,2,…,n},其中每个活动都要求使用同一个资源(如会议室),而在同一时间内只能有一个活动使用该资源。每个活动i都有要求使用该资源的起始时间si和结束时间fi,且si<fi。如果选择了活动i使用会议室,那么它在半开区间[si, fi)内占用该资源。如果[si, fi)与[sj,fj)不相交,那么活动i与活动j是相容的。也就是说,当si≥fj或sj≥fi时,活动i与活动j相容。活动安排问题要求在所给的活动集合中选出最大的相容活动子集,也即尽可能选择更多的活动来使用资源。
01
问题分析——贪心策略
仔细审阅活动安排问题的已知条件和目标要求,我们得知:
(1) n个活动的集合C={1,2,…,n},即由活动编号组成的集合C。
(2) 活动i(i=1,2,…,n)的开始时间si。
(3) 活动i(i=1,2,…,n)的结束时间fi。
(4) 活动i(i=1,2,…,n)使用资源的时间fi-si。
(5) 活动i和活动j相容使用资源的条件:si≥fj或sj≥fi,如图2-1所示。
■ 图2-1 活动i和活动j相容示意
6) 满足相容条件的活动子集都是活动安排问题的解,含有活动个数最多的子集就是最优解。
(7) 问题目标:找集合C的最大相容子集,即最优解。
由此,要想实现问题的目标,在满足相容的条件下,我们讨论以下三种贪心策略:
(1) 开始时间早的活动优先安排。
(2) 结束时间早的活动优先安排。
(3) 使用时间短的活动优先安排。
那么,上述三种贪心策略哪个是最优的策略呢?我们看下面一个例子。
【例2-3】资源安排问题。
4个班级活动争用教室A,它们使用教室A的开始时间和结束时间如表2-1所示。
表2-1活动申请表
要求安排尽可能多的班级相容地使用教室A,该如何安排?
按照第一种贪心策略来安排,则1班使用教室A。
按照第二种贪心策略来安排,则2班先使用教室A,然后4班使用教室A。
按照第三种贪心策略来安排,则3班使用教室A。
通过简单对比,我们发现第二种贪心策略:结束时间早的活动优先安排是最佳策略。实际上,通过它们之间的关系:“结束时间=开始时间+使用时间”,我们可以推断:“开始时间越早,使用时间越短,则结束时间越早。”所以,结束时间早的活动优先安排的策略是最好的贪心策略。
02
实例构造
设有10个活动等待安排,这些活动的开始时间和结束时间如表2-2所示,用贪心算法找出满足目标要求的活动集合。
表2-2活动编号、开始时间和结束时间
第一步,将活动按照结束时间由小到大排序,排在第一位的2号活动被选择,如表2-3所示,结束时间为4。
表2-3第一阶段的贪心选择
第二步,在开始时间大于或等于4的活动集合中贪心选择,选3号活动,如表2-4所示,结束时间为7。
表2-4第二阶段的贪心选择
第三步,在开始时间大于或等于7的活动集合中贪心选择,选7号活动,如表2-5所示,结束时间为11。
表2-5第三阶段的贪心选择
第四步,在开始时间大于或等于11的活动集合中贪心选择,选10号活动,如表2-6所示,结束时间为14。此时,10号活动是最后一个位置的活动,算法结束。
表2-6第四阶段的贪心选择
该实例的解为(0,1,1,0,0,0,1,0,0,1),即安排的活动集合为{2,3,7,10}。
实例讲解
算法设计与分析(Python版)
精彩回顾
秒懂算法
下期预告
秒懂算法
哈夫曼编码贪心算法
Prim算法
Kruskal算法
选第二大元素的分治算法
快速排序算法中的分治思想
动态规划算法的基本思想
矩阵连乘问题
0-1背包问题的动态规划改进算法——跳跃点算法
子集树模型——0-1背包问题的回溯算法
满m叉树模型——图的m可着色问题的回溯算法
排列树模型——旅行商问题的分支限界法
最大网络流的增广路算法
蒙特卡罗算法
03
参考书籍
《算法设计与分析》
ISBN:9787302570721
定价:59.90元
04
精彩推荐