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

【算法】贪心算法入门

文章目录

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

什么是贪心算法

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

贪心算法实现步骤

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

  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.dtcms.com/a/278080.html

相关文章:

  • SwiftUI 7 新 WebView:金蛇出洞,网页江湖换新天
  • 一些git命令
  • 若依框架集成阿里云OSS实现文件上传优化
  • 对于muduo我自己的理解
  • UniHttp生命周期钩子与公共参数实战:打造智能天气接口客户端
  • flask校园学科竞赛管理系统-计算机毕业设计源码12876
  • SPSSPRO:数据分析市场SaaS挑战者的战略分析
  • JAVA并发——什么是AQS?
  • Mapbox GL初探
  • 【unitrix】 5.0 第二套类型级二进制数基本结构体(types2.rs)
  • 16.使用ResNet网络进行Fashion-Mnist分类
  • css如何同时给元素设置背景和背景图?
  • 每日算法刷题Day47:7.13:leetcode 复习完滑动窗口一章,用时2h30min
  • 说实话,统计分析用Python这5个第三方库就够了
  • AutoLabor-ROS-Python 学习记录——第一章 ROS概述与环境搭建
  • PortsSwiggerLab: SSRF with blacklist-based input filter
  • JS进阶-day1 作用域解构箭头函数
  • Spring AI 项目实战(十六):Spring Boot + AI + 通义万相图像生成工具全栈项目实战(附完整源码)
  • NO.5数据结构串和KMP算法|字符串匹配|主串与模式串|KMP|失配分析|next表
  • pthread_mutex_unlock函数的概念和用法
  • 大规模电商系统分库分表实战经验分享
  • NFSV4锁机制(三)
  • 编程技术杂谈2.0
  • DVWA靶场通关笔记-XSS DOM(High级别)
  • 垃圾收集器-Serial Old
  • CVE-2022-0609
  • vue2入门(1)vue核心语法详解复习笔记
  • 【开源项目】网络诊断告别命令行!NetSonar:开源多协议网络诊断利器
  • 1.1.1+1.1.3 操作系统的概念、功能
  • c++无锁队列moodycamel::ConcurrentQueue测试结果