贪心法思想-求最大子数组和案例图解

贪心法思想

​ 基本思想是在问题的每个决策阶段,都选择当前看起来最优的选择,即贪心地做出局部最优的决策,以期获得全局最优解。

​ 正如其名字一样,贪心法在解决问题的策略上目光短浅,只根据当前已有的信息做出选择。一旦做出选择,不管将来有什么结果,这个选择都不会改变。

与动态规划对比:

​ 贪心算法和动态规划都常用于解决优化问题。它们之间存在一些相似之处,比如都依赖最优子结构性质,但工作原理不同。

  • 动态规划会根据之前阶段的所有决策来考虑当前决策,并使用过去子问题的解来构建当前子问题的解。
  • 贪心算法不会考虑过去的决策,而是一路向前地进行贪心选择,不断缩小问题范围,直至问题被解决。

举例-零钱兑换问题:

​ 贪心算法实现简单,易于理解,效率也很高,但是具有局限性。

有一组不同面额的硬币,给定一个总金额 𝑎𝑚𝑡 ,计算并返回可以凑成总金额所需的最少的硬币个数 。

每次贪心的选择尽可能大的硬币(不大于总金额的最大硬币),直至凑出目标金额为止。

硬币组合[100、50、10、5、1],总金额amt为131:

在这里插入图片描述

但是,某些情况下使用贪心是无法得到最优解的:

​ 硬币组合:[1,20,50],总金额 𝑎𝑚𝑡=60 ,贪心算法只能找到 50+1×10 的兑换组合,共计 11 枚硬币,但动态规划可以找到最优解 20+20+20 ,仅需 3 枚硬币。

分析:

​ 对于组合1、3、4,需要金额6,那么按照贪心法:4+1+1三个,而3+3两个即可。

​ 如果硬币组合间有倍数关系,那么较大的硬币可以使用多个较小的硬币组合,意味着能用较小硬币的任意数量组合(加起来大于较大硬币),都可以直接使用较大硬币+一定数量的较小硬币替代去减少数量,不会出现3+3等于6,而4和3无法组合出6的这种情况。

贪心法案例-求最大子数组和图解

问题描述:

​ 给一个整数数组 ,请找出一个具有最大和的连续子数组(子数组最少包含一个元素),返回其最大和。

原始数组:

nums = [-2,1,-3,4,-1,2,1,-5,4]

蛮力法:

