1. 算法原理
贪心算法是一种在每一步选择中都采取当前状态下最优(局部最优)的策略,从而希望最终得到全局最优解的算法。其核心思想是:“目光短浅” 地选择当前最优解,不回溯、不瞻前顾后。
示例:活动选择问题中,每次选择最早结束的活动,最终得到最多的活动安排。
2. 使用条件
贪心算法的有效性依赖于问题是否满足以下两个性质:
- 贪心选择性质:全局最优解可以通过一系列局部最优选择(贪心选择)达到。
- 最优子结构:问题的最优解包含其子问题的最优解。
反例:0-1 背包问题无法用贪心算法(因物品不可分割,局部最优可能导致全局次优)。
3. 设计思路
- 分解问题:将问题分解为多个步骤或选择点。
- 定义贪心策略:确定每一步的选择标准(如最小、最大、最短等)。
- 局部最优选择:在每一步中选择当前最优解,逐步构建全局解。
- 证明正确性:通过数学归纳法或交换论证,证明贪心策略能导致全局最优。
示例:哈夫曼编码中,每次合并权重最小的两个节点,生成最优前缀编码树。
4. 与分治算法、动态规划的对比
维度 | 分治算法 | 动态规划 | 贪心算法 |
---|---|---|---|
核心思想 | 分解为独立子问题,递归求解 | 分解为重叠子问题,存储中间解 | 每一步选当前最优,不回溯 |
子问题关系 | 子问题无重叠 | 子问题有重叠 | 无显式子问题分解 |
计算方式 | 自顶向下(递归) | 自底向上(迭代) | 自顶向下(无递归) |
存储需求 | 通常不需要额外存储 | 需要存储子问题解(表格) | 通常不需要额外存储 |
正确性依赖 | 问题可分治 | 最优子结构 | 贪心选择性质 + 最优子结构 |
典型应用 | 快速排序、归并排序 | 背包问题、最短路径(Floyd) | 活动选择、Dijkstra 算法 |
5. 算法总结
- 分治:将问题 “分而治之”,适合独立子问题。
- 动态规划:解决重叠子问题,通过存储避免重复计算。
- 贪心:直接选择当前最优,适合具备贪心选择性质的问题。
注意:贪心算法的效率通常较高(时间复杂度低),但需严格验证其正确性,避免局部最优陷阱。