文章目录

        • 一、贪心算法的基本概念
        • 二、贪心算法的适用条件
        • 三、贪心算法的设计步骤
        • 四、贪心算法的经典应用场景
          • 1. 区间调度问题
          • 2. 背包问题
          • 3. 最小生成树(MST)
          • 4. 单源最短路径(Dijkstra算法)
          • 5. 霍夫曼编码
          • 6. 零钱兑换
        • 五、贪心算法的正确性证明方法
        • 六、贪心算法与动态规划的对比
        • 七、贪心算法的经典例题与解法
          • 1. 跳跃游戏(LeetCode 55)
          • 2. 分发饼干(LeetCode 455)
          • 3. 柠檬水找零(LeetCode 860)
          • 4. 加油站(LeetCode 134)
        • 八、贪心算法的陷阱与注意事项
        • 九、贪心算法的核心思想总结

一、贪心算法的基本概念

定义:贪心算法是指在求解问题时,每一步都选择当前状态下的最优解(局部最优),从而希望最终达到全局最优的算法策略。其核心思想是“目光短浅”,不考虑整体影响,仅关注当前步骤的最佳选择。

二、贪心算法的适用条件

贪心算法并非对所有问题有效,需满足以下性质:

  1. 贪心选择性质:问题的全局最优解可以通过一系列局部最优选择达到。
  2. 最优子结构:问题的最优解包含子问题的最优解。
三、贪心算法的设计步骤
  1. 确定问题的最优子结构:分析问题是否可分解为子问题,且子问题的最优解构成全局最优解。
  2. 定义贪心策略:确定每一步选择的“最优”标准(如最小代价、最大收益、最短距离等)。
  3. 证明策略正确性:通过数学归纳法或反证法证明局部最优选择可推导出全局最优解(关键难点)。
  4. 实现算法:根据策略设计具体步骤,通常结合数据结构(如优先队列、排序)优化效率。
四、贪心算法的经典应用场景
1. 区间调度问题
  • 问题描述:给定多个区间,选择不重叠的最大区间集合。
  • 贪心策略:按区间结束时间排序,每次选结束时间最早的区间,确保剩余时间最大化。
  • 示例:活动选择问题(LeetCode 435. 无重叠区间)。
2. 背包问题
  • 0-1背包(不适用贪心):物品不可分割,需用动态规划(贪心可能选到总价非最优的组合)。
  • 分数背包(适用贪心):物品可分割,按“单位重量价值”从高到低选择,填满背包。
  • 策略:性价比 = 价值/重量,优先选性价比高的物品。
3. 最小生成树(MST)
  • Kruskal算法:按边权从小到大选边,用并查集避免环,直到连通所有节点(贪心选最小边)。
  • Prim算法:从任意节点出发,每次选连接当前树与未连接节点的最小边(贪心选最小边)。
4. 单源最短路径(Dijkstra算法)
  • 策略:维护各节点到源点的最短距离,每次选距离最小的未访问节点,更新其邻接节点的距离(贪心选当前最短路径)。
  • 前提:图中边权非负,否则需用Bellman-Ford算法。
5. 霍夫曼编码
  • 目标:为字符生成最优前缀编码,使编码总长度最短。
  • 策略:按字符频率构建霍夫曼树,频率低的字符分配较长编码,频率高的分配较短编码(贪心选频率最小的两个节点合并)。
6. 零钱兑换
  • 问题:用最少硬币数凑出金额amount(若硬币面值满足“贪心性质”,如1、5、10、25)。
  • 策略:每次选不超过剩余金额的最大面值硬币。
  • 注意:若面值不满足贪心性质(如1、3、4,凑6时贪心选4+1+1,实际最优为3+3),需用动态规划。
