贪心算法的证明(贪心策略是安全的)

由于最近考算法,经常会遇到要求证明贪心算法中,贪心策略及贪心选择是正确的。

由于这块涉及到胚和拟阵的问题,书上仅在贪心算法章节的描述过于抽象,以至于我真的是头大了很久才算弄懂。

这里不过多复述贪心算法和动态规划的区别,以及具体的应用条件、性质,仅描述如何理解“贪心选择是安全”,即证明贪心算法的正确性。

这里使用的教材是《算法导论》第二版

用课本的“活动选择问题”来阐述如何理解贪心算法证明与安全问题。

《贪心算法的证明(贪心策略是安全的)》

这是书上关于“贪心选择正确性”的主要证明定理。

十分的抽象……

但我这里结合网上一些描述,提出一个比较容易理解的概念。

贪心算法和动态规划本质的不同是,贪心算法可以通过一个选择策略,直接得到一个局部最优解,而不需要通过递归遍历。

网上有一些描述“贪心策略证明”的方法是这么说的:

考察一个问题的最优解,证明可修改该最优解,使得其从贪心选择开始,然后用数学归纳法证明每一步都可以通过贪心选择得到最优解
1,假定首选元素不是贪心选择所要的元素,证明将首元素替换成贪心选择所需元素,依然得到最优解;
2,数学归纳法证明每一步均可通过贪心选择得到最优解

实际上也十分的抽象,比如第一句其实我就没太懂什么意思。

这里我提出以下自己的理解:

类比动态规划,当对原问题进行分解的时候,我们假设分解为子问题A(待解决)与子问题B(待递归分解)。

动态规划需要采取自底向上或者是记录型的自顶向下,也就是遍历一切可能,得到一个最优解,合并解决原问题。

贪心选择,可以采取自顶向下,也就是直接解决子问题A,然后继续对子问题B进行分解。

解决子问题A的策略交贪心策略,也就是贪心选择。

需要证明贪心选择正确性,以活动选择问题来看。

1.若运用贪心策略,将在子问题A中,选择a作为局部最优解。

2.此时,证贪心策略是正确的,其实是证,不采取贪心策略下,原问题的最优解中,也包含a

3.假设,此时子问题A中没有选择a,证子问题B(递归中与合并后)中的选择一定包含a

4.此时,可以使用最简单的证法,也就是动态规划的自底向上递归。由于a在切分扫描中,一定被选中

5.由4可得3,也就是得到了“贪心策略选择的局部最优解,一定包含在全局最优解之中”


以上的描述,仅为本人理解,原理基于书中定理16.1,其实是证最大兼容子集问题。

PS:献丑了……仅为本人笔记用



    原文作者:贪心算法
    原文地址: https://blog.csdn.net/fan2273/article/details/73549016
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