Python之贪心算法

Python实现贪心算法(Greedy Algorithm)

概念

贪心算法是一种在每一步选择中都采取当前状态下最优的选择,从而希望导致结果是全局最优的算法策略。

基本特点

  1. 局部最优选择:每一步都做出当前看起来最佳的选择
  2. 不可回退:一旦做出选择,就不可更改
  3. 高效性:通常比其他全局优化算法更快
  4. 不保证全局最优:但能得到近似最优解

基本实现框架

(以分数背包问题为栗子)

def greedy_algorithm(items, capacity):# 通常先按某种规则排序items.sort(key=lambda x: x[1]/x[0], reverse=True)#按单位重量价值(value/weight)降序排序total_value = 0 #背包中物品的总价值selected_items = [] #选择的物品列表(完整或部分物品)#开始选择for item in items:if capacity >= item[0]:capacity -= item[0]total_value += item[1]selected_items.append(item)else:# 可选: 部分物品的情况(如分数背包问题)fraction = capacity / item[0]total_value += item[1] * fractionselected_items.append((item[0]*fraction, item[1]*fraction))breakreturn total_value, selected_items

经典应用示例 😍 😍

1. 找零钱问题

def coin_change(coins, amount):coins.sort(reverse=True)count = 0change = []for coin in coins:while amount >= coin:amount -= coincount += 1change.append(coin)return count if amount == 0 else -1, change# 示例
coins = [25, 10, 5, 1]
print(coin_change(coins, 63))  # 输出: (6, [25, 25, 10, 1, 1, 1])

2. 区间调度问题

def interval_scheduling(intervals):# 按结束时间排序intervals.sort(key=lambda x: x[1])selected = []last_end = -float('inf')for start, end in intervals:if start >= last_end:selected.append((start, end))last_end = endreturn selected# 示例
intervals = [(1, 3), (2, 4), (3, 5), (4, 6)]
print(interval_scheduling(intervals))  # 输出: [(1, 3), (3, 5)]

3. 霍夫曼编码(数据压缩)

import heapqdef huffman_encoding(freq):heap = [[weight, [symbol, ""]] for symbol, weight in freq.items()]heapq.heapify(heap)while len(heap) > 1:lo = heapq.heappop(heap)hi = heapq.heappop(heap)for pair in lo[1:]:pair[1] = '0' + pair[1]for pair in hi[1:]:pair[1] = '1' + pair[1]heapq.heappush(heap, [lo[0] + hi[0]] + lo[1:] + hi[1:])return sorted(heapq.heappop(heap)[1:], key=lambda p: (len(p[-1]), p))# 示例
freq = {'a': 5, 'b': 9, 'c': 12, 'd': 13, 'e': 16, 'f': 45}
print(huffman_encoding(freq))

适用场景

  1. 问题具有贪心选择性质:局部最优能导致全局最优
  2. 最优子结构:问题的最优解包含子问题的最优解
  3. 典型应用
    • 最小生成树(Prim和Kruskal算法)
    • 最短路径问题(Dijkstra算法)
    • 背包问题的分数版本
    • 任务调度问题
    • 文件压缩(霍夫曼编码)

贪心算法的局限性👀👀

  1. 不总是能得到全局最优解
  2. 需要证明问题的贪心选择性质
  3. 对某些问题可能需要结合其他算法(如动态规划)

贪心 vs 动态规划💪💪

特性贪心算法动态规划
决策每个阶段做局部最优选择考虑所有可能的子问题
复杂度通常更低通常更高
最优解保证不总是总是
存储需求通常更少需要存储子问题结果
典型问题找零钱、任务调度背包问题、最长子序列

总结

贪心算法因其高效性在实际工程中应用广泛,但使用时需要仔细分析问题是否适合贪心策略。😼😼

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

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

相关文章

【 <二> 丹方改良:Spring 时代的 JavaWeb】之 Spring Boot 中的 AOP:实现日志记录与性能监控

<前文回顾> 点击此处查看 合集 https://blog.csdn.net/foyodesigner/category_12907601.html?fromshareblogcolumn&sharetypeblogcolumn&sharerId12907601&sharereferPC&sharesourceFoyoDesigner&sharefromfrom_link <今日更新> 一、开篇整…

TCP/IP协议簇

文章目录 应用层http/httpsDNS补充 传输层TCP1. 序列号与确认机制2. 超时重传3. 流量控制&#xff08;滑动窗口机制&#xff09;4. 拥塞控制5. 错误检测与校验6. 连接管理总结 网络层ARP**ARP 的核心功能**ARP 的工作流程1. ARP 请求&#xff08;Broadcast&#xff09;2. ARP 缓…

SpringBoot分布式项目订单管理实战:Mybatis最佳实践全解

一、架构设计与技术选型 典型分布式订单系统架构&#xff1a; [网关层] → [订单服务] ←→ [分布式缓存]↑ ↓ [用户服务] [支付服务]↓ ↓ [MySQL集群] ← [分库分表中间件]技术栈组合&#xff1a; Spring Boot 3.xMybatis-Plus 3.5.xShardingSpher…

微服务架构中的精妙设计:环境和工程搭建

一.前期准备 1.1开发环境安装 Oracle从JDK9开始每半年发布⼀个新版本, 新版本发布后, ⽼版本就不再进⾏维护. 但是会有⼏个⻓期维护的版本. ⽬前⻓期维护的版本有: JDK8, JDK11, JDK17, JDK21 在 JDK版本的选择上&#xff0c;尽量选择⻓期维护的版本. 为什么选择JDK17? S…

Maven 构建配置文件详解

Maven 构建配置文件详解 引言 Maven 是一个强大的项目管理和构建自动化工具,广泛应用于 Java 开发领域。在 Maven 项目中,配置文件扮演着至关重要的角色。本文将详细介绍 Maven 构建配置文件的相关知识,包括配置文件的作用、结构、配置方法等,帮助读者更好地理解和应用 M…

【YOLO系列】基于YOLOv8的无人机野生动物检测

基于YOLOv8的无人机野生动物检测 1.前言 在野生动物保护、生态研究和环境监测领域&#xff0c;及时、准确地检测和识别野生动物对于保护生物多样性、预防人类与野生动物的冲突以及制定科学的保护策略至关重要。传统的野生动物监测方法通常依赖于地面巡逻、固定摄像头或无线传…

Hive UDF开发实战:构建高性能JSON生成器

目录 一、背景与需求场景 二、开发环境准备 2.1 基础工具栈 2.2 Maven依赖配置 三、核心代码实现

分布式特性对比

以下是关于 分片(Sharding)、一致性哈希、两阶段提交(2PC)、Paxos、Raft协议、数据局部性 的对比分析与关联性总结,涵盖核心机制、适用场景及相互关系: 一、概念对比与关联 概念核心目标关键特性典型应用场景与其它技术的关联分片(Sharding)数据水平拆分按规则(哈希、…

历史分钟高频数据

外盘期货高频分钟历史回测行情数据下载 链接: https://pan.baidu.com/s/1RUbAMxfiSyBlXfrwT_0n2w?pwdhgya 提取码: hgya通过美国期货高频交易所历史行情可以看到很多细节比如品种之一&#xff1a;FGBX_1min (1)在2024-02-29 11:14:00关键交易时刻&#xff0c;一笔大规模订单突…

final+模版设计模式的理解

模板设计模式在 Java 里是一种行为设计模式&#xff0c;它在抽象类里定义算法的骨架&#xff0c;把部分步骤的具体实现延迟到子类。如此一来&#xff0c;子类可以在不改变算法结构的基础上&#xff0c;重新定义算法中的特定步骤。 模式组成 抽象类&#xff08;Abstract Class…

JAVA接口调用限速器

目录 1、并发限速 2、串行限速 需求&#xff1a;批量调用第三方ERP接口&#xff0c;对方接口限流时&#xff0c;减缓调用速率。 1、并发限速 Slf4j RestController public class ApiCallTask {//第三方接口Resourceprivate ErpService erpService;//异步线程池Resourcepriv…

STM32 CAN控制器硬件资源与用法

1、硬件结构图 以STM32F4为例&#xff0c;他有2个can控制器&#xff0c;分别为 CAN1 CAN2。 每个CAN控制器&#xff0c;都有3个发送邮箱、2个接收fifo&#xff0c;每个接收fifo又由3个接收邮箱组成。也即每个CAN控制器都有9个邮箱&#xff0c;其中3个供发送用&#xff0c;3个…

【C++ 继承】—— 青花分水、和而不同,继承中的“明明德”与“止于至善”

欢迎来到ZyyOvO的博客✨&#xff0c;一个关于探索技术的角落&#xff0c;记录学习的点滴&#x1f4d6;&#xff0c;分享实用的技巧&#x1f6e0;️&#xff0c;偶尔还有一些奇思妙想&#x1f4a1; 本文由ZyyOvO原创✍️&#xff0c;感谢支持❤️&#xff01;请尊重原创&#x1…

Qt warning LNK4042: 对象被多次指定;已忽略多余的指定

一、常规原因&#xff1a; pro或pri 文件中源文件被多次包含 解决&#xff1a;删除变量 SOURCES 和 HEADERS 中重复条目 二、误用 对于某些pri库可以使用如下代码简写包含 INCLUDEPATH $$PWDHEADERS $$PWD/*.hSOURCES $$PWD/*.cpp但是假如该目录下只有头文件&#xff0c;没…

Visual Studio Code 无法打开源文件解决方法

&#x1f308; 个人主页&#xff1a;Zfox_ &#x1f525; 系列专栏&#xff1a;Linux &#x1f525; 系列专栏&#xff1a;C从入门到精通 目录 一&#xff1a;&#x1f525; 突发状况 二&#xff1a;&#x1f525; 共勉 一&#xff1a;&#x1f525; 突发状况 &#x1f42c;…

js文字两端对齐

目录 一、问题 二、原因及解决方法 三、总结 一、问题 1.text-align: justify; 不就可以了吗&#xff1f;但是实际测试无效 二、原因及解决方法 1.原因&#xff1a;text-align只对非最后一行文字有效。只有一行文字时&#xff0c;text-align无效&#xff0c;要用text-alig…

LeetCode算法题(Go语言实现)_20

题目 给你两个下标从 0 开始的整数数组 nums1 和 nums2 &#xff0c;请你返回一个长度为 2 的列表 answer &#xff0c;其中&#xff1a; answer[0] 是 nums1 中所有 不 存在于 nums2 中的 不同 整数组成的列表。 answer[1] 是 nums2 中所有 不 存在于 nums1 中的 不同 整数组成…

每天认识一个设计模式-桥接模式:在抽象与实现的平行宇宙架起彩虹桥

一、前言&#xff1a;虚拟机桥接的启示 使用过VMware或者Docker的同学们应该都接触过网络桥接&#xff0c;在虚拟机网络配置里&#xff0c;桥接模式是常用的网络连接方式。选择桥接模式时&#xff0c;虚拟机会通过虚拟交换机与物理网卡相连&#xff0c;获取同网段 IP 地址&…

java笔记02

运算符 1.隐式转换和强制转换 类型转换的分类 1.隐式转换&#xff1a; 取值范围小的数值 转换为 取值范围大的数值 2.强制转换&#xff1a; 取值范围大的数值 转换为 取值范围小的数值隐式转换的两种提升规则 取值范围小的&#xff0c;和取值范围大的进行运算&#xff0c;小的…

Redis-07.Redis常用命令-集合操作命令

一.集合操作命令 SADD key member1 [member2]&#xff1a; sadd set1 a b c d sadd set1 a 0表示没有添加成功&#xff0c;因为集合中已经有了这个元素了&#xff0c;因此无法重复添加。 SMEMBERS key: smembers set1 SCARD key&#xff1a; scard set1 SADD key member1 …