何为贪心
在对问题求解时,总是做出在当前看来是最好的选择。贪心算法不是对所有问题都能得到整体最优解,关键是贪心策略的选择。也就是说,不从整体最优上加以考虑,做出的只是在某种意义上的局部最优解。
贪心算法结果一般不是全局最优解
贪心算法一般作为辅助算法,如最小生成树、dijkstra等
贪心不一定全局最优
前面的选择,会影响后面的选择。即便第一步选择最优的解法,但有可能因为这一步选择,导致后面每一步的选择都很糟糕,最终也就不是全局最优解
例:图中从出发点到最终点的路径有两条,两条路径的边权依次为
路径1:1 10 10 10
路径2:10 1 1 1
最短路径:贪心求解的结果为路径1,但全局最优应该为路径2
贪心适合什么问题
精确:贪心算法适用的问题,一定满足最优子结构性质,即一个问题的最优解可以由其子问题的最优解有效地构造出来。
通俗:针对一组数据,定义了限制值和期望值,希望从中选出几个数据,在满足限制值的情况下,期望值最大
如果一个题目可以用贪心求解全局最优,那么贪心一定是解决此问题的最优方法。因为贪心代码简单,无需存储、回溯等,只需每个子问题选择当前最优即可
如何证明贪心全局最优
证明一般思路:使用反证法和数学归纳法。
假设策略不能导致最优解,通过一系列推导得到矛盾,以此证明策略是最优的,最后用数学归纳法保证全局最优
贪心算法解决问题的正确性虽然很多时候都看起来是显而易见的,但是要严谨地证明算法能够得到最优解,并不是件容易的事。
很多时候,只需要多举几个例子,看一下贪心算法的解决方案是否真的能得到最优解就可以了。
如何贪心
每次选择当前情况下,在对限制值同等贡献量的情况下,对期望值贡献最大的数据
贪心算法的最难的是如何将要解决的问题抽象成贪心算法模型,只要这一步搞定之后,贪心算法的编码一般都很简单。
相关题目
最小生成树
哈夫曼编码
分糖果
部分钱币找回
硬币找回类题目,并不是都可以用贪心求出最优解
- 情景1:若纸币组合为【20,10,5,1】可以使用贪心求出最优解
- 情景2:若纸币组合为【20,9,5,1】不可以使用最优解,需要使用动态规划求解
原因:
- 情景1
前面的数字依次是后面每个数字的倍数,适合用贪心求全局最优,如20=2*10=5*4=20*1。所以用4个5或者2个10或者20个1,不如用1个20。- 情景2
前面的数字不是后面每个数字的倍数,所以不可以使用贪心求全局最优解。如:需找回27元最少几张纸币,若用贪心则结果需要4张纸币:27=1*20+1*5+2*1,全局最优解为3张纸币:27=3*9
区间贪心
区间不相交
N个开区间,选择尽可能多的开区间,使得两两没有交集
区间选点
N个闭区间,求最少需要确定多少个点,使每个区间都至少存在一个点