当前位置: 首页 > backend >正文

【算法】贪心算法入门

文章目录

  • 什么是贪心算法
  • 贪心算法实现步骤
  • 贪心的三个例子
  • 贪心算法的特点
  • 贪心策略的正确性
  • 贪心学习方向

什么是贪心算法

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

贪心算法实现步骤

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

  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。所以我们这个贪心策略没有问题的是最优解。
在这里插入图片描述

贪心学习方向

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

http://www.xdnf.cn/news/15318.html

相关文章:

  • 算法学习笔记:19.牛顿迭代法——从原理到实战,涵盖 LeetCode 与考研 408 例题
  • 【SCI 4区推荐】《Journal of Visual Communication and Image Representation》
  • 代码随想录|图论|14有向图的完全可达性
  • 集训Demo1
  • CVPR2025 Mamba系列
  • JAVA--双亲委派机制
  • 维基艺术图片: python + scrapy 爬取图片
  • Linux系统中部署Redis详解
  • 算法练习6-大数乘法(高精度乘法)
  • RocketMQ-
  • 【字符串移位包含问题】2022-8-7
  • Opencv---深度学习开发
  • 单细胞入门(1)——介绍
  • 电商订单数据分析全流程:从数据处理到可视化洞察
  • 【PTA数据结构 | C语言版】车厢重排
  • Geant4 安装---Ubuntu
  • 【深度剖析】致力“四个最”的君乐宝数字化转型(下篇:转型成效5-打造数字化生存能力探索可持续发展路径)
  • 26. 删除有序数组中的重复项
  • 【MySQL笔记】事务的ACID特性与隔离级别
  • 详细理解向量叉积
  • 二分搜索 (左程云)
  • 【C/C++】编译期计算能力概述
  • uniapp弹出手机键盘,布局被顶飞,导致页面混乱问题
  • 使用Pycharm集成开发工具远程调试部署在虚拟机上的flask项目:超级详细的完整指南
  • Rust Web 全栈开发(六):在 Web 项目中使用 MySQL 数据库
  • Transforms
  • 单向链表反转 如何实现
  • JVM的垃圾回收算法和多种GC算法
  • Redis面试精讲 Day 1:Redis核心特性与应用场景
  • Day59