贪心算法原理及其应用

贪心算法的实际应用 这次得发点干货了^_^ 贪心算法的实际应用解决:背包问题、线段覆盖问题 阅读详情

概述

贪心算法应该算是那种“只闻其声不见其人”的算法,我们可能在好多地方都会听到贪心算法这一概念,并且它的算法思想也比较简单就是说算法只保证局部最优,进而达到全局最优。但我们实际编程的过程中用的并不是很多,究其原因可能是贪心算法使用的条件比较苛刻,所要解决的问题必须满足贪心选择性质---所求问题的整体最优解可以通过一系列局部最优的选择,即贪心选择来达到。这是贪心算法可行的第一个基本要素,也是贪心算法与动态规划算法的主要区别。

贪心算法

由于贪心算法本身的特殊性,我们在使用贪心算法之前必须要进行证明,保证算法满足贪心选择性质。具体的证明方法无外乎就是通过数学归纳法来进行证明。但大部分人可能并不喜欢枯燥的公式,因而我这里提供一个使用贪心算法的小技巧。由于贪心算法某种程度上算是动态规划算法的特例,使用条件比较苛刻,因而能够用动态规划解决的问题尽量都是用动态规划来进行先解决,如果在用完动态规划之后,提交时发现问题超时,并且进行状态压缩之后仍然超时,此时我们就可以考虑使用贪心算法来进行解决。最后强调一下,我们在使用贪心算法之前,如果要保证解法的绝对正确,一定要对问题进行证明,切记,切记!!

下边我们以区间调度问题为例,来讲一下贪心算法到底该如何取用。

区间调度问题

问题描述:

给你很多形如 [start, end] 的闭区间,请你设计一个算法,算出这些区间中最多有几个互不相交的区间。

举个例子,intvs = [[1,3], [2,4], [3,6]],这些区间最多有 2 个区间互不相交,即 [[1,3], [3,6]],你的算法应该返回 2。注意边界相同并不算相交。

这个问题大眼一看好像有很多贪心策略可供选择,比如我们可以选择区间最短的?或者选择开始最早的?。。。

但是上面几种策略,我们都可以比较容易的举出反例来排除,同时这也是贪心算法的另一个小技巧--虽然好多时候直接证明贪心策略的正确性很难,但是我们可以从反证法入手,对贪心策略进行证伪,排除许多错误的贪心策略。😄😄

好了,说了这么多,那针对该问题正确的贪心策略到底是哪个?

其实正确的思路也比较简单,可以分成下面三步:

  1. 从区间集合中选择一个区间x,这个x是所有区间中结束最早的(end最小)。
  2. 把所有与x区间相交的区间从区间集合中删除掉。
  3. 重复1和2,直到区间集合为空。之前选出的那些x的集合就是最大的不想交子集。

这个思路实现成算法的话,可以按照每个区间的end数值进行升序排序,因为这样处理以后实现步骤1和步骤2就会容易很多。

我们通过下面这个动图来辅助理解其整个过程。

由于我们在计数之前进行了排序,所以所有与x相交的区间必然会和x的end相交;如果一个区间不想与x的end相交,它的start必须要大于或者等于x的end。

具体实现的代码如下:

public int eraseOverlapIntervals(int[][] intervals) {
    if (intervals.length == 0) {
      return 0;
    }
    Arrays.sort(
        intervals,
        new Comparator<int[]>() {
          @Override
          public int compare(int[] o1, int[] o2) {
            return o1[1] - o2[1];
          }
        });
	//排序后的第一个必然可用
    int count = 1;
    int x_end = intervals[0][1];
    for (int[] interval : intervals) {
      if (interval[0] >= x_end) {
        count++;
        x_end = interval[1];
      }
    }
    return count;
  }

应用

如果学会了上面的区间调度问题的话,leetCode上边有两个题目,我们便都可以拿下了。

image-20201103145203020

