《贪心算法:原理剖析与典型例题精解》
必刷的贪心算法典型例题!
算法竞赛(蓝桥杯)贪心算法1——数塔问题-CSDN博客
算法竞赛(蓝桥杯)贪心算法2——需要安排几位师傅加工零件-CSDN博客
算法(蓝桥杯)贪心算法3——二维数组排序与贪心算法——活动选择-CSDN博客
算法(蓝桥杯)贪心算法4——拦截导弹的系统数量求解-CSDN博客
算法(蓝桥杯)贪心算法5——删数问题的解题思路-CSDN博客
算法(蓝桥杯)贪心算法6——均分纸牌问题的解题思路与代码实现-CSDN博客
算法(蓝桥杯)贪心算法7——过河的最短时间问题解析-CSDN博客
贪心算法:在选择中追求最优解
在算法的世界里,贪心算法是一种简单而强大的策略,它如同一位精明的决策者,在每一步都做出看似最优的选择,以期达到全局的最优解。本文将带你深入了解贪心算法的原理、特点、应用场景以及局限性,让你对这一算法有全面而清晰的认识。
一、贪心算法的定义与原理
贪心算法是一种在每一步选择中都采取当前状态下最优(即最有利)的选择,从而希望导致结果是全局最优的算法。它的核心思想是“贪心”,即在解决问题的过程中,总是做出局部最优的选择,希望通过一系列局部最优的选择来达到全局最优解。
举个简单的例子,假设你面前有一堆硬币,有1元、5角、1角等不同面值,现在需要凑出3元7角。贪心算法的思路就是先选择面值最大的硬币,也就是1元硬币,尽可能多地拿,直到不能再拿为止。然后选择次大的5角硬币,继续尽可能多地拿……按照这种贪心的策略,最终可以凑出所需的金额。在这个过程中,每一步都选择了当前能拿的最大的硬币,这就是局部最优的选择,而通过这种方式,最终也得到了全局最优的解,即用最少的硬币数凑出了3元7角。
二、贪心算法的特点
(一)简单直观
贪心算法的逻辑非常简单,它不需要复杂的数学推导和大量的数据结构支持,只需按照一定的规则在每一步做出选择即可。这种简单性使得贪心算法容易理解和实现,对于一些简单的问题,甚至可以直接凭借直觉写出贪心算法的解决方案。例如在解决“找零钱”问题时,按照硬币面值从大到小依次选择,这种思路几乎人人都能迅速理解并应用。
(二)高效性
由于贪心算法在每一步都只考虑当前的最优选择,而不需要回溯或者考虑其他可能的选择,因此它的执行效率通常很高。在很多情况下,贪心算法的时间复杂度相对较低,能够快速得到问题的解。比如在“活动安排问题”中,通过按照活动结束时间对活动进行排序,然后依次选择不冲突的活动,这个过程的时间复杂度主要取决于排序操作,通常为O(nlogn),在处理大量数据时,这种高效的算法能够显著节省时间和计算资源。
(三)局限性
然而,贪心算法并非万能的。它的局限性在于不能保证对所有问题都能得到全局最优解。因为贪心算法只是在每一步选择局部最优解,而这些局部最优解组合起来并不一定就是全局最优解。有些问题可能存在多种选择路径,而贪心算法可能会因为早期的错误选择而陷入局部最优的陷阱,从而无法得到真正的全局最优解。例如在“背包问题”中,如果单纯按照物品价值从高到低或者单位价值(价值/重量)从高到低的顺序选择物品放入背包,可能会导致背包无法充分利用,从而得不到最大价值的解。
三、贪心算法的应用场景
(一)活动安排问题
假设有一个教室,需要安排多个活动,每个活动都有开始时间和结束时间。如何安排这些活动,使得这个教室能够容纳尽可能多的活动呢?这就是一个典型的活动安排问题。使用贪心算法,可以按照活动结束时间对活动进行排序,然后依次选择结束时间最早的活动,并且保证选择的活动之间不冲突。通过这种方式,能够最大化教室的利用率,安排尽可能多的活动。
(二)最短路径问题
在图论中,求解从一个顶点到另一个顶点的最短路径是一个常见的问题。Dijkstra算法就是一种基于贪心思想的算法,用于解决单源最短路径问题。它从源点开始,按照距离源点的远近依次选择顶点,每次选择距离源点最近且未被访问过的顶点,然后更新该顶点到其他顶点的距离。通过这种贪心的选择策略,Dijkstra算法能够逐步构建出从源点到图中所有顶点的最短路径树,从而得到最短路径。
(三)霍夫曼编码
在数据压缩领域,霍夫曼编码是一种广泛应用的压缩算法。它通过构建霍夫曼树来实现对字符的高效编码。在构建霍夫曼树的过程中,贪心算法发挥了关键作用。每次选择频率最低的两个字符(或者节点)进行合并,然后更新字符的频率,重复这个过程,直到所有字符都被合并到一棵树中。通过这种方式构建的霍夫曼树能够保证字符的编码长度与其频率成反比,从而实现对数据的有效压缩。
四、贪心算法的实现步骤
实现贪心算法通常需要遵循以下步骤:
(一)建立数学模型
首先,需要对问题进行分析,建立一个数学模型来描述问题。明确问题的目标是什么,需要做出哪些选择,以及这些选择之间的关系。例如在“最小生成树问题”中,数学模型就是一个带权图,目标是找到一棵生成树,使得树的总权重最小。
(二)确定贪心策略
根据问题的特点和数学模型,确定一个贪心策略,即在每一步选择中,如何做出局部最优的选择。这个策略需要能够清晰地指导算法在每一步应该选择什么。例如在“最小生成树问题”中,可以采用Prim算法的贪心策略,每次选择权重最小的边,将一个新的顶点加入到生成树中;或者采用Kruskal算法的贪心策略,按照边的权重从小到大依次选择边,只要这条边不会与已经选择的边构成环,就将其加入到生成树中。
(三)逐步求解
按照确定的贪心策略,从初始状态开始,逐步进行选择,直到得到问题的解。在每一步选择中,都需要根据当前的状态和贪心策略来做出决策,并更新当前的状态。例如在“哈夫曼编码”中,从初始的字符集合开始,按照贪心策略逐步选择频率最低的字符进行合并,每次合并后更新字符集合,直到构建出完整的霍夫曼树。
(四)验证解的正确性
得到解之后,需要对解进行验证,确保它满足问题的要求。对于一些问题,可以通过与已知的最优解进行比较来验证;对于没有已知最优解的问题,可以通过逻辑推理或者测试不同的输入来验证解的正确性。例如在“活动安排问题”中,验证得到的活动安排是否满足活动之间不冲突的要求,以及是否确实安排了尽可能多的活动。
五、总结
贪心算法是一种简单、高效的算法策略,在很多问题中都能发挥重要作用。它通过在每一步选择局部最优解,希望能够得到全局最优解。虽然贪心算法不能保证对所有问题都能得到最优解,但在很多实际问题中,它能够快速得到一个相对较好的解。了解贪心算法的原理、特点和应用场景,可以帮助我们在面对问题时,快速判断是否可以使用贪心算法来解决,从而提高解决问题的效率。在实际应用中,我们需要结合问题的具体情况,灵活运用贪心算法,同时也要注意其局限性,避免陷入局部最优的陷阱。
相关文章:

《贪心算法:原理剖析与典型例题精解》
必刷的贪心算法典型例题! 算法竞赛(蓝桥杯)贪心算法1——数塔问题-CSDN博客 算法竞赛(蓝桥杯)贪心算法2——需要安排几位师傅加工零件-CSDN博客 算法(蓝桥杯)贪心算法3——二维数组排序与贪心算…...

【网络协议】【http】【https】RSA+AES-TLS1.2
【网络协议】【http】【https】RSAAES-TLS1.2 https并不是一个协议 而是在传输层之间添加了SSL/TLS协议 TLS 协议用于应用层协议(如 HTTP)和传输层(如 TCP)之间,增加了一层安全性来解决 HTTP 存在的问题,H…...

【数据库】MySQL数据库之约束与多表查询
约束 1.概述 概念:约束是作用于表中字段上的规则,用于限制存储在表中的数据目的:保证数据库中数据的正确性、有效性,完整性和一致性分类: 注意:约束是作用于表中字段上的,可以在创建表/修改表…...
【Pandas】pandas Series dot
Pandas2.2 Series Binary operator functions 方法描述Series.add()用于对两个 Series 进行逐元素加法运算Series.sub()用于对两个 Series 进行逐元素减法运算Series.mul()用于对两个 Series 进行逐元素乘法运算Series.div()用于对两个 Series 进行逐元素除法运算Series.true…...

02UML图(D2_行为图)
目录 学习前言 ---------------------------------- 讲解一:活动图 ---------------------------------- 讲解二:用例图 ---------------------------------- 讲解三:状态机图 ---------------------------------- 讲解四:…...

