这里记录一下常见贪心算法的证明,也是算是我自己的一个总结和复习,感觉这个抽象,虽然算法不难,但是要证明比较难,而且每一个种贪心要是没见过还可能真的写不出来,网上看了不少资料结合老师的ppt,如果有说的不对的地方,欢迎大家讨论,单纯当记录。
无论什么贪心算法的证明,我们首先要知道,大体两个步骤:
1.贪心证明
2.最优子结构证明
无论是什么贪心问题,想要证明都是这2步,一般来说,我们的贪心证明常见的就是使用数学归纳法,先k=1,然后k>1,只要成立即可,最优子结构的证明的话,则通常我们是使用的反证法进行证明。
活动安排问题
活动安排问题算是一个常见贪心问题,我就不写代码什么的了,就单纯讲这个算法的正确性证明,设待安排的11个活动的开始时间和结束时间按结束时间的非减序排列如下:
即然我们要证明贪心,那么我们首先假设一个最优解A{i1,i2,i3,......},k表示选择k项活动,当我们的k=1时,意思就是说,我们只选择一个活动,哪个我不管,那么根据结束时间最早进行排序,我们的1号活动是最早的啊,换句话说,这个1号活动,可以替换我们刚刚选择的那个活动也就是k=1时候选择的那个,且不影响最优解个数,因为你就选一个呀,所以说k=1时,最优解可以包含1号活动,这个就是我们的贪心的开始,下面的j就是指,我们随便选的那个
当k>1的时候其实也一样,我们直接假设AB为最优解,B为剩余活动的,A和上面那里一样,A{i1,i2,i3,......ik},即然这样子,那么显而易见B中的第一个就是ik+1,由k=1时,我们可以知道ik+1也是B部分的最优,那么我们B这个部分的最优有没有选择ik+1其实不重要,我们知道整体AB最优,那么假设B*是包含ik+1的最优,那么当k>1,最优可以替换为AB*,即在k>1时候也成立
这一步走完,就要证明最优子结构性质,正常我们都是直接反证法的
那么首先假设B*不是S的最优解,那么意思就是说存在B**是其最优,且B**一定比B*多才可以,那么这样子话B**A才是该问题的最优解啦,这个时候就出现问题了,我们假设的是AB才是最优解呀,那么假设就不成立了,那意思就是说1号活动是存在于后面k>1的,这就是最优子结构证明。