这个问题大眼一看好像和我们之前讲的那个区间调度问题毫不相关,但仔细分析一下,好像是一模一样的问题,如果最多有 n 个不重叠的区间,那么就至少需要 n 个箭头穿透所有区间。

因而问题也就转化成了,寻找不重叠区间的个数,但我们要注意的一点是,在 intervalSchedule 算法中,如果两个区间的边界触碰,不算重叠;而按照这道题目的描述,箭头如果碰到气球的边界气球也会爆炸,所以说相当于区间的边界触碰也算重叠。

4

代码实现如下:

public int findMinArrowShots(int[][] points) {
    if (points.length <= 0) {
      return 0;
    }
    // 在排序的过程中要考虑溢出情况的发生
    Arrays.sort(points, (a, b) -> Integer.compare(a[1], b[1]));
    int count = 1;
    int x_end = points[0][1];
    for (int[] point : points) {
      if (point[0] > x_end) {
        count++;
        x_end = point[1];
      }
    }
    return count;
  }

总结

本文主要结合一个例子,讲了贪心算法的使用方式。

贪心算法实现起来容易,但难在证明。因而文中提供了两个小窍门辅助判断是否使用贪心算法:

  1. 在使用考虑贪心算法之前,先考虑使用动态规划(考虑状态压缩)解决该问题,如果问题依然超时,则考虑使用贪心算法。
  2. 在确定贪心策略之前,先用一些特殊的例子验证贪心策略的正确性。对于正确的贪心策略,为了保证算法的绝对正确,要通过数学归纳法进行验证。
贪心算法求解 TSP 旅行商问题及其实现 贪心算法求解 TSP 问题得到局部最优解的具体实现,数据集来自 TSPLIB 的 att48 数据集。旅行商问题即 TSP(Traveling Salesman Problem),又称为货郎担问题,是数学领域中著名问题之一。 阅读详情

相关推荐

Vscode + QT + CMake:高效开发环境搭建全攻略

本文详细介绍了如何搭建Vscode+QT+CMake高效开发环境,涵盖环境安装、配置优化及项目创建全流程。通过整合Vscode的轻量化编辑、QT的跨平台GUI开发以及CMake的现代构建管理,该组合特别适合大型QT项目和跨平台开发团队,能显著提升开发效率。

weixin_30338481的博客 504

算法--贪心算法的应用

刚开始想这道题时觉得应该依次设雷达的位置为从最左边的点到最右边的点之间的横坐标,但这样是不对的,首先雷达的位置不一定是整数值,所以是不能直接暴力求解的,使用贪心算法,从左到右尽可能多的覆盖岛屿,以岛屿为圆心,探测距离为半径画圆,如果与横坐标轴无交点,说明该岛屿不能被覆盖到,则不能实现直接返回0;(1)按价值降序排序;然后依次放入背包,若W[i]M,则将该物品部分放入,V(n,M)=P[i]*u[i],M=0.

m0_62089210的博客 1788

零基础搭建本地AI绘画环境:Stable Diffusion 3.5保姆级安装教程(含中文优化方案)

本文提供零基础搭建本地AI绘画环境的详细教程,重点介绍Stable Diffusion 3.5的安装与中文优化方案。从硬件配置检查到软件依赖安装,再到核心组件配置与中文语义增强,教程涵盖全流程操作指南,帮助用户快速掌握AI文生图模型的本地部署技巧,提升创作效率。

weixin_30752699的博客 312

算法数据结构——玩转贪心算法(Greedy Algorithm)使用套路及具体应用实例讲解

贪心算法(Greedy Algorithm):一种在每次决策时,总是采取在当前状态下的最好选择,从而希望导致结果是最好或最优的算法。贪心算法是一种改进的「分步解决算法」,其核心思想是:将求解过程分成「若干个步骤」,然后根据题意选择一种「度量标准」,每个步骤都应用「贪心原则」,选取当前状态下「最好 / 最优选择(局部最优解)」,并以此希望最后得出的结果也是「最好 / 最优结果(全局最优解)」。

