贪心选择性质
概述
贪心选择性质是指可以通过做出局部最优(贪心)选择来产生全局最优解的性质。这是贪心算法独有的核心性质,与最优子结构(动态规划和贪心算法共享)共同构成了贪心算法正确性的基础。验证贪心选择性质通常需要使用替换论证技术。
定义
贪心选择性质(Greedy-Choice Property)
一个最优化问题具有贪心选择性质,如果存在一个贪心策略,使得:
- 做出局部最优选择后
- 只剩下一个子问题需要求解
- 该选择与子问题的最优解组合在一起,构成原问题的全局最优解
形式化地,设 为贪心选择, 为最优解。若存在一个最优解 包含贪心选择 ,则问题具有贪心选择性质。
核心性质
1. 与最优子结构的区别
贪心选择性质和最优子结构是两个不同的性质:
- 最优子结构:最优解包含子问题的最优解(动态规划和贪心算法共享)
- 贪心选择性质:可以通过局部最优选择来达到全局最优(贪心算法独有)
一个问题可能具有最优子结构但不具有贪心选择性质。例如,0-1背包问题具有最优子结构,但不具有贪心选择性质(不能通过贪心选择得到全局最优解)。
2. 活动选择问题中的贪心选择性质(Theorem 15.1)
在 活动选择问题 中,贪心策略是”选择最早结束的活动”。
Theorem 15.1:考虑任意非空活动子集 (即与活动 兼容的所有活动),设 是 中结束时间最早的活动,则 包含在 的某个最大兼容子集中。
证明(替换论证):
- 设 是 的一个最大兼容子集, 是 中结束时间最早的活动
- 因为 是 中结束时间最早的活动,所以
- 因为 是兼容的且 是 中最早的,所以 中所有活动都与 兼容
- 由于 , 中所有活动也都与 兼容
- 因此,将 替换为 得到的 也是最大兼容子集
- 故 包含在某个最大兼容子集中
3. Huffman编码中的贪心选择性质(Lemma 15.2)
在 哈夫曼编码 中,贪心策略是”合并频率最低的两个字符”。
Lemma 15.2:设 为字母表, 中每个字符 的频率为 。设 和 是 中频率最低的两个字符,则存在 的一个最优前缀码,其中 和 的编码长度相同,且仅在最末一位不同。
证明(替换论证):
- 设 是一棵最优前缀码树, 和 是 中深度最大的两个叶节点(兄弟关系)
- 不失一般性,设 且
- 因为 和 是频率最低的两个字符,所以 且
- 交换 和 的位置:代价变化为 (因为 且 )
- 同理交换 和 的位置,代价不增
- 因此,将 和 放在最深层作为兄弟节点,仍然是最优的
4. 贪心选择性质 vs. 最优子结构
| 特征 | 贪心选择性质 | 最优子结构 |
|---|---|---|
| 所属算法 | 仅贪心算法 | 贪心 + 动态规划 |
| 含义 | 局部选择可以导向全局最优 | 最优解包含子问题的最优解 |
| 验证方法 | 替换论证 | 反证法(剪切-粘贴) |
| 子问题数量 | 通常只有1个 | 可能有多个 |
5. 贪心选择性质不成立的经典例子
- 0-1背包问题:选择单位价值最高的物品不保证全局最优
- 旅行商问题(TSP):选择最短的边不保证全局最优
- 最短路径 vs. 最长路径:最短路径具有贪心选择性质(Dijkstra算法),但最长路径不具有
章节扩展
- 15.1 活动选择问题 — 贪心选择性质的典型应用
- 15.2 贪心策略要素 — 贪心算法设计要素的系统总结
- 15.3 哈夫曼编码 — 另一个贪心选择性质的应用
- 替换论证 — 证明贪心选择性质的核心技术