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

贪心算法理论

系列博客目录


文章目录

  • 系列博客目录
  • 贪心算法 (Greedy Algorithm)
  • 贪心算法的特点
  • 贪心算法的适用条件
  • 常见的贪心算法问题
  • 贪心算法的步骤
  • 贪心算法示例:活动选择问题
  • 贪心算法的优缺点


贪心算法 (Greedy Algorithm)

贪心算法是一种在每一步选择中都采取当前状态下最优的选择,从而希望得到全局最优解的算法。贪心算法的基本思想是通过局部最优的选择来逐步接近全局最优解。它并不回溯,且每一步的选择只基于当前信息,不考虑后续可能的影响。

贪心算法的特点

  1. 局部最优选择:在每一步选择中,贪心算法都会选择当前看来最优的选项,不会考虑全局的影响。
  2. 无后悔:选择一旦做出,就不会再回头修改。
  3. 贪心选择性质:贪心算法的每一个局部最优选择并不保证全局最优,适用的情况需要问题具有贪心选择性质最优子结构

贪心算法的适用条件

  1. 贪心选择性质:通过局部最优的选择可以得到全局最优解。
  2. 最优子结构:问题的最优解包含其子问题的最优解。即,通过递归求解子问题来得到最终的最优解。

常见的贪心算法问题

  • 活动选择问题(Activity Selection Problem):给定一组活动及其开始时间和结束时间,选择最多的活动,使得它们相互不冲突。

  • 背包问题(0-1背包问题的贪心解法):虽然 0-1 背包问题不能用贪心算法获得最优解,但在某些变种(如分数背包问题)中,贪心算法能够得到最优解。

  • 哈夫曼编码(Huffman Coding):一种用于数据压缩的算法,利用贪心选择构建最优的前缀码。

  • 最小生成树问题(Kruskal算法、Prim算法):通过贪心选择构建图的最小生成树。

  • 单源最短路径问题(Dijkstra算法):用贪心算法求解从一个顶点到所有其他顶点的最短路径。

贪心算法的步骤

  1. 选择:在当前问题的状态下,选择一个看起来最优的解。
  2. 可行性检查:检查所选择的解是否满足约束条件。
  3. 选择结果:将选择的解加入到当前解的集合中。
  4. 问题规模减少:更新问题状态,减少问题的规模,进入下一个选择阶段。
  5. 重复:继续执行选择,直到满足停止条件。

贪心算法示例:活动选择问题

假设有一组活动,每个活动有一个开始时间和结束时间,目标是选择不冲突的活动数量最多的子集。

输入:
活动的开始时间和结束时间,例如:

活动 1: (1, 4)
活动 2: (2, 5)
活动 3: (3, 6)
活动 4: (5, 7)
活动 5: (8, 9)

贪心选择步骤:

  1. 按结束时间排序:将活动按结束时间排序,以确保每次选择结束时间最早的活动。
    排序后的活动:活动 1 (1, 4),活动 2 (2, 5),活动 3 (3, 6),活动 4 (5, 7),活动 5 (8, 9)

  2. 选择活动

    • 选择活动 1,结束时间为 4。
    • 下一步选择活动 4(活动 2 和活动 3与活动 1冲突),结束时间为 7。
    • 最后选择活动 5,结束时间为 9。

输出:
最多的活动是活动 1、活动 4 和活动 5,数量为 3。

贪心算法的优缺点

优点:

  1. 实现简单:贪心算法通常实现简单,容易理解。
  2. 效率高:很多贪心算法的时间复杂度较低,通常是线性的或对数级别的,适用于大规模问题。

缺点:

  1. 不能保证最优解:贪心算法并不总是能找到问题的最优解,特别是对于复杂问题(如 0-1 背包问题)。
  2. 不适用于所有问题:只有满足贪心选择性质和最优子结构的情况,贪心算法才会有效。

总结

