【算法】贪心算法入门

文章目录

什么是贪心算法

贪心算法是一种在每一步选择中都采取在当前状态下最好或最优(即最有利)的选择,从而希望导致结果是最好或最优的算法 。其实就是希望局部最优能够推导全局最优的策略。

贪心算法实现步骤

贪心算法的实现步骤通常如下:

  1. 把求解的问题分成若步(或者若干个子问题)。
  2. 解决每一步的时候(或者每个子问题),都选择当前看起来最优的解法。
  3. 把每一步(或者每个子问题)的最优解合成原来解问题的一个解。

贪心的三个例子

例一:找零问题

题目就是对方在店里消费了4元,给了你50元,希望你用以下四张纸币[20,10,5,1]以最少的纸币张数找对方零钱。

我们按照贪心的策略,肯定是先选最贵的纸币找零,如果太大了再依次看下一个小的纸币找零。

例二:最小路径和

题目就是在这个九个格子里面你每次只能选择向右和向下走一步,走到哪个格子就将格子里的数字累加,问从左上角到达右下角的最小路径和是多少。

我们按照贪心的策略,选择每一步的最优解,所以第一步肯定是向下走,第二步肯定是向下走,下面就只能向右走了,也就是下图绿色的路线得到的是10。但是最优解其实是紫色那一条路线也就是7。

例三:背包问题

题目就是背包的最大容量是8,问将列表中的三个物件如何组合才能达到最高价值。

我们按照贪心的策略,选择每一步的最优解,但是我们要以什么标准去选择我们每一步的评判标准呢,是以物品的体积,物品的价值还是单位体积所带来的价值呢。

如果以体积去选择,则所带来的价值是8。

如果以价值去选择,则所带来的价值是13。

如果以单位体积所带来的价值去选择,则所带来的价值是13。

但是真正的最优解其实是14。

贪心算法的特点

贪心算法通常具有以下两个特点:

  1. 贪心选择性质:通过局部最优的选择,能产生全局的最优选择。每一步都采取当前状态下最优的选择,这是贪心算法的核心。
  2. 最优子结构性质:问题的最优解包含其子问题的最优解。这意味着问题可以分解成子问题来解决,并且子问题的最优解能递推到最终问题的最优解。

其实贪心算法这就是贪婪+鼠目寸光的解法。

注意:从例三就可以看出贪心策略的提出是没有标准的以及模板的,所以每一道题的贪心策略都是不同的。还有就是从例二和例三可以看出虽然每一步都是最优解,但是合起来却不是全局的最优解,所以这只是"希望"让每一步得到最优解从而能够得到的全局解是全局的最优解,但是得到的不一定是全局的最优解。所以我们需要去证明贪心策略的正确性。

贪心策略的正确性

假设我们的最优解使用的纸币的张数,20元的纸币是A张,10元的纸币是B张,5元的纸币是C张,1元的纸币是D张。

首先我们要发现一个性质如果B>=2那么一张A就可以代替它,所以B<=1;同理可以得出C<=1;D<=4;

假设我们贪心策略所使用的纸币张数,20元的纸币是a张,10元的纸币是b张,5元的纸币是c张,1元的纸币是d张。所以就转换成只要证明A=a,B=b,C=c,D=d即可。

第一我们这个一定是a>=A;因为我们的贪心策略是能用20就尽量用20。

接下来我们可以去证明a>A;如果a是大于A的话,那我们剩下的钱只能让B,C,D去凑数,因为总的钱数是不变的,如果a>A那么少的那部分只能用B,C,D去凑。但是我们根本凑不出来,还记得我们前面发现的性质吗,B<=1;C<=1;D<=4;它们三不管怎么凑最多只能是19,所以a是不可能大于A的。

好,那么我们前面得出的a是一定大于等于A的,后面我们又证明a是不可能大于A的,所以a只能等于A,即a=A。

所以剩下的B,C,D凑的钱是一样的了,我们就可以得出b>=B,因为我们的贪心策略是能用最优的就尽量用最优的。凑的钱是一样的时候我们能用10元就尽量用的10元。同理即又可以证明b是不可能大于B的。以下相同的方法就可以得出A=a,B=b,C=c,D=d。所以我们这个贪心策略没有问题的是最优解。

贪心学习方向

遇到不会的很正常,把心态放平,不是每个人他都能想到每道题的最优解。我们前期的学习应该把重点放在贪心的策略上,然后把策略当成经验吸收。如果要想提升的话,就要想到如何去证明这个贪心策略是正确的。

相关推荐
Dovis(誓平步青云)30 分钟前
《滑动窗口算法:从 “暴力遍历” 到 “线性高效” 的思维跃迁》
运维·服务器·数据库·算法
_OP_CHEN1 小时前
【算法基础篇】(五十七)线性代数之矩阵乘法从入门到实战:手撕模板 + 真题详解
线性代数·算法·矩阵·蓝桥杯·c/c++·矩阵乘法·acm/icpc
天天爱吃肉82181 小时前
【跨界封神|周杰伦×王传福(陶晶莹主持):音乐创作与新能源NVH测试,底层逻辑竟完全同源!(新人必看入行指南)】
python·嵌入式硬件·算法·汽车
im_AMBER1 小时前
Leetcode 114 链表中的下一个更大节点 | 删除排序链表中的重复元素 II
算法·leetcode
xhbaitxl1 小时前
算法学习day38-动态规划
学习·算法·动态规划
多恩Stone1 小时前
【3D AICG 系列-6】OmniPart 训练流程梳理
人工智能·pytorch·算法·3d·aigc
历程里程碑1 小时前
普通数组----轮转数组
java·数据结构·c++·算法·spring·leetcode·eclipse
pp起床1 小时前
贪心算法 | part02
算法·leetcode·贪心算法
sin_hielo1 小时前
leetcode 1653
数据结构·算法·leetcode
2501_901147831 小时前
面试必看:优势洗牌
笔记·学习·算法·面试·职场和发展