算法笔记 贪心

何为贪心

在对问题求解时,总是做出在当前看来是最好的选择。贪心算法不是对所有问题都能得到整体最优解,关键是贪心策略的选择。也就是说,不从整体最优上加以考虑,做出的只是在某种意义上的局部最优解。

贪心算法结果一般不是全局最优解
贪心算法一般作为辅助算法,如最小生成树、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个闭区间,求最少需要确定多少个点,使每个区间都至少存在一个点

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值