贪心选择性质

概述

贪心选择性质是指可以通过做出局部最优(贪心)选择来产生全局最优解的性质。这是贪心算法独有的核心性质,与最优子结构(动态规划和贪心算法共享)共同构成了贪心算法正确性的基础。验证贪心选择性质通常需要使用替换论证技术。

定义

贪心选择性质(Greedy-Choice Property)

一个最优化问题具有贪心选择性质,如果存在一个贪心策略,使得:

  1. 做出局部最优选择后
  2. 只剩下一个子问题需要求解
  3. 该选择与子问题的最优解组合在一起,构成原问题的全局最优解

形式化地,设 为贪心选择, 为最优解。若存在一个最优解 包含贪心选择 ,则问题具有贪心选择性质。

核心性质

1. 与最优子结构的区别

贪心选择性质和最优子结构是两个不同的性质:

  • 最优子结构:最优解包含子问题的最优解(动态规划和贪心算法共享)
  • 贪心选择性质:可以通过局部最优选择来达到全局最优(贪心算法独有)

一个问题可能具有最优子结构但不具有贪心选择性质。例如,0-1背包问题具有最优子结构,但不具有贪心选择性质(不能通过贪心选择得到全局最优解)。

2. 活动选择问题中的贪心选择性质(Theorem 15.1)

活动选择问题 中,贪心策略是”选择最早结束的活动”。

Theorem 15.1:考虑任意非空活动子集 (即与活动 兼容的所有活动),设 中结束时间最早的活动,则 包含在 的某个最大兼容子集中。

证明(替换论证):

  1. 的一个最大兼容子集, 中结束时间最早的活动
  2. 因为 中结束时间最早的活动,所以
  3. 因为 是兼容的且 中最早的,所以 中所有活动都与 兼容
  4. 由于 中所有活动也都与 兼容
  5. 因此,将 替换为 得到的 也是最大兼容子集
  6. 包含在某个最大兼容子集中

3. Huffman编码中的贪心选择性质(Lemma 15.2)

哈夫曼编码 中,贪心策略是”合并频率最低的两个字符”。

Lemma 15.2:设 为字母表, 中每个字符 的频率为 。设 中频率最低的两个字符,则存在 的一个最优前缀码,其中 的编码长度相同,且仅在最末一位不同。

证明(替换论证):

  1. 是一棵最优前缀码树, 中深度最大的两个叶节点(兄弟关系)
  2. 不失一般性,设
  3. 因为 是频率最低的两个字符,所以
  4. 交换 的位置:代价变化为 (因为
  5. 同理交换 的位置,代价不增
  6. 因此,将 放在最深层作为兄弟节点,仍然是最优的

4. 贪心选择性质 vs. 最优子结构

特征贪心选择性质最优子结构
所属算法仅贪心算法贪心 + 动态规划
含义局部选择可以导向全局最优最优解包含子问题的最优解
验证方法替换论证反证法(剪切-粘贴)
子问题数量通常只有1个可能有多个

5. 贪心选择性质不成立的经典例子

  • 0-1背包问题:选择单位价值最高的物品不保证全局最优
  • 旅行商问题(TSP):选择最短的边不保证全局最优
  • 最短路径 vs. 最长路径:最短路径具有贪心选择性质(Dijkstra算法),但最长路径不具有

章节扩展

参见