Skip to content

贪心算法

Greedy algorithm

每一步作局部最优且不回溯选择的算法设计范式。

条目类型
原则

形式陈述

贪心算法维护一个可行的部分解,并反复按固定局部规则选择下一项;一旦选择便不回溯。它是一种算法设计范式,不是一条“取当前最好就会全局最好”的定理。一个完整贪心算法必须同时说明候选集合、可行性条件、选择次序与停止规则。

正确性通常归结为安全选择:在当前部分解下,存在某个全局最优解也包含贪心选中的下一项。证明这一点后,再把剩余部分视为同类子问题,才能递归或归纳地推出最终最优。交换论证、领先不变量和图上的割性质是实现这条主线的不同结构工具;列出工具名称本身并不构成证明。

直觉

贪心算法的表面动作是“现在就决定”,背后的证明图像却是“总能把一个最优解调整到同意这个决定”。若调整不会降低目标值,也不会破坏可行性,那么早期选择就没有封死通往最优解的道路。真正困难的部分不是找一个听起来合理的评分,而是发现问题中允许这种调整的结构。

动态规划通常保留多个可能影响未来的状态;贪心法只保留一条选择路径。少掉的那些状态必须由证明补回来:要么说明它们都可交换成当前路径,要么说明当前路径在每个前缀都不落后。没有这一步,简洁只是少搜索,并不意味着答案正确。

贪心选择的交换论证
例子与边界

无权区间调度要求选择最多个两两不重叠的区间。按结束时间从早到晚扫描,每次接受与已选区间兼容的第一个候选。设贪心首选区间为 g,任取一个最优解并记其最早结束的区间为 o。因为 g 的结束时间不晚于 o,用 g 替换 o 不会挤掉最优解中的后续区间,于是至少有一个最优解包含 g。删去与 g 冲突的候选后,同一论证可继续应用,这才完成正确性主线。

局部规则稍换就可能失败。硬币面额为 {1,3,4} 时,若目标是用最少硬币凑出 6,“每次取不超过余额的最大面额”得到 4+1+1,而最优解是 3+3。这个反例不是说所有硬币系统都不能贪心,而是说明面额集合没有自动提供所需交换结构。

若算法只写“选最小权候选”,却没有说明何时跳过会破坏可行性的候选,它还不是完整算法。若论证只展示若干输入成功,则只是测试;贪心正确性需要覆盖每一步和所有合法实例的结构证明。

推论与应用

设计贪心算法时,可以先用小实例攻击候选规则:让最早、最短、最便宜或收益最高的选择互相竞争,观察某个局部决定是否阻断更好的组合。规则经得住反例后,再寻找交换映射或前缀不变量;这个顺序常比先写伪代码更快暴露错误。

最小生成树的安全边由割性质证明,拟阵贪心则刻画一类对所有权重都能由贪心获得最优解的可行集系统。另一些问题只有可量化的近似保证,例如集合覆盖按单位新增覆盖成本选择集合。它们共享不可回溯的选择方式,却必须分别说明保证是精确最优还是近似比

参考资料
  • Thomas H. Cormen, Charles E. Leiserson, Ronald L. Rivest, and Clifford Stein, Introduction to Algorithms, 4th ed., MIT Press, 2022,Part III, greedy algorithms and matroid-style proofs。
  • Jon Kleinberg and Éva Tardos, Algorithm Design, Pearson, 2005,Ch. 4, greedy algorithms and exchange arguments。
关系图谱12 个相邻概念 · 1 类关系

拖动节点调整位置。

显示关系

显示:使用

类型化关系