目录
贪心算法
本篇博客是我学习贪心算法的入门篇,在此我主要讲解贪心算法的原理实现以及其特点,更重要的是当我们遇到此类问题的时候应该如何运用原理解题。
一、贪心算法的原理与特点
首先,在我们学习算法的过程之中,我们肯定会有类似的经历:
比如我们在学习二分查找、回溯等等之类的算法,我们肯定是先理解原理,然后通过练习几道经典题目来总结做题套路,最后能够举一反三!!!
但是,当我在学习贪心算法的过程中,我惊奇的发现当我了解其原理,做了20道题后,我发现我在之前题目所总结的套路,放在21题上完全不适用!!!,就此断绝一切想要投机取巧的想法TnT。
这就是贪心算法的特点,毫无规律可言,如果想靠死记硬背套路完全不可行!!!。
所以接下来给大家介绍我理解的贪心算法。
1、什么是贪心算法?
与其说是贪心算法,倒不如说是贪心策略:解决实际问题的策略,从局部最优解--->全局最优解。
我这里把算法流程分为三部分:
1、把要解决的问题分为若干步。
2、在解决每一步的时候,都选择当前步骤看起来“最优的” 解法。
3、最后“希望“得到全局最优解。**
那么我们应该如何理解上面的三个步骤呢?接下来我将列举三个例子来帮助理解
例一:找零问题
张三在一家超市买了一瓶水,花了4元,但是他身上只有一张50元,他拿给老板找零。
假如你是老板,现在超市只有面额为20元、10元、5元、1元的纸币,现在问最少需要几张纸币才能找完?
下面是贪心策略的步骤:
例二:最小路径和的问题
例三:背包问题
由上面三个例子,我们就可以总结出贪心算法的本质:
贪婪 + 鼠目寸光,我在每一步都想要最好的解,但总体来看却是得不偿失
2、贪心算法的特点
由上面的说明,我们可以得出贪心算法的特点:
1、贪心策略的提出
①贪心策略的提出是没有标准和模板的!!!
②每一道题的贪心策略都是不同的!!!
2、贪心策略的正确性(这也是最重要的一点!!!)
因为“贪心策略”有可能是一个错误的方法,比如上面的例2、例3
但是正确的“贪心策略”,是需要我们“证明的”!!!
常见的证明方法:我们在学习数学过程中的所有方法
二、贪心策略的证明
比如例2、例3我们可以举一个反例来证明其贪心策略是错误的
但是我们怎么证明例1的贪心策略是对的呢???
接下来我将讲我所理解的例1证明方法:
如下图:
我们假设所花费的纸币数量的最优解是:A,B,C,D
就能得出如图性质,原因在于B>=2时,可以被一张A代替,C,D同样如此。
我们假设贪心解是:a,b,c,d。此时证明最优解与贪心解相同即可,则证A=a......
首先,我们可以得出a>=A,原因在于贪心策略一定是要先满足a取到最大,再往后取b、c、d
但此时假设a>A,但是总价不变,则B,C,D凑剩下的价格所用的张数一定比用A多,所以不可能是最优解!!!所以a只能等于A,同理证b=B、c=C、d=D。证毕。
三、学习贪心的方向
由上面的证明,我们能够看出贪心的难点。
所以遇到不会的贪心题,很正常,把心态放好!!!
我自己总结了两点:
1、前期学习的时候,我会把重心放在如何寻找最优贪心策略上,遇到不会的问题就看题解或者找教学视频,总结一定的经验。
2、学习策略的证明,究竟是如何得出最优贪心解。
四、贪心题目更新讲解
接下来我会从LeetCode上把我做过的题目分享出来,将题解写成博客贴到下方,需要就点击查看吧。