白话机器学习 2420

使用CLion在Window端进行linux开发

        以往不管是开发x86端linux程序还是arm端linux程序,都是使用Source Insight作为源码编辑工具的,如下图      去年底,发现CLion的2018.3更新版本,可以支持remote host开发了,大爱!     我是基于以下几点原因,将开发工具换成CLion 1. 语法高亮较明显、跳转、重构方便(我很看重这个); 2. 可以使用图形界面进行调...

alist的笔记专栏 1万+

【unity】Google 登录和Google支付接入unity

google 支付 google 登录

云渊寒烬 8495

数据结构与算法设计分析——贪心算法的应用

贪心算法是指不考虑整体上的综合最优决策,而在局部上以最优决策来解决问题,即每次选择的都是最优的解决方案,不考虑该决策对整体的影响。这种方法在处理一些情况下,可以得到最优解的很好近似方案,例如,哈夫曼编码、求最小生成树中的普里姆算法(Prim)克鲁斯卡尔算法(Kruskal)、求单源最短路径中的迪杰斯特拉算法(Dijkstra)等算法。首先,对整体最优解采用贪心算法进行`分解`,将其化为若干个小规模的子问题,这些子问题是相互独立的,然后通过数学归纳法证明,在每一步的选择中,可以依据贪心策略在当前子问题中选择出

小宇y的博客 1853

KV STUDIO的安装与实践(一)

KV STUDIO是一种软件开发工具,用于编写、调试和管理基于Key-Value(键-值)存储的应用程序。KV STUDIO提供了一个集成开发环境(IDE),使开发人员可以方便地创建和管理键-值数据库,并编写逻辑和业务规则来操作和查询这些数据。它支持多种编程语言和平台,并提供了丰富的API和工具来简化开发过程。使用KV STUDIO,开发人员可以快速构建高效、可靠的键-值存储系统,并实现各种应用程序,如缓存、会话管理、配置存储等。本次使用plc进行案例讲解,结合小编的亲身经历,仅供参考!

weixin_47514459的博客 6352

贪心算法应用

贪心算法刷题笔记

0start1的博客 843

Underactuated Robotics - 欠驱动机器人学(一)- 全驱动与欠驱动系统