五、贪心算法的正确性证明方法
  1. 交换论证法:假设存在一个最优解与贪心解不同,通过交换两者的部分选择,证明贪心解可以转化为最优解,且不会更差。
  2. 数学归纳法:证明对于所有子问题,贪心策略能得到最优解,进而推导出全局最优。
  3. 反证法:假设贪心策略不能得到最优解,推导出矛盾,从而证明策略的正确性。
六、贪心算法与动态规划的对比
特性贪心算法动态规划
决策方式只看当前最优(局部最优)考虑所有可能,记录子问题解
时间复杂度通常更低(O(n logn)或O(n))通常更高(O(n²)或O(nk))
适用场景满足贪心选择性质和最优子结构需考虑子问题重叠和最优子结构
经典问题区间调度、Kruskal、Dijkstra0-1背包、最长公共子序列
七、贪心算法的经典例题与解法
1. 跳跃游戏(LeetCode 55)
  • 问题:给定数组numsnums[i]表示从位置i可跳跃的最大距离,判断是否能到达最后一个位置。
  • 贪心策略:维护当前能到达的最远位置max_reach,遍历数组时更新max_reach,若当前位置超过max_reach则失败。
  • 代码思路
    def canJump(nums):max_reach, n = 0, len(nums)for i in range(n):if i > max_reach:  # 无法到达当前位置return Falsemax_reach = max(max_reach, i + nums[i])if max_reach >= n - 1:  # 提前到达终点return Truereturn True
    
2. 分发饼干(LeetCode 455)
  • 问题:每个孩子有需求值g[i],每个饼干有大小s[j],求最多能满足多少孩子(孩子得到的饼干需≥需求)。
  • 贪心策略:将gs排序,每次用能满足当前孩子的最小饼干(避免浪费大饼干)。
  • 代码思路
    def findContentChildren(g, s):g.sort()s.sort()i = j = 0while i < len(g) and j < len(s):if s[j] >= g[i]:  # 饼干满足孩子需求i += 1j += 1return i
    
3. 柠檬水找零(LeetCode 860)
  • 问题:柠檬水5元,顾客付5、10、20元,求能否给所有顾客正确找零。
  • 贪心策略:优先用大面值零钱找零(但需保留足够的5元给后续顾客)。
  • 实现:记录5元和10元的数量,付20元时优先用10+5,其次用3张5元。
4. 加油站(LeetCode 134)
  • 问题:环形路线上有n个加油站,每个加油站有油量gas[i],从i到i+1需消耗cost[i],求是否存在起点绕一圈。
  • 贪心策略:若总油量≥总消耗,则必存在解;遍历加油站,当累计油量为负时,重置起点为下一个加油站。
八、贪心算法的陷阱与注意事项
  1. 局部最优≠全局最优:贪心策略可能在某些情况下失效(如零钱兑换问题中的非贪心面值),需先证明策略正确性。
  2. 策略选择的多样性:同一问题可能有多种贪心策略,需选择能导向全局最优的策略(如区间调度按结束时间排序比按开始时间更优)。
  3. 结合数据结构优化:优先队列(堆)、排序、哈希表等常与贪心算法结合,提升效率(如Dijkstra用优先队列优化)。
九、贪心算法的核心思想总结

贪心算法的本质是通过“短视”的局部最优选择,逐步构建全局最优解,其优势在于实现简单、效率高,但适用范围受限于问题的贪心性质。在实际应用中,需先分析问题是否满足贪心条件,再设计策略并验证正确性。对于不满足条件的问题,动态规划或回溯算法可能是更优的选择。

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

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

相关文章

在 AWS 上重构数据中台,这家出海企业选择了数栈

2024年&#xff0c;袋鼠云接到了一个不小的挑战。 一家货币交易所的技术负责人在通话里直接说&#xff1a;“我们现在业务都跑在 AWS&#xff08;亚马逊云平台&#xff09; 上了&#xff0c;你们的产品&#xff08;数栈大数据平台&#xff09;能不能不改代码直接跑在 AWS 上&a…

STM32CubeIDE中文注释变乱码终极解决方案:3步设置永久解决锟斤拷问题!

STM32CubeIDE中文注释变乱码终极解决方案&#xff1a;3步设置永久解决锟斤拷问题&#xff01; 前言简述问题STM32CubeIDE的设置STM32CubeIDE软件的设置当前工程设置 最重要的一环——添加环境变量重要秘方具体做法 前言 你是否在STM32CubeIDE中遇到过这样的崩溃场景&#xff1…

Windows VMWare Centos环境下安装Docker并配置MySql

虚拟机安装 官网下载Centos Stream 10系统镜像 安装了Minimal版&#xff0c;Terminal中粘贴、复制指令不方便&#xff0c;又新建了虚拟机&#xff0c;安装GUI版 终端输入指令报错修复 输入指令报错&#xff1a;failed to set locale defaulting to C.UTF-8&#xff0c;安装语言…

AI能力集成设计与Prompt策略

AI能力集成设计与Prompt策略 在智能客服系统中引入AI能力&#xff0c;必须建立一套架构化、可扩展的AI服务集成体系&#xff0c;并根据不同业务场景制定Prompt策略&#xff0c;从而实现稳定、精准、高效的AI响应能力。 AI能力集成的关键组件设计 AI能力集成架构的核心在于通…

深入剖析 CVE-2021-3560 与 CVE-2021-4034:原理、区别与联系

CVE-2021-3560 和 CVE-2021-4034 是 2021 年曝光的两个 Linux 本地权限提升漏洞&#xff0c;均涉及 Polkit 组件。由于它们影响广泛且利用门槛较低&#xff0c;迅速引起安全社区关注。本文将深入分析这两个漏洞的技术原理、影响范围、区别与联系&#xff0c;并结合实际案例&…

Jupyter Notebook 完全指南:从入门到生产力工具

Jupyter Notebook 完全指南&#xff1a;从入门到生产力工具 Jupyter Notebook 已成为数据科学、机器学习和科研领域的标准工具&#xff0c;它完美结合了代码、文档和可视化功能。本文将带您全面了解 Jupyter 的强大功能&#xff0c;并展示如何将其转化为您的超级生产力工具。 …

HKDF密钥派生原理与应用详解

HKDF&#xff08;HMAC-Based Key Derivation Function&#xff09;是一种基于 HMAC&#xff08;Hash-based Message Authentication Code&#xff09;的密钥派生函数&#xff0c;用于从原始密钥材料&#xff08;如共享密钥、随机数等&#xff09;生成多个加密密钥&#xff08;如…

SpringBoot + MyBatis 事务管理全解析:从 @Transactional 到 JDBC Connection 的旅程

SpringBoot MyBatis 事务管理全解析&#xff1a;从 Transactional 到 JDBC Connection 的旅程 一、JDBC Connection&#xff1a;事务操作的真正执行者1.1 数据库事务的本质1.2 Spring 与 Connection 的协作流程 二、从 Transactional 到 JDBC Connection 的完整链路2.1 Spring…

Wpf之应用图标的修改!

前言 Wpf之应用图标的修改&#xff01; 一、修改步骤 1、准备好ico图片。 2、右键项目》点击属性 3、找到win32资源点击 4、点击浏览找到ioc图标 5、点击运行程序 6、右键项目点击打开在资源管理器中打开 找到以下路径 在该路径下能看到.exe文件的图标已经改成你想要的…

Spring Boot整合Redis指南

一、环境准备 在开始整合前&#xff0c;请确保已完成以下准备工作&#xff1a; 已安装Redis服务&#xff08;安装指南&#xff09;创建好Spring Boot项目 二、添加依赖 在项目的pom.xml中添加以下依赖&#xff1a; <!-- Redis核心依赖 --> <dependency><gr…

Re-攻防世界

easyEZbaby_app Jadx 这个文件一般是窗口界面&#xff0c;点击中间的一般就是主函数 Obj1是用户名&#xff0c;obj2是密码 用户名 public boolean checkUsername(String str) { if (str ! null) { try { if (str.length() ! 0 &&…

矩阵题解——搜索二维矩阵 II【LeetCode】

240. 搜索二维矩阵 II 1.1 核心思想 问题描述&#xff1a;给定一个 m x n 的二维矩阵&#xff0c;矩阵的每一行从左到右递增&#xff0c;每一列从上到下递增。判断目标值 target 是否存在于矩阵中。解决思路&#xff1a; 从矩阵的右上角&#xff08;或左下角&#xff09;开始搜…

dockerfile文件详解之基础语法

dockerfile文件详解之基础语法 一般而言 Dockerfile 可以分为4个部分 &#xff08;1&#xff09;基础镜像信息&#xff0c; &#xff08;2&#xff09;维护者信息 &#xff08;3&#xff09;镜像操作命令 &#xff08;4&#xff09;启动时执行指令 1-注释 用 # 来进行注…

WebFuture:独立一级域名nginx取消配置Secure属性的问题

问题分析&#xff1a; 部分站群站点使用了独立一级域名&#xff0c;但是前台问卷调查等模块无法提交&#xff0c;排查是由于主站启用了https&#xff0c;配置了cookies的Secure属性是true&#xff0c;但是子站的独立一级域名没有使用https&#xff0c;所以浏览器不能写入cooki…

【网站内容安全检测】之3:获取所有外部域名访问后图像

Go语言调用Chrome浏览器去进行截图的操作&#xff0c;对电脑的性能要求比较高&#xff0c;所以速度比较有限&#xff0c;但是目前来看这种方式可以最佳的去获取网页加载后的结果。 main.go package mainimport ("context""errors""flag""…

华曦达港股IPO递表,AI Home生态构建智能生活新蓝图

在智能家居逐渐普及的当下&#xff0c;华曦达打造的AI Home生态为用户提供了更智能、便捷的生活解决方案&#xff0c;在行业中展现出独特优势。 华曦达AI Home生态由AI Home系统平台、AI Home基础设施、AI Home设备以及可连接外部设备的开放式设备矩阵构成&#xff0c;是一个开…

java+vue+SpringBoo智慧农业专家远程指导系统(程序+数据库+报告+部署教程+答辩指导)

源代码数据库LW文档&#xff08;1万字以上&#xff09;开题报告答辩稿ppt部署教程代码讲解代码时间修改工具 技术实现 开发语言&#xff1a;后端&#xff1a;Java 前端&#xff1a;vue框架&#xff1a;springboot数据库&#xff1a;mysql 开发工具 JDK版本&#xff1a;JDK1.…

免费AI助手工具深度测评:Claude4本地化部署与实战应用指南

免费AI助手工具深度测评&#xff1a;Claude4本地化部署与实战应用指南 AI无限对话免费Rovo工具Claude4碾压cursor和augment 前言 在AI工具日益普及的今天&#xff0c;大多数高质量的AI助手都需要付费订阅或有使用限制。然而&#xff0c;最近发现了一款基于Claude 4的免费AI助手…

MCP浏览器工具:playwright、chrome-mcp

参考&#xff1a; https://github.com/microsoft/playwright-mcp https://github.com/hangwin/mcp-chrome chrome-mcp安装需要额外安装成浏览器插件 用cherrystudio v1.4.5测试 mcp配置&#xff1a; "chrome-mcp-server": {"name": "chrome-mcp-serve…

水利水电安全员考试不同等级的考试内容有哪些区别?

水利水电安全员考试一般分为企业主要负责人&#xff08;A 类&#xff09;、项目负责人&#xff08;B 类&#xff09;和专职安全生产管理人员&#xff08;C 类&#xff09;三个等级。不同等级的考试内容都包括安全生产知识和管理能力两部分&#xff0c;但具体的侧重点有所不同。…