计科2301李昭熹
1. 反证法证明贪心选择性质
给定一个数组A=a1.....an,通过选择一些元素,使得它们满足某些条件(例如:不相邻),并且我们希望选择的元素的某种总和最大化。贪心策略:每次选择数组中的某个“最优”元素,例如选择当前未被选择的最大元素或符合某种条件的最优元素,并将其加入到当前解中。使用反证法来证明“删数问题”算法满足贪心选择性质,即贪心选择的解一定是最优解。
-
假设最优解不包含贪心选择: 假设最优解 S不包含贪心选择的元素。假设我们按贪心算法的选择顺序,首先选择了元素 x,但最优解best里并没有选择这个元素。
-
选择一个与贪心选择相同的最优解: 我们将最优解S中的一个元素(记为 y)替换为贪心选择的元素x,并构造一个新的解 'S'
- 新解 'S' 就是将best 中的元素 y替换为 x 后得到的解。即 ′S′ 中的元素包括 S 中的所有元素,除了y 外,再加上 x。
-
检验新的解是否更优:
- 如果替换后的新解 ′S′ 更优,即其总和或其他性质更好(取决于题目设定),那么我们就得到了一个比最优解更好的解,这与最优解的定义矛盾。
- 如果替换后的解 ′S′ 仍然与 S 相等(即没有改善),则表明贪心选择并没有导致错误的选择,实际上它是合理的。
-
结论:
-
由于通过替换过程没有得到更优解(或者没有破坏最优解),则可以推出,最优解中一定包含贪心选择的元素,否则我们就能通过上述替换得到更好的解,形成矛盾。
-
因此,可以得出结论:如果最优解不包含贪心选择的元素,那么可以通过替换得到一个更优的解,从而推翻最优解不包含贪心选择的假设。
-
2. 结合本章的学习,总结对贪心法的体会和思考
贪心算法是一种简单而有效的算法设计策略,它通过在每一步做出当前最优选择(即局部最优解),通过一系列的局部最优选择,最终得到一个全局最优解。贪心法的核心思想是“从局部最优推到全局最优”,但这种方法并不适用于所有问题。因此,在使用贪心法时,需要仔细考虑问题是否符合贪心法的适用条件。下面是我对贪心法的一些体会和思考:
1. 贪心法的基本特性
- 简单直观:贪心算法的最大优点是实现简单,逻辑清晰。在每一步选择中,我们只关心当前状态下的最优解,而不需要考虑未来可能发生的情况。
- 局部最优性:贪心法的核心思想是每一步都做出局部最优的选择,期望这些局部最优解的累积能得到全局最优解。
- 贪心选择性质:为了保证贪心法能获得全局最优解,问题必须具有“贪心选择性质”和“最优子结构”两个特征。如果问题不具备这些特性,贪心法就不一定能得到最优解。
2. 何时使用贪心法
贪心算法并不适用于所有问题,只有在满足一定条件时才能使用。一个贪心算法的基本要素包括:
- 贪心选择性质:即可以通过局部最优选择(贪心选择)来构造全局最优解。例如,背包问题的某些变种(如分数背包问题)可以通过贪心选择策略得到最优解。
- 最优子结构:问题的最优解可以通过其子问题的最优解来构造。例如,活动选择问题(选择最大数量的互不冲突的活动)就符合最优子结构的要求。
在满足这两个特性时,贪心法会非常有效。例如:
- 活动安排问题
- Huffman编码
- 最小生成树(如Kruskal和Prim算法)
- 背包问题(0-1背包)
3. 贪心法的局限性
贪心法并不总能得到最优解,尤其是在那些不满足贪心选择性质和最优子结构的情况下。对于这些问题,我们通常需要考虑其他更复杂的算法,如动态规划或回溯算法。
-
贪心法失效的例子:在0/1背包问题中,贪心法虽然能够选择部分较大的物品,但由于它忽略了未来的选择,最终可能会错过能提供更大价值的组合,因此不能得到最优解。
-
局部最优不等于全局最优:贪心算法通过选择当前最优的元素来做决策,但这种策略不能保证会得到全局最优解。在某些情况下,局部最优选择可能导致未来出现不利的情况。
4. 贪心法的优势
- 高效性:贪心法通常比动态规划等方法更高效,尤其在时间复杂度上。因为贪心法每次只考虑一个最优选择,而不需要重复计算子问题。
- 易于实现:很多贪心算法可以直接用简单的排序和选择结构来实现,代码简洁且直观。
5. 思考和总结
贪心法的使用关键是判断一个问题是否符合贪心策略的要求。虽然贪心法非常直观且易于实现,但如果没有正确判断问题的特性,贪心法可能会给出错误的解。因此,理解问题的结构和特性是应用贪心法的关键。总的来说,贪心法是解决某些特定类型问题时非常有效的工具,但它并不总能保证最优解,必须谨慎使用。