Kali环境变量技巧(The Environment Variable Technique Used by Kali
Kali环境变量技巧 朋友们好,我们今天继续更新《黑客视角下的Kali Linux的基础与网络管理》中的管理用户环境变量。为了充分利用我们的黑客操作系统Kali Linux,我们需要理解和善于使用环境变量,这样会使我们的工具更具便利,甚至具…...

【C++】如何从源代码编译红色警戒2地图编辑器
【C】如何从源代码编译红色警戒2地图编辑器 操作视频视频中的代码不需要下载三方库,已经包含三方库。 一、运行效果:二、源代码来源及编程语言:三、环境搭建:安装红警2安装VS2022下载代码,源代码其实不太多,…...

安路FPGA开发工具TD:问题解决办法 及 Tips 总结
安路科技(Anlogic)是一家专注于高性能、低功耗可编程逻辑器件(FPGA)设计和生产的公司。其提供的开发工具TD(TangDynasty)是专门为安路FPGA系列产品设计的集成开发环境(IDE)。以下是对…...

【Django开发】django美多商城项目完整开发4.0第12篇:商品部分,表结构【附代码文档】
本教程的知识点为: 项目准备 项目准备 配置 1. 修改settings/dev.py 文件中的路径信息 2. INSTALLED_APPS 3. 数据库 用户部分 图片 1. 后端接口设计: 视图原型 2. 具体视图实现 用户部分 使用Celery完成发送 判断帐号是否存在 1. 判断用户名是否存在 后…...

IDEA2023版中TODO的使用
介绍:TODO其实本质上还是注释,只不过加上了TODO这几个字符,可以让使用者快速找到。 注意:在类、接口等文件中,注释是使用// 即:// TODO 注释内容 在配置文件中,注释是使用# 即:# TO…...

windows 搭建flutter环境,开发windows程序
环境安装配置: 下载flutter sdk https://docs.flutter.dev/get-started/install/windows 下载到本地后,随便找个地方解压,然后配置下系统环境变量 编译windows程序本地需要安装vs2019或更新的开发环境 主要就这2步安装后就可以了࿰…...
支持向量机算法(三):非线性支持向量原理层层拆解,精读公式每一处细节
支持向量机算法(一):像讲故事一样讲明白它的原理及实现奥秘-CSDN博客 支持向量机算法(二):层层拆解,精读公式每一处细节-CSDN博客 支持向量机算法(一)、算法࿰…...

一文读懂iOS中的Crash捕获、分析以及防治
Crash系统性总结 Crash捕获与分析Crash收集符号化分析 Crash类别以及解法分析子线程访问UI而导致的崩溃unrecognized selector send to instance xxxKVO crashKVC造成的crashNSTimer导致的Crash野指针Watch Dog超时造成的crash其他crash待补充 参考文章: 对于iOS端开…...

代码随想录刷题day11|(链表篇)206.翻转链表
目录 一、链表理论基础 二、翻转链表思路 双指针解法 递归解法 三、相关算法题目 四、总结 一、链表理论基础 代码随想录 (programmercarl.com) 二、翻转链表思路 两种方法:双指针解法和递归解法 双指针解法 首先定义一个指针curr,初始化为原…...

【STM32-学习笔记-8-】I2C通信
文章目录 I2C通信Ⅰ、硬件电路Ⅱ、IIC时序基本单元① 起始条件② 终止条件③ 发送一个字节④ 接收一个字节⑤ 发送应答⑥ 接收应答 Ⅲ、IIC时序① 指定地址写② 当前地址读③ 指定地址读 Ⅳ、MPU6050---6轴姿态传感器(软件I2C)1、模块内部电路2、寄存器地…...
2025年1月17日(点亮三色LED)
系统信息: Raspberry Pi Zero 2W 系统版本: 2024-10-22-raspios-bullseye-armhf Python 版本:Python 3.9.2 已安装 pip3 支持拍摄 1080p 30 (1092*1080), 720p 60 (1280*720), 60/90 (640*480) 已安装 vim 已安装 git 学习目标:…...

ASP .NET Core 学习 (.NET 9)- 创建 API项目,并配置Swagger及API 分组或版本
本系列为个人学习 ASP .NET Core学习全过程记录,基于.NET 9 和 VS2022 ,实现前后端分离项目基础框架搭建和部署,以简单、易理解为主,注重页面美观度和后台代码简洁明了,可能不会使用过多的高级语法和扩展,后…...

mysql-5.7.18保姆级详细安装教程
本文主要讲解如何安装mysql-5.7.18数据库: 将绿色版安装包mysql-5.7.18-winx64解压后目录中内容如下图,该例是安装在D盘根目录。 在mysql安装目录中新建my.ini文件,文件内容及各配置项内容如下图,需要先将配置项【skip-grant-tab…...

RK3588平台开发系列讲解(NPU篇)NPU 驱动的组成
文章目录 一、NPU 驱动组成二、查询 NPU 驱动版本三、查询 rknn_server 版本四、查询 librknn_runtime 版本沉淀、分享、成长,让自己和他人都能有所收获!😄 一、NPU 驱动组成 NPU 驱动版本、rknn_server 版本、librknn_runtime 版本以及 RKNN Toolkit 版本的对应关系尤为重…...
ESP32学习笔记_FreeRTOS(6)——Event and Notification
摘要(From AI): 这篇博客详细介绍了 FreeRTOS 中的事件组和任务通知机制,讲解了事件组如何通过位操作实现任务间的同步与通信,以及任务如何通过通知机制进行阻塞解除和数据传递。博客提供了多个代码示例,展示了如何使用事件组和任务通知在多任…...
进程地址空间(比特课总结)
一、进程地址空间 1. 环境变量 1 )⽤户级环境变量与系统级环境变量 全局属性:环境变量具有全局属性,会被⼦进程继承。例如当bash启动⼦进程时,环 境变量会⾃动传递给⼦进程。 本地变量限制:本地变量只在当前进程(ba…...

Zustand 状态管理库:极简而强大的解决方案
Zustand 是一个轻量级、快速和可扩展的状态管理库,特别适合 React 应用。它以简洁的 API 和高效的性能解决了 Redux 等状态管理方案中的繁琐问题。 核心优势对比 基本使用指南 1. 创建 Store // store.js import create from zustandconst useStore create((set)…...

定时器任务——若依源码分析
分析util包下面的工具类schedule utils: ScheduleUtils 是若依中用于与 Quartz 框架交互的工具类,封装了定时任务的 创建、更新、暂停、删除等核心逻辑。 createScheduleJob createScheduleJob 用于将任务注册到 Quartz,先构建任务的 JobD…...
鸿蒙中用HarmonyOS SDK应用服务 HarmonyOS5开发一个医院查看报告小程序
一、开发环境准备 工具安装: 下载安装DevEco Studio 4.0(支持HarmonyOS 5)配置HarmonyOS SDK 5.0确保Node.js版本≥14 项目初始化: ohpm init harmony/hospital-report-app 二、核心功能模块实现 1. 报告列表…...
AI编程--插件对比分析:CodeRider、GitHub Copilot及其他
AI编程插件对比分析:CodeRider、GitHub Copilot及其他 随着人工智能技术的快速发展,AI编程插件已成为提升开发者生产力的重要工具。CodeRider和GitHub Copilot作为市场上的领先者,分别以其独特的特性和生态系统吸引了大量开发者。本文将从功…...
代理篇12|深入理解 Vite中的Proxy接口代理配置
在前端开发中,常常会遇到 跨域请求接口 的情况。为了解决这个问题,Vite 和 Webpack 都提供了 proxy 代理功能,用于将本地开发请求转发到后端服务器。 什么是代理(proxy)? 代理是在开发过程中,前端项目通过开发服务器,将指定的请求“转发”到真实的后端服务器,从而绕…...
Mobile ALOHA全身模仿学习
一、题目 Mobile ALOHA:通过低成本全身远程操作学习双手移动操作 传统模仿学习(Imitation Learning)缺点:聚焦与桌面操作,缺乏通用任务所需的移动性和灵活性 本论文优点:(1)在ALOHA…...
高效线程安全的单例模式:Python 中的懒加载与自定义初始化参数
高效线程安全的单例模式:Python 中的懒加载与自定义初始化参数 在软件开发中,单例模式(Singleton Pattern)是一种常见的设计模式,确保一个类仅有一个实例,并提供一个全局访问点。在多线程环境下,实现单例模式时需要注意线程安全问题,以防止多个线程同时创建实例,导致…...

VM虚拟机网络配置(ubuntu24桥接模式):配置静态IP
编辑-虚拟网络编辑器-更改设置 选择桥接模式,然后找到相应的网卡(可以查看自己本机的网络连接) windows连接的网络点击查看属性 编辑虚拟机设置更改网络配置,选择刚才配置的桥接模式 静态ip设置: 我用的ubuntu24桌…...

推荐 github 项目:GeminiImageApp(图片生成方向,可以做一定的素材)
推荐 github 项目:GeminiImageApp(图片生成方向,可以做一定的素材) 这个项目能干嘛? 使用 gemini 2.0 的 api 和 google 其他的 api 来做衍生处理 简化和优化了文生图和图生图的行为(我的最主要) 并且有一些目标检测和切割(我用不到) 视频和 imagefx 因为没 a…...