贪心算法是一种适用于特定类型问题的策略,通过选择局部最优解来构造全局最优解。它简单且高效,但并不是所有问题都能通过贪心算法获得最优解,因此在使用时需要确保问题满足贪心算法的适用条件。

相关文章:

贪心算法理论

系列博客目录 文章目录 系列博客目录贪心算法 (Greedy Algorithm)贪心算法的特点贪心算法的适用条件常见的贪心算法问题贪心算法的步骤贪心算法示例:活动选择问题贪心算法的优缺点 贪心算法 (Greedy Algorithm) 贪心算法是一种在每一步选择中都采取当前状态下最优的…...

JVM之Synthetic

Synthetic是人造,合成的意思,在虚拟机很多地方使用ACC_SYNTHETIC表示编译器自动生成的,区别于我们自己写的程序代码。这样说可能比较模糊,我们举个例子:我们创建一个内部类,如下 public class TestInnerCl…...

HCIE IGP双栈综合实验

实验拓扑 实验需求及解法 本实验模拟ISP网络结构,R1/2组成国家骨干网,R3/4组成省级网络,R5/6/7组成数据中 心网络。 配置所有ipv4地址,请自行测试直连。 R1 sysname R1 interface GigabitEthernet0/0/0ip address 12.1.1.1 255.…...

【k8s】监控metrics-server

metrics-server介绍 Metrics Server是一个集群范围的资源使用情况的数据聚合器。作为一个应用部署在集群中。Metric server从每个节点上KubeletAPI收集指标,通过Kubernetes聚合器注册在Master APIServer中。为集群提供Node、Pods资源利用率指标。 就像Linux 系统一样…...

第六届国际科技创新学术交流会暨管理科学信息化与经济创新发展(MSIEID 2024)

重要信息 大会官网:msieid2024.iaecst.org (点击了解大会,参会等内容) 大会时间:2024年12月6-8日 大会地点:中国-广州 大会简介 随着全球化和信息化的不断深入,管理科学、信息化和经济发展…...

将面具贴到人脸上的过程

使用OpenCV进行人脸面具贴合和变形以适应人脸的3D透视角度,通常需要以下步骤: 人脸检测:首先需要检测图像中的人脸位置。特征点检测:在检测到的人脸区域中,找到关键特征点,如眼睛、鼻子、嘴巴等。透视变换…...

【Maven】Nexus私服

6. Maven的私服 6.1 什么是私服 Maven 私服是一种特殊的远程仓库,它是架设在局域网内的仓库服务,用来代理位于外部的远程仓库(中央仓库、其他远程公共仓库)。一些无法从外部仓库下载到的构件,如项目组其他人员开发的…...

AI高中数学教学视频生成技术:利用通义千问、MathGPT、视频多模态大模型,语音大模型,将4个模型融合 ,生成高中数学教学视频,并给出实施方案。

大家好,我是微学AI,今天给大家介绍一下AI高中数学教学视频生成技术:利用通义千问、MathGPT、视频多模态大模型,语音大模型,将4个模型融合 ,生成高中数学教学视频,并给出实施方案。本文利用专家模…...

探索温度计的数字化设计:一个可视化温度数据的Web图表案例

随着科技的发展,数据可视化在各个领域中的应用越来越广泛。在温度监控和展示方面,传统的温度计已逐渐被数字化温度计所取代。本文将介绍一个使用Echarts库创建的温度计Web图表,该图表通过动态数据可视化展示了温度值,并通过渐变色…...

windows电脑上安装树莓派操作系统

在Windows电脑上安装树莓派通常涉及以下几个步骤:准备安装工具、下载树莓派系统镜像、烧录系统到SD卡、配置树莓派以及远程连接(如果需要无显示器操作)。以下是详细的步骤说明: 一、准备安装工具 安装树莓派官方烧录工具: 下载并安装Raspberry Pi Imager。这是一个官方的…...