根据牛顿的观点,机械系统的动力学是二阶的(其状态由位置向量 q(也称为配置向量)和速度向量以及(可能还有)时间给出。二阶控制动力系统的一般形式是:其中 u 是控制向量。定义 1.1 (欠驱动控制微分方程) 二阶控制微分方程描述如下:在状态和时间 t 中,如果所得到的映射是可射的:对于每一个,都存在一个能产生预期响应的,那么系统就是全驱动的。否则,就是欠驱动(状态在时间 t)。

机器人控制与仿真应用 3377

2、探索谷歌云平台(GCP):入门指南

本文全面介绍了谷歌云平台(GCP)的入门知识,涵盖其全球基础设施、核心服务和使用方法。内容包括GCP区域与可用区结构、创建免费账户、配置计算资源(如GCE虚拟机)、存储类型(PD、Filestore、GCS)、网络架构(VPC)、组织与项目管理、身份访问控制(IAM),以及计算、存储、数据库、大数据和人工智能等各类云服务。文章还提供了资源规划、安全管理和成本控制等实用建议,帮助用户快速上手并高效利用GCP构建可扩展的云解决方案。

uber9的博客 255

【智能算法】贪心算法原理及其MATLAB实现

本文介绍了贪心算法的基本原理、应用场景及MATLAB实现方法。贪心算法通过局部最优选择逐步构建全局最优解,其核心在于贪心选择性质和最优子结构性质。文章重点分析了活动安排、部分背包问题和霍夫曼编码三个典型应用场景,并提供了部分背包问题的MATLAB实现代码及测试结果。虽然贪心算法具有简单高效、时间复杂度低等优点,但也存在无法保证全局最优解、适用条件苛刻等局限性。未来可探索将贪心算法与其他算法结合来解决更复杂的问题,并深入研究其适用条件和优化方法。

大雨淅淅的博客 1183

裸眼3D技术发展与应用前景

这项技术利用传感器或摄像头实时监测观众的位置和视角,然后根据观众的位置信息动态调整投射的图像,确保不同位置的观众都能看到一致的3D效果。这种技术不仅可以在电影院和家庭影院中应用,还可以用于虚拟现实设备和大型展览等领域。裸眼3D呈现是一种不需要佩戴任何特殊设备(如3D眼镜或头盔)即可观看到3D效果的技术。这种技术近年来得到了快速发展,为观众带来了更加沉浸式的视觉体验。总之,裸眼3D呈现技术的发展为观众带来了更加真实、沉浸式的视觉体验。随着技术的不断进步和创新,相信未来裸眼3D将会在更多领域得到应用和推广。

学无止境 1993

【智能算法】贪心算法原理及其Python实现

贪心算法是一种在每一步选择中都采取当前最优解的算法策略,通过局部最优解逐步构建全局解。本文介绍了贪心算法的基本概念、特点(简单高效但可能无法得到全局最优解)、应用场景(找零问题、活动选择、分数背包等),并提供了Python代码实现示例。文章还详细阐述了贪心算法的解题步骤:问题分解、确定贪心策略、求解子问题和合成全局最优解。最后强调贪心算法虽高效但适用性有限,建议根据问题特点灵活选择合适的算法。

大雨淅淅的博客 1227

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

贪心算法详细介绍(贪心算法与动态规划的区别)

贪心算法 当一个问题具有最优子结构性质时,可用动态规划法求解。有时会有更简单有效的算法。考察找硬币的例子。假设有4种硬币,它们的面值分别为二角五分、一角、五分和一分。现在要找给顾客六角三分钱。这时,自然地拿出2个二角五分的硬币、1个一角的硬币和3个一分的硬币交给顾客。这种找硬币方法与其他找法相比,拿出的硬币个数是最少的。**这里使用的找硬币算法为:首先选出一个面值不超过六角三分的最大硬币,即二角五分;然后从六角三分中减去三角五分,剩下三角八分;再选出一个面值不超过三角八分的最大硬币,即又一个二角五分,如此一

wangzhening的博客 8657

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

贪心算法从入门到进阶:原理剖析、LeetCode 实战及经典案例详解、避坑指南、高效实践策略与进阶应用

文章围绕贪心算法展开,从“糖果分配问题”引入,阐述其核心思想。文中介绍贪心算法的三要素、适用条件判断矩阵、验证方法、失效场景,对比与动态规划的区别。通过活动选择、霍夫曼编码等经典案例和LeetCode高频考题,展示其应用。还分析了算法的优劣,以旅行商和0-1背包问题为例说明失败原因,并给出混合贪心-回溯改进策略。最后介绍了拟阵理论和近似算法中贪心算法在集合覆盖、最大覆盖等问题的应用,帮助读者全面学习贪心算法。

m0_74496615的博客 3149

RU DOS版、EFI版32bit/64bit BIOS常用工具

DOS版、EFI版的RU工具,可用来查看IO、MEM、PCI、SMBIOS等资源。亲测在EFI SHELL下可用。

贪心算法【转自百度百科】

原文地址:【转自百度百科】">贪心算法 【转自百度百科】作者:佳佳贪心算法 贪心算法(又称贪婪算法)是指,在对问题求解时,总是做出在当前看来是最好的选择。也就是说,不从整体最优上加以考虑,他所做出的仅是在某种意义上的局部最优解。贪心算法不是对所有问题都能得到整体最优解,但对范围相当广泛的许多问题他能产生整体最优解或者是整体最优解的近似解。 目录 贪心算法概念 贪心算法特性 贪心算法的基

jiqiujia的专栏 869

数据结构与算法 - 贪心算法

答:简单来说就是建立【字符】到【数字】的对应关系,如下面大家熟知的ASCⅡ编码表,例如,可以查表得知字符【a】对应的数字是十六进制数【0x61】

ltt159264的博客 2364

java数据结构和算法——贪心算法

目录一、贪心算法介绍二、贪心算法最佳应用——集合覆盖问题示例需求三、穷举法——实现合覆盖问题思路分析四、贪心算法——实现合覆盖问题思路分析五、贪心算法——实现合覆盖问题图解分析六、贪心算法——实现合覆盖代码示例 一、贪心算法介绍 贪婪算法(贪心算法)是指在对问题进行求解时,在每一步选择中都采取最好或者最优(即最有利)的选择,从而希望能够导致结果是最好或者最优的算法。 贪婪算法所得到的结果不一定是最优的结果(有时候会是最优解),但是都是相对近似(接近)最优解的结果。 二、贪心算法最佳应用——集合覆盖问题示

小志的博客 692

贪心算法及常见例子(附python实现代码)

贪心算法应用范围十分广泛,在许多不同的领域都有运用。同时,该算法也是非常重要的,在许多大厂面试题中都有其身影。

weixin_51148634的博客 5712

贪心算法

贪心 ​ 贪心算法就是遵循某种规则,不断贪心地选取当前最有策略的算法设计方法。不从整体最优上加以考虑,它所做出的仅仅是在某种意义上的局部最优解。 ​ 贪心算法没有固定的算法框架,算法设计的关键是贪心策略的选择。必须注意的是,贪心算法不是对所有问题都能得到整体最优解,选择的贪心策略必须具备无后效性。所以,对所采用的贪心策略一定要仔细分析其是否满足无后效性。 无后效性:某个状态以前的过程不会影响以后的状态,只与当前状态有关。 基本思路 建立数学模型来描述问题 把求解的问题分成若干个子问题 对每个子问题求

shui2104的博客 309

点覆盖的贪心算法_贪心算法简介

贪婪算法贪心算法(Greedy Algorithm) 简介贪心算法,又名贪婪法,是寻找最优解问题的常用方法,这种方法模式一般将求解过程分成若干个步骤,但每个步骤都应用贪心原则,选取当前状态下最好/最优的选择(局部最有利的选择),并以此希望最后堆叠出的结果也是最好/最优的解。{看着这个名字,贪心,贪婪这两字的内在含义最为关键。这就好像一个贪婪的人,他事事都想要眼前看到最好的那个,看不到长远的东西,也...

weixin_39710991的博客 327

贪心算法应用:数据包调度问题详解

贪心算法应用:数据包调度问题详解

专注分享技术、实用优质教程、资源 769

贪心算法详解

贪心算法基本原理贪心算法的核心就是贪,就是总是做出当前看来最优的选择,因此可知,贪心算法不从整体去考虑,它做出的选择也是局部最优选择,从而达到全局优化选择。虽然贪心算法不一定能得到最优解,但是对很多问题,它是能够得到整体最优解的,因此贪心算法是否能到最优解,需要严格证明。贪心算法产生有化解的条件 贪心选择性质: 若一个问题的全局最优解可以通过局部最优解来得到,则说明该问题具有贪心选择性质。 优化子

XXX 1万+

活动安排问题与贪心算法

贪心算法: 在求最优解问题的过程中,依据某种贪心标准,从问题的初始状态出发,直接去求每一步的最优解,通过若干次的贪心选择,最终得出整个问题的最优解,这种求解方法就是贪心算法。 从贪心算法的定义可以看出,贪心算法不是从整体上考虑问题,它所做的选择只是在某种意义上的局部最优解,而由问题自身的特性决定了该题运用贪心算法可以得到最优解。 如果一个问题同时可以用几种问题解决,贪心算法应该是最好的选择之一...

努力进阶的小菜鸟 2895
上一篇: 视频语义分割基准数据集与评估方法
下一篇: 滑动窗口常用技巧总结
vcjmhg
博客等级 码龄11年 27粉丝 94原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值