算法图解笔记——Chapter 8 greedy Algorithm
Author: Seven Zou
Email: zoushiqi0404@gmail.com
Language: Python2.7
8 贪婪算法
本章学习贪婪算法,这与自身的研究方向有些交叉,恰好利用这次学习来仔细研究一下算法。在优化问题中,背包问题、调度问题、集合覆盖问题等都属于经典问题。
8.1 教师调度问题
假设有如下课程表,希望将尽可能多的课程安排在某间教室上。这里就要同时考虑尽可能多且时间不冲突的课程。
针对算法逻辑如下:
- 1.选出结束最早的课,它就是要在这间教室上的第一堂课;
- 2.必须选择第一堂课结束后才开始的课。同样,选择结束最早的课,这将是要在这间教室上的第二堂课;
- 3.重复以上操作。
这就是贪婪算法的逻辑,每步都采取最优的做法。在优化中,也称为*每步都选择局部最优解,最终推广到全局最优解。
8.2 背包问题
假设你是个小偷,背着可装35磅物品的背包。目的是往背包中装入价值最高的物品。针对此问题逻辑可有:
- 窃取可装入背包的最贵商品;
- 再窃取还可装入背包的最贵商品。
- 重复操作。
但还需考虑重量问题。所以此时便不能获得最优解,而是近似最优解。
8.3 集合覆盖问题
假设有广播节目,要让全美50个州的听众都收听得到。需要决定在哪些广播台播出但同时广播台都需收取费用。
每个广播台都覆盖特定的区域,不同的广播台的覆盖区域可能重叠。
那么问题就转换成:如何找出覆盖全美50个州的最小广播台集合。那么算法的逻辑可以为:
- 列出每个可能的广播台集合,这称为幂集(power set)。可能的子集有 2 n 2^n 2n个
- 在这些集合中,选出覆盖全美50个州的最小集合。
那么问题出现了,这个执行逻辑下的运行时间是