交换机四大镜像(端口镜像、流镜像、VLAN镜像、MAC镜像)应用场景、配置实例及区别对比

在网络管理中,端口镜像、流镜像、VLAN镜像和MAC镜像都是用于监控和分析网络流量的重要技术。 端口镜像(Port Mirroring) 定义:端口镜像是将一个或多个源端口的流量复制到一个目标端口,以便于网络管理员能够监控和分析…...

我不是挂王-用python实现燕双鹰小游戏

一.准备工作 1.前言提要 作为程序员在浩瀚的数字宇宙中,常常感觉现实世界是一台精密运作的虚拟机,其底层的物理逻辑如同铁律般难以撼动。然而我们拥有在虚拟世界中自由驰骋、创造无限可能的独特力量。突发奇我想用Python写出燕双鹰的小游戏,这样想想就很…...

Java:反射、注解

文章目录 1. 反射1-1. 获取Class对象的三种方式1-2. 获取类的构造器、实例化对象1-3. 获取类的成员变量1-4. 获取类的成员方法 2. 注解2-1. 元注解2-2. 解析注解 1. 反射 反射:加载类,并允许以编程的方式解剖类中的各种成员变量、方法、构造器。 1-1. …...

Java 通过枚举类减少if else

目录 一. 案例1二. 案例2三. 案例3四. 案例4 枚举类聚合封装消息 一. 案例1 涉及到EnumMap的实际使用 ⏹定义一个枚举类,用来表示日本的各种支付方法对应的code import com.fasterxml.jackson.annotation.JsonFormat;// 让jackson将前台的数据封装数据到枚举类中 J…...

单链表---移除链表元素

对于无头单向不循环链表,给出头结点head与数值val,删除链表中数据值val的所有结点 #define ListNodeDataType val struct ListNode { struct ListNode* psll;ListNodeDataType val; } 方法一---遍历删除 移除所有数值为val的链表结点,…...

认识redis 及 Ubuntu安装redis

文章目录 一. redis概念二. redis应用场景二. redis的特性四. 使用Ubuntu安装redis 一. redis概念 redis 是在内存中存储数据的中间件, 用在分布式系统 redis是客户端服务器结构的程序, 客户端服务器之间通过网络来通信 二. redis应用场景 redis可用作数据库 类似MySQL, 但…...

Java开发网络安全常见问题

1、敏感信息明文传输 用户敏感信息如手机号、银行卡号、验证码等涉及个人隐私的敏感信息不通过任何加密直接明文传输。 如下图中小红书APP 的手机短信验证码登录接口,此处没有对用户手机号和验证码等信息进行加密传输,可以很简单的截取并开展一些合法的…...

C#基础之委托,事件

文章目录 1 委托1.1 简介1.2 操作使用1.2.1 声明委托(Delegate)1.2.2 实例化委托(Delegate)1.2.3 直接调用和invoke1.2.4 Invoke 和 BeginInvoke 1.3 委托的多播1.4 委托的匿名和lambda1.4.1 匿名方法1.4.2 lambda 表达式 1.5 内置…...

nginx配置静态资源的访问

比如静态资源图片位于/mnt/software/nginx/html/static/images目录下,那么nginx.conf中的配置则为: # 静态文件目录 location /static/images/ { root /mnt/software/nginx/html; try_files $uri $uri/ 404; #找不到时提示404 …...

JS的魔法三角:constructor、prototype与__proto__

在JavaScript中,constructor、prototype和__proto__是与对象创建和继承机制紧密相关的三个概念。理解它们之间的关系对于掌握JavaScript的面向对象编程至关重要。下面将详细介绍这个魔法三角: 1. constructor 定义:constructor是一个函数&am…...

探索光伏 - 电池充电模型:稳定直流输出电压的技术之旅

光伏-电池充电模型,可以很好的稳定直流输出电压 采用最大功率跟踪MPPT算法,通过boost电路输出电压,电池侧采用电压电流PI双闭环控制,通过双向电路给电池充放电 直流侧参考电压为48v在光伏能源领域,确保稳定的直流输出电…...

Java TCC到底要不要用?90%团队踩坑的4个认知误区,今天一次性说透

第一章:Java TCC到底要不要用?90%团队踩坑的4个认知误区,今天一次性说透TCC(Try-Confirm-Cancel)作为分布式事务的一种经典模式,在 Java 生态中常被误认为“高可用银弹”或“微服务标配”。但真实生产实践中…...

基于Qwen3-ASR的智能会议纪要系统:从语音识别到文本摘要全流程

基于Qwen3-ASR的智能会议纪要系统:从语音识别到文本摘要全流程 1. 系统整体效果展示 今天给大家展示一个基于Qwen3-ASR-1.7B语音识别模型构建的智能会议纪要系统。这个系统不仅能准确识别会议中的语音内容,还能自动区分不同说话人,提取关键…...

3分钟搞定百度网盘提取码!这款免费神器让你告别繁琐搜索

3分钟搞定百度网盘提取码!这款免费神器让你告别繁琐搜索 【免费下载链接】baidupankey 项目地址: https://gitcode.com/gh_mirrors/ba/baidupankey 还在为百度网盘资源提取码而烦恼吗?每次遇到需要密码的分享链接,你是不是都要在评论…...

手把手改造Ruoyi-vue-plus权限体系:给多租户增加动态数据权限控制

深度定制Ruoyi-vue-plus多租户数据权限:从架构设计到前端适配全解析 在当今企业级应用开发中,多租户系统已成为SaaS服务的标配,而数据权限控制则是确保租户间数据隔离的核心机制。Ruoyi-vue-plus作为国内流行的快速开发框架,其原生…...

别只看显存!租GPU跑AI模型,这5个隐藏参数才是省钱关键

别只看显存!租GPU跑AI模型,这5个隐藏参数才是省钱关键 当你在租赁平台上看到两款价格相近的24GB显存显卡时,是否曾困惑为何实际训练速度相差30%以上?显存容量只是GPU性能的冰山一角,真正影响性价比的往往是那些产品页面…...

Python原生AOT编译2026架构设计图(含C-API二进制兼容性矩阵+GC停顿压缩至≤80μs实证)

第一章:Python原生AOT编译2026架构全景概览Python原生AOT(Ahead-of-Time)编译在2026年已演进为一套融合语言语义、运行时契约与硬件感知能力的系统级基础设施。它不再依赖传统解释器或JIT中间态,而是通过静态类型推导、控制流图全…...

Java应用等保三级合规改造:3天完成代码层、配置层、运维层全栈优化(附Checklist)

第一章:Java应用等保三级合规改造全景图等保三级是国家网络安全等级保护制度中面向重要信息系统的核心要求,对Java应用而言,合规改造不是单一技术点的修补,而是一套覆盖开发、运行、运维全生命周期的安全治理工程。其核心目标在于…...

Windows驱动存储深度管理:从问题诊断到系统优化的完整解决方案

Windows驱动存储深度管理:从问题诊断到系统优化的完整解决方案 【免费下载链接】DriverStoreExplorer Driver Store Explorer [RAPR] 项目地址: https://gitcode.com/gh_mirrors/dr/DriverStoreExplorer 问题发现:驱动管理中的隐形痛点与风险 系…...

Kandinsky-5.0-I2V-Lite-5s保姆级教程:从访问https://gpu-1pm4kagkou-7860.web.gpu.csdn.net/开始

Kandinsky-5.0-I2V-Lite-5s保姆级教程:从访问https://gpu-1pm4kagkou-7860.web.gpu.csdn.net/开始 1. 认识Kandinsky-5.0-I2V-Lite-5s Kandinsky-5.0-I2V-Lite-5s是一款轻量级的图生视频模型,它能将静态图片转化为动态视频。你只需要上传一张图片&…...