贪心算法解决什么问题?
- 定义: 分步决策的算法, 在每个决策阶段选择当前看起来最优的解;
- 期望: 局部最优的累积能导出全局最优;
- 代价: 每步只做一次选择, 通常时间与空间都优于动态规划;
- 风险: 局部最优不保证全局最优, 必须验证问题具备贪心性质;
贪心算法需要哪两个性质?
- 贪心选择性质: 全局最优解可以通过一系列局部最优选择得到;
- 最优子结构: 问题的最优解包含其子问题的最优解;
- 与动态规划的区别: 动态规划会保留所有子问题的解再比较, 贪心只保留当前一个选择且不回退;
- 判定方法: 尝试用交换论证证明"任何最优解都能替换为含当前贪心选择的最优解";
贪心的解题思路分哪几步?
- 转换: 作出当前选择, 再把剩余部分视为同构的子问题;
- 贪心选择性质: 定义"当前最优"的判据, 例如取最大、取最小、取差值最大;
- 最优子结构: 说明局部最优如何合成全局最优;
- 实现: 多数贪心只需一次线性扫描加若干变量, 不需要递归;
如何用交换论证验证贪心策略?
- 形式: 假设存在最优解 O 不含贪心选择 g;
- 替换: 构造 O′=O−x+g, 证明 O′ 依然可行且不劣于 O;
- 结论: 若替换总能成立, 则贪心选择安全;
- 应用: 分发糖果的两次遍历、加油站的起点跳过都可用该论证说明;
- 实例: 见 贪心的经典应用;