​ 直接遍历所有情况,将任意情况下的最优解记录下来,取最大的

 public static int solution(int[] data, int n) {if (n < 0 || (n == 1 && data[0] <= 0)) {return 0;}if (n == 1) {return data[0];}int maxSum = 0, thisSum;// 计算i到i,i到i+1,...,i到n的和,选出最大的一个子序列。  // 当i从0遍历到n-1时,则计算过了所有的子序列for (int i = 0; i < n; i++) {thisSum = 0;// i 表示子序列左侧的位置for (int j = i; j < n; j++) { // j 表示子序列右边的位置// 汇总 i到j 的所有数之和时,对比solution1发现// 其实每次求和不需要都从i位置开始,因为 i到k的和 = i到K-1的和 + data[k]thisSum += data[j];maxSum = Math.max(maxSum, thisSum);}}return maxSum;}
贪心法:

​ 如果当前的子序列和小于0,那么负数+任何数都会变小,所以应该舍弃掉当前已经选择的子序列。

​ 所以我们只需要考虑当前的最优解即可,不断向后遍历数组,直到遍历完数组就可以得到最大的子序列和。

1、初始化

在这里插入图片描述

2、下标0

​ 下标为0,此时当前最大值变为 0 + ( − 2 ) = − 2 0+(-2)=-2 0+(2)=2,然后结果取负无穷和-2之间较大的,即-2.

t h i s M a x S u b = 0 + ( − 2 ) = − 2 thisMaxSub = 0 + (-2) = -2 thisMaxSub=0+(2)=2

− 2 > 负无穷  推出   r e s u l t = − 2 -2>负无穷 ~~推出~~ result = -2 2>负无穷  推出  result=2

​ 因为-2为负数,一定会使后续的子序列和变小,直接舍弃。

− 2 < 0 推出   t h i s M a x S u b = 0 -2<0 ~~推出~~ thisMaxSub = 0 2<0  推出  thisMaxSub=0

在这里插入图片描述

3、下标1

​ 当前最大值变为 0 + 1 = 1 0+1=1 0+1=1,然后结果取-2和1之间较大的,即1.

t h i s M a x S u b = 0 + 1 = 1 thisMaxSub = 0 +1= 1 thisMaxSub=0+1=1

1 > − 2 推出   r e s u l t = 1 1>-2 ~~推出~~ result = 1 1>2  推出  result=1

在这里插入图片描述

3、下标2

​ 当前最大值变为 1 + ( − 3 ) = − 2 1+(-3)=-2 1+(3)=2,然后结果取1和-2之间较大的,即1.

t h i s M a x S u b = 1 + ( − 3 ) = − 2 thisMaxSub = 1 + (-3) = -2 thisMaxSub=1+(3)=2

1 > − 2 推出   r e s u l t = 1 1>-2 ~~推出~~ result = 1 1>2  推出  result=1

​ 因为-2为负数,一定会使后续的子序列和变小,直接舍弃。

− 2 < 0 推出   t h i s M a x S u b = 0 -2<0 ~~推出~~ thisMaxSub = 0 2<0  推出  thisMaxSub=0

在这里插入图片描述

4、下标3

​ 当前最大值变为 0 + 4 = 4 0+4=4 0+4=4,然后结果取1和4之间较大的,即4.

t h i s M a x S u b = 0 + 4 = 4 thisMaxSub = 0 + 4 = 4 thisMaxSub=0+4=4

4 > 1 推出   r e s u l t = 4 4>1 ~~推出~~ result = 4 4>1  推出  result=4

在这里插入图片描述

5、下标4

​ 当前最大值变为 4 + ( − 1 ) = 3 4+(-1)=3 4+1=3,然后结果取4和3之间较大的,即4.

t h i s M a x S u b = 4 + ( − 1 ) = 3 thisMaxSub = 4 + (-1) = 3 thisMaxSub=4+1=3

4 > 3 推出   r e s u l t = 4 4>3 ~~推出~~ result = 4 4>3  推出  result=4

在这里插入图片描述

6、下标5

​ 当前最大值变为 3 + 2 = 5 3+2=5 3+2=5,然后结果取4和5之间较大的,即5.

t h i s M a x S u b = 3 + 2 = 5 thisMaxSub = 3+2=5 thisMaxSub=3+2=5

5 > 4 推出   r e s u l t = 5 5>4 ~~推出~~ result = 5 5>4  推出  result=5

在这里插入图片描述

​ 最终得到最大值为6

    public static int execute(int[] data) {// result:存储最大值;thisMaxSub:存储当前最大值int result = Integer.MIN_VALUE, thisMaxSub = 0;for (int datum : data) {thisMaxSub += datum;result = Math.max(thisMaxSub, result);// tempMaxSub小于0的话,就可以直接舍弃掉,因为负数+任何数都会变得更小thisMaxSub = Math.max(thisMaxSub, 0);}return result;}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/bicheng/37470.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

AI绘画,5分钟用 stable diffusion 做装修图,室内设计师要失业了

大家好我是极客菌&#xff01;随着AI绘画功能越来越强大&#xff0c;不光可以用来画人物&#xff0c;为电商模特一键换衣&#xff0c;还可以在5分钟内生成一张室内效果图&#xff0c;看来室内设计师饭碗也岌岌可危了。 1、获得室内线稿图 首先&#xff0c;打开3ds max &#…

LabVIEW航空用电缆检测

系统通过集成LabVIEW平台&#xff0c;实现了航空用电缆检测过程中的自动数据收集、处理和报告生成&#xff0c;显著提升了检测效率和数据准确性&#xff0c;降低了人工干预&#xff0c;提高了电缆检测的可靠性。 项目背景 在航空领域&#xff0c;电缆的质量检测对确保飞机及其…

排序问题学习c++ 跑步比赛

问题是假定有25名短跑选手争夺前三名&#xff0c;赛场上有五条赛道&#xff0c;一次可以有五名选手同时比赛&#xff0c;比赛不计时&#xff0c;只看相应的名次&#xff0c;假如选手的发挥是稳定的&#xff0c;最少几次比赛才可以决出前三名。 #include <iostream> // 包…

大语言模型预训练数据集及清洗框架介绍【简单版】

目录 一、常见数据集类型 &#x1f4da; 二、数据清洗框架对比 &#x1f9f9; SlimPajama MNBVC CC-NET 三、理想的清洗框架 &#x1f4af; 四、数据清洗核心流程 &#x1f504; 五、现有数据集反思 &#x1f914; 六 中文预训练数据集 &#x1f1e8;&#x1f1f3; 1…

AI Infra简单记录

向量数据库的作用 1. 在AI大模型训练过程中&#xff0c;向量数据库可以有效提升数据检索、特征提取等任务的效率。 2、在AI大模型推理过程中&#xff0c;向量数据库为大模型提供外挂知识库&#xff0c;提升模型时效性与准确性&#xff0c;提供缓存能力&#xff0c;减少调用开…

c语言中extern定义和引用其他文件的变量,(sublime text)单独一个文件编译不会成功

关键字extern的作用 这个很常见的都知道是定义一个外部变量或函数&#xff0c;但并不是简单的建立两个文件&#xff0c;然后在用extern 定义在另一个非最初定义变量的文件里 区分文件和编译运行的文件 例如&#xff0c;一个文件夹里有文件a.c和文件b.c,在sublime text中直接…

深入解析链表:解锁数据结构核心奥秘

一. 链表的定义 链表是一种线性数据结构&#xff0c;由一系列节点组成。每个节点包含两个部分&#xff1a; 数据域&#xff08;Data&#xff09;&#xff1a;存储节点的数据。指针域&#xff08;Pointer&#xff09;&#xff1a;存储指向下一个节点的地址。 链表的第一个节点…

【Linux】Wmware Esxi磁盘扩容

目录 一、概述 1.1 磁盘分区概念 1.2 LVM概念 二、扩容步骤 二、报错 一、概述 1.1 磁盘分区概念 在 Linux 中&#xff0c;每一个硬件设备都映射到一个系统的文件&#xff0c;对于硬盘、光驱等 IDE 或 SCSI 设备也不例外。Linux把各种 IDE 设备分配了一个由 hd 前缀组成的文…

Linux 中的文本编辑

文章目录 Linux 中的文本编辑Vi 和 Vim 的基本介绍三种工作模式常用快捷键 Linux 中的文本编辑 在 Linux 系统中&#xff0c;内置了强大的文本编辑器 Vi 和其增强版本 Vim。 Vi 和 Vim 的基本介绍 Vim 作为 Vi 的增强版&#xff0c;具有出色的程序编辑能力&#xff0c;能以字…

论文辅导 | 基于贝叶斯优化-卷积神经网络-双向长短期记忆神经网络的锂电池健康状态评估

辅导文章 模型描述 准确估计电池健康状态是设备稳定运行的关键。针对当前健康状态研究中容量难以直接测量、估计模型调参费时等问题&#xff0c;提出基于多健康特征的贝叶斯优化&#xff08;BO&#xff09;算法优化卷积神经网络&#xff08;CNN&#xff09;与双向长短期记忆&a…

冯雷老师:618大退货事件分析

近日冯雷老师受邀为某头部电商36名高管进行培训&#xff0c;其中聊到了今年618退货潮的问题。以下内容整理自冯雷老师的部分授课内容。 一、引言 随着电子商务的蓬勃发展&#xff0c;每年的618大促已成为消费者和商家共同关注的焦点。然而&#xff0c;在销售额不断攀升的同时…

【详细教程】如何使用YOLOv10进行图片与视频的目标检测

《博主简介》 小伙伴们好&#xff0c;我是阿旭。专注于人工智能、AIGC、python、计算机视觉相关分享研究。 ✌更多学习资源&#xff0c;可关注公-仲-hao:【阿旭算法与机器学习】&#xff0c;共同学习交流~ &#x1f44d;感谢小伙伴们点赞、关注&#xff01; 《------往期经典推…

datax入门(data-web的简单使用)——02

datax入门&#xff08;data-web的简单使用&#xff09;——02 1. 前言1.1 关于data-web官网1.1.1 源码下载1.1.2 datax-Web部署手册1.1.2.1 Linux环境部署手册1.1.2.2 本地开发环境部署手册 1.2 关于datax入门 2. 下载之后打包、启动、登录2.1 我的本地环境2.2 修改配置2.3 初始…

SQL数据库学习指南:从基础到高级

SQL数据库学习指南&#xff1a;从基础到高级 大家好&#xff0c;我是免费搭建查券返利机器人省钱赚佣金就用微赚淘客系统3.0的小编&#xff0c;也是冬天不穿秋裤&#xff0c;天冷也要风度的程序猿&#xff01;今天我们将深入探讨SQL数据库的学习指南&#xff0c;从基础到高级&…

html纯原生网页引入vue3版本的quill editor

效果图 版本 vueup/vue-quill v1.2.0vue3.3.8Element Plus v2.4.2 引入流程 找一个vue3的项目, 然后安装插件vue版本的quill: vue-quill npm install vueup/vue-quill --save官方地址&#xff1a;https://vueup.github.io/vue-quill/ 安装完成之后&#xff0c;把vue-quil插件下…

如何搭建数据安全架构?包含数据安全资产梳理、敏感数据发现、数据风险检测、安全态势感知等解决方案

如何搭建数据安全架构&#xff1f;包含数据安全资产梳理、敏感数据发现、数据风险检测、安全态势感知等解决方案。 搭建数据安全架构是一个复杂且系统化的过程&#xff0c;涉及多个方面和层次。以下是一个详细的方案&#xff0c;涵盖数据安全资产梳理、敏感数据发现、数据风险检…

详解HTTP:HTTP的一次请求

HTTP请求的发起 当用户通过浏览器或其他客户端发起一个HTTP请求来获取网页时&#xff0c;这个请求首先会在应用层构建。HTTP是一个基于TCP的应用层协议&#xff0c;它定义了客户端和服务器之间的通信格式和规则。 TCP封装 接下来&#xff0c;HTTP请求会被交给传输层的TCP协议进…

解开孤独症谱系障碍:原因与症状的深度洞察

孤独症谱系障碍&#xff0c;这个日益受到关注的话题&#xff0c;让许多人感到困惑和担忧。那么&#xff0c;它究竟是由什么原因引起的&#xff0c;又有哪些表现症状呢&#xff1f; 引起孤独症谱系障碍的原因目前尚未完全明确&#xff0c;但研究表明&#xff0c;可能与以下因素有…

深度解析:Transformer模型如何革新序列数据处理

标题&#xff1a;深度解析&#xff1a;Transformer模型如何革新序列数据处理 摘要 自2017年Google的论文《Attention Is All You Need》发布以来&#xff0c;Transformer模型以其独特的注意力机制&#xff0c;在自然语言处理&#xff08;NLP&#xff09;领域引起了革命性的变…

ROS2使用Python创建服务提供者、消费者

1.创建服务提供者 ros2 pkg create example_service_rclpy --build-type ament_python --dependencies rclpy example_interfaces --node-name service_server_02 service_server_02.py 代码 #!/usr/bin/env python3 import rclpy from rclpy.node import Node # 导入接口 …