Python应用算法之贪心算法理解和实践
一、什么是贪心算法?
贪心算法(Greedy Algorithm)是一种简单而高效的算法设计思想,其核心思想是:在每一步选择中,都采取当前状态下最优的选择(即“局部最优解”),希望通过一系列局部最优解最终达到全局最优解。虽然贪心算法并不总是能得到全局最优解,但在许多问题中,它能够快速找到近似最优解。
1. 贪心算法的优缺点
优点
- 高效性:通常时间复杂度较低,适合解决大规模问题。
- 简单性:实现简单,易于理解和应用。
- 实用性:在许多实际问题中(如调度、路径规划等),贪心算法能快速找到近似最优解。
缺点
- 局限性:贪心算法并不总是能得到全局最优解。
- 适用范围有限:需要满足贪心选择性质和最优子结构性质。
2. 贪心算法的适用场景
贪心算法适用于满足以下条件的问题:
- 贪心选择性质:可以通过局部最优选择逐步构造全局最优解。
- 最优子结构:问题的最优解可以通过子问题的最优解构造。
- 如果不满足上述条件,贪心算法可能无法得到正确结果。例如,在某些情况下,动态规划可能是更好的选择。
二、贪心算法经典问题与解法
1. 贪心算法的核心思想
贪心算法的特点可以总结为以下几点:
(1)局部最优选择
在每一步决策时,选择当前看起来最优的选项。
不考虑未来的后果,也不回溯之前的决策。
(2)无后效性
一旦做出某个选择,就不会再改变。
每一步的决策只依赖于当前状态,而不依赖于之前的状态。
(3)贪心选择性质
全局最优解可以通过一系列局部最优选择来构造。
(4)最优子结构性质
问题的最优解包含其子问题的最优解。
2. 经典贪心算法示例
2.1 活动选择问题
问题描述:
给定一组活动,每个活动有开始时间和结束时间,要求选择尽可能多的互不冲突的活动。
算法描述:
按活动的结束时间排序。
每次选择最早结束的活动,并排除与之冲突的活动。
代码实现:
def activity_selection(start, finish):# 按结束时间排序activities = sorted(zip(start, finish), key=lambda x: x[1])selected = []last_finish_time = -1for start_time, finish_time in activities:if start_time >= last_finish_time: # 如果活动不冲突selected.append((start_time, finish_time))last_finish_time = finish_timereturn selected# 调用函数
start_times = [1, 3, 0, 5, 8, 5]
finish_times = [2, 4, 6, 7, 9, 9]
print("Selected activities:", activity_selection(start_times, finish_times))
2.2 分数背包问题(Fractional Knapsack Problem)
问题描述:
给定一组物品,每个物品有重量和价值,要求在不超过背包容量的情况下,最大化总价值。允许将物品分割。
算法描述:
计算每个物品的单位价值(价值/重量)。
按单位价值从高到低排序。
尽量装入单位价值最高的物品,直到背包装满。
代码实现:
def fractional_knapsack(weights, values, capacity):# 计算单位价值并排序items = sorted([(v / w, w, v) for v, w in zip(values, weights)],key=lambda x: x[0],reverse=True)total_value = 0for value_per_weight, weight, value in items:if capacity >= weight:total_value += valuecapacity -= weightelse:total_value += value_per_weight * capacitybreakreturn total_value# 调用函数
weights = [10, 20, 30]
values = [60, 100, 120]
capacity = 50
print("Maximum value:", fractional_knapsack(weights, values, capacity))
3. 贪心算法刷力扣题
3.1 无重叠区间(LeetCode原题435题)
问题描述
给定一个区间的集合 intervals,其中 intervals[i] = [start_i, end_i],返回需要移除的最小区间数量,使得剩余区间互不重叠。
解题思路:
按区间的结束时间排序。
每次选择最早结束的区间,并移除与之重叠的区间。
代码实现:
def eraseOverlapIntervals(intervals):if not intervals:return 0intervals.sort(key=lambda x: x[1]) # 按结束时间排序count = 0end = intervals[0][1]for i in range(1, len(intervals)):if intervals[i][0] < end: # 当前区间与前一个区间重叠count += 1else:end = intervals[i][1] # 更新结束时间return count
# 调用函数
intervals = [[1, 2], [2, 3], [3, 4], [1, 3]]
print(eraseOverlapIntervals(intervals))
# 输出: 1
3.2 跳跃游戏(LeetCode 原题55题)
问题描述:
给定一个非负整数数组 nums,你最初位于数组的第一个位置。数组中的每个元素代表你在该位置可以跳跃的最大长度。判断你是否能够到达最后一个位置。
解题思路:
维护一个变量 max_reach 表示当前能到达的最远位置。
遍历数组时,更新 max_reach,如果当前位置超过了 max_reach,则无法到达终点。
代码实现:
def canJump(nums):max_reach = 0for i, jump in enumerate(nums):if i > max_reach: # 当前位置不可达return Falsemax_reach = max(max_reach, i + jump)return max_reach >= len(nums) - 1# 调用函数
nums = [2, 3, 1, 1, 4]
print(canJump(nums))
# 输出: True
4. 优化方法
4.1 数据预处理
(1)排序
贪心算法通常依赖于某种顺序(如活动的结束时间、物品的单位价值等),因此对数据进行适当的排序是关键。
使用高效的排序算法(如快速排序或归并排序)可以减少预处理的时间开销。
(2)去重或过滤
在某些情况下,可以通过去重或过滤无效数据来减少计算量。
4.2 使用优先队列优化选择过程
当需要动态选择当前最优元素时,可以使用优先队列(如最小堆或最大堆)来加速选择过程。
4.3 并行化与分布式计算
对于独立的子问题,可以使用多线程或多进程并行处理。
4.4 近似算法优化
(1)放松约束条件
在某些情况下,可以通过放松约束条件来简化问题,从而使贪心算法更高效。
例如,在分数背包问题中,允许分割物品可以显著简化问题。
(2)局部搜索优化
在贪心算法的基础上,可以通过局部搜索(如交换相邻元素)进一步优化结果。
示例:任务调度问题
使用贪心算法生成初始调度方案后,通过交换任务顺序来减少总完成时间。
三、总结
贪心算法,名思义,总是做出当前的最优选择,即期望通过局部的最优选择获得整体的最优选择。
某种意义上说,贪心算法是很贪婪、很目光短浅的,它不从整体考虑,仅仅只关注当前的最大利益,所以说它做出的选择仅仅是某种意义上的局部最优,但是贪心算法在很多问题上还是能够拿到最优解或较优解。
1. 注意事项
(1)适用条件:问题需满足贪心选择性质(局部最优可推导全局最优)和最优子结构。例如,分数背包满足贪心性质,而0-1背包不满足。
(2)验证必要性:贪心策略的正确性需通过数学归纳法或反证法严格证明。
相关文章:
Python应用算法之贪心算法理解和实践
一、什么是贪心算法? 贪心算法(Greedy Algorithm)是一种简单而高效的算法设计思想,其核心思想是:在每一步选择中,都采取当前状态下最优的选择(即“局部最优解”),希望通…...
网络运维学习笔记 017HCIA-Datacom综合实验01
文章目录 综合实验1实验需求总部特性 分支8分支9 配置一、 基本配置(IP二层VLAN链路聚合)ACC_SWSW-S1SW-S2SW-Ser1SW-CoreSW8SW9DHCPISPGW 二、 单臂路由GW 三、 vlanifSW8SW9 四、 OSPFSW8SW9GW 五、 DHCPDHCPGW 六、 NAT缺省路由GW 七、 HTTPGW 综合实…...
C++(17):为optional类型构造对象
C++(17):optional,多了一个合理的选择_c++17 max-CSDN博客 介绍了optional做为函数返回值的一种方式 其实optional也可以作为对象来使用 #include &...
Maven导入hutool依赖报错-java: 无法访问cn.hutool.core.io.IORuntimeException 解决办法
欢迎大家来到我的博客~欢迎大家对我的博客提出指导,有错误的地方会改进的哦~点击这里了解更多内容 目录 一、报错二、解决办法 一、报错 <dependency><groupId>cn.hutool</groupId><artifactId>hutool-captcha</artifactId> </de…...
Simulink库浏览器中有大量的模型组件工具箱介绍
Simulink库浏览器中有大量的模型组件工具箱,包括Simulink工具箱、Autosar工具箱、电机控制工具箱等,其中Simulink工具箱包含了几十个的子模块,这里介绍下这些子模块的功能,帮助读者全面的了解这些功能模块,在今后的模型…...
从0到1:固件分析
固件分析 0x01 固件提取 1、从厂商官网下载 例如D-link的固件: https://support.dlink.com/resource/products/ 2、代理或镜像设备更新时的流量 发起中间人攻击MITM #启用IP转发功能 echo 1 > /proc/sys/net/ipv4/ip_forward#配置iptables,将目…...
模电知识点总结(6)
1.选取频率高于1000Hz的信号时,可选用高通滤波器;抑制50Hz的交流干扰时,可选用带阻滤波器如果希望抑制500Hz以下的信号,可选用高通滤波器。 2.有用信号频率高于1000Hz,可选用高通滤波器;希望抑制50Hz的交流…...
【Java学习】多态
目录 一、方法相同 二、方法重写 1.概念 2.条件 三、向上转型 1.概念 2.方式 四、方法绑定 五、多态 一、方法相同 方法相同要求方法名相同、参数列表相同、返回值类型相同(与两方法修饰的访问限定符相不相同、静态非静态状态相不相同无关),而且在子类与父…...
Oracle 深入理解Lock和Latch ,解析访问数据块全流程
Oracle 锁机制介绍 根据保护对象的不同,单实例Oracle数据库锁可以分为以下几大类: DML lock(data locks,数据锁):用于保护数据的完整性; DDL lock(dictionary locks,字典…...
什么是事务?并发事务引发的问题?什么是MVCC?
文章目录 什么是事务?并发事务引发的问题?什么是MVCC?1.事务的四大特性2.并发事务下产生的问题:脏读、不可重复读、幻读3.如何应对并发事务引发的问题?4.什么是MVCC?5.可见性规则?参考资料 什么…...
【JavaEE进阶】MyBatis通过注解实现增删改查
目录 🍃前言 🍀打印日志 🌴传递参数 🎋增(Insert) 🚩返回主键 🎄删(Delete) 🌲改(Update) 🌳查(Select) 🚩起别名 🚩结果映射 🚩开启驼…...
Uptime Kuma实现业务接口自定义逻辑监控
背景 在现代分布式架构中,业务系统通常由多个微服务组成,微服务之间通过接口进行数据交互。为了确保业务的正常运行,我们需要对这些接口进行监控,及时发现并处理异常情况。然而,由于业务数据接口的复杂性,通用的监控方式往往难以满足需求,需要自定义逻辑来判断接口数据是否异常…...
基于 JavaWeb 的 Spring Boot 调查问卷管理系统设计和实现(源码+文档+部署讲解)
技术范围:SpringBoot、Vue、SSM、HLMT、Jsp、PHP、Nodejs、Python、爬虫、数据可视化、小程序、安卓app、大数据、物联网、机器学习等设计与开发。 主要内容:免费功能设计、开题报告、任务书、中期检查PPT、系统功能实现、代码编写、论文编写和辅导、论…...
新手小白学习棒球规则·棒球1号位
新手小白学习棒球规则,可以从以下几个方面入手: 一、球场与球员 • 球场布局:棒球场呈菱形,由四个垒位(一垒、二垒、三垒和本垒)和一个投手板组成,外围是外场区域。内场为正方形,四…...
单元测试的策略有哪些,主要包括什么?
单元测试的策略及主要内容 单元测试(Unit Testing)是指对软件系统中的最小可测试单元(通常是一个函数、方法或类)进行验证,以确保其行为符合预期。常见的单元测试策略可以分为基于代码的策略和基于数据的策略…...
深度学习之图像回归(一)
前言 图像回归任务主要是理解一个最简单的深度学习相关项目的结构,整体的思路,数据集的处理,模型的训练过程和优化处理。 因为深度学习的项目思路是差不多的,主要的区别是对于数据集的处理阶段,之后模型训练有一些小…...
Docker 替换到 Containerd (nerdctl相关指令)
因为docker不给用了,所以使用Containerd来代替 前置准备 安装 Containerd # 安装 containerd yum install -y yum-utils yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo yum install -y containerd.io # 生成默认配置文件 mkdir -p…...
Ollama API 参考文档
文档来源:API 参考文档 -- Ollama 中文文档|Ollama官方文档 端点 生成完成生成聊天完成创建模型列出本地模型显示模型信息复制模型删除模型拉取模型推送模型生成嵌入列出正在运行的模型版本...
PHP房屋出租出售高效预约系统小程序源码
🏠 房屋出租出售高效预约系统 —— 您的智能找房新选择 💡 这是一款集智慧与匠心于一体的房屋出租出售预约系统,它巧妙地融合了ThinkPHP与Uniapp两大先进框架,精心打造而成。无论是小程序、H5网页,还是APP端ÿ…...
学习threejs,使用MeshBasicMaterial基本网格材质
👨⚕️ 主页: gis分享者 👨⚕️ 感谢各位大佬 点赞👍 收藏⭐ 留言📝 加关注✅! 👨⚕️ 收录于专栏:threejs gis工程师 文章目录 一、🍀前言1.1 ☘️THREE.MeshBasicMaterial 二…...
SpringBoot-17-MyBatis动态SQL标签之常用标签
文章目录 1 代码1.1 实体User.java1.2 接口UserMapper.java1.3 映射UserMapper.xml1.3.1 标签if1.3.2 标签if和where1.3.3 标签choose和when和otherwise1.4 UserController.java2 常用动态SQL标签2.1 标签set2.1.1 UserMapper.java2.1.2 UserMapper.xml2.1.3 UserController.ja…...
业务系统对接大模型的基础方案:架构设计与关键步骤
业务系统对接大模型:架构设计与关键步骤 在当今数字化转型的浪潮中,大语言模型(LLM)已成为企业提升业务效率和创新能力的关键技术之一。将大模型集成到业务系统中,不仅可以优化用户体验,还能为业务决策提供…...
Cursor实现用excel数据填充word模版的方法
cursor主页:https://www.cursor.com/ 任务目标:把excel格式的数据里的单元格,按照某一个固定模版填充到word中 文章目录 注意事项逐步生成程序1. 确定格式2. 调试程序 注意事项 直接给一个excel文件和最终呈现的word文件的示例,…...
在HarmonyOS ArkTS ArkUI-X 5.0及以上版本中,手势开发全攻略:
在 HarmonyOS 应用开发中,手势交互是连接用户与设备的核心纽带。ArkTS 框架提供了丰富的手势处理能力,既支持点击、长按、拖拽等基础单一手势的精细控制,也能通过多种绑定策略解决父子组件的手势竞争问题。本文将结合官方开发文档,…...
【第二十一章 SDIO接口(SDIO)】
第二十一章 SDIO接口 目录 第二十一章 SDIO接口(SDIO) 1 SDIO 主要功能 2 SDIO 总线拓扑 3 SDIO 功能描述 3.1 SDIO 适配器 3.2 SDIOAHB 接口 4 卡功能描述 4.1 卡识别模式 4.2 卡复位 4.3 操作电压范围确认 4.4 卡识别过程 4.5 写数据块 4.6 读数据块 4.7 数据流…...
1688商品列表API与其他数据源的对接思路
将1688商品列表API与其他数据源对接时,需结合业务场景设计数据流转链路,重点关注数据格式兼容性、接口调用频率控制及数据一致性维护。以下是具体对接思路及关键技术点: 一、核心对接场景与目标 商品数据同步 场景:将1688商品信息…...
AI编程--插件对比分析:CodeRider、GitHub Copilot及其他
AI编程插件对比分析:CodeRider、GitHub Copilot及其他 随着人工智能技术的快速发展,AI编程插件已成为提升开发者生产力的重要工具。CodeRider和GitHub Copilot作为市场上的领先者,分别以其独特的特性和生态系统吸引了大量开发者。本文将从功…...
JVM暂停(Stop-The-World,STW)的原因分类及对应排查方案
JVM暂停(Stop-The-World,STW)的完整原因分类及对应排查方案,结合JVM运行机制和常见故障场景整理而成: 一、GC相关暂停 1. 安全点(Safepoint)阻塞 现象:JVM暂停但无GC日志,日志显示No GCs detected。原因:JVM等待所有线程进入安全点(如…...
Web 架构之 CDN 加速原理与落地实践
文章目录 一、思维导图二、正文内容(一)CDN 基础概念1. 定义2. 组成部分 (二)CDN 加速原理1. 请求路由2. 内容缓存3. 内容更新 (三)CDN 落地实践1. 选择 CDN 服务商2. 配置 CDN3. 集成到 Web 架构 …...
推荐 github 项目:GeminiImageApp(图片生成方向,可以做一定的素材)
推荐 github 项目:GeminiImageApp(图片生成方向,可以做一定的素材) 这个项目能干嘛? 使用 gemini 2.0 的 api 和 google 其他的 api 来做衍生处理 简化和优化了文生图和图生图的行为(我的最主要) 并且有一些目标检测和切割(我用不到) 视频和 imagefx 因为没 a…...
