探索贪心算法:解决优化问题的高效策略

贪心算法是一种在每一步选择中都采取当前最佳选择的算法,以期在整体上达到最优解。它广泛应用于各种优化问题,如最短路径、最小生成树、活动选择等。本文将介绍贪心算法的基本概念、特点、应用场景及其局限性。

贪心算法的基本概念

贪心算法的核心思想是局部最优策略,即在每一步选择中都选择当前看起来最优的选项,希望通过一系列的局部最优选择达到全局最优。

贪心算法的特点

  1. 局部最优选择:每一步都选择当前状态下最优的操作。

  2. 无需回溯:一旦做出选择,便不会更改。

  3. 逐步构建解决方案:从一个初始解开始,通过局部最优选择逐步构建完整解决方案。

贪心算法的应用场景

1. 活动选择问题

在活动选择问题中,给定一组活动及其开始和结束时间,要求选择尽可能多的互不重叠的活动。

def activity_selection(activities):activities.sort(key=lambda x: x[1])  # 按结束时间排序selected_activities = [activities[0]]for i in range(1, len(activities)):if activities[i][0] >= selected_activities[-1][1]:selected_activities.append(activities[i])return selected_activitiesactivities = [(0, 6), (1, 4), (3, 5), (5, 7), (3, 9), (5, 9), (6, 10), (8, 11), (8, 12), (2, 14), (12, 16)]
selected = activity_selection(activities)
print("Selected activities:", selected)

2. 背包问题(分数背包)

在分数背包问题中,物品可以部分装入背包。目标是选择物品使得背包中的总价值最大。

def fractional_knapsack(items, capacity):items.sort(key=lambda x: x[1] / x[0], reverse=True)  # 按价值密度排序total_value = 0.0for weight, value in items:if capacity >= weight:total_value += valuecapacity -= weightelse:total_value += value * (capacity / weight)breakreturn total_valueitems = [(10, 60), (20, 100), (30, 120)]  # (weight, value)
capacity = 50
max_value = fractional_knapsack(items, capacity)
print("Maximum value in knapsack:", max_value)

3. 最小生成树(Kruskal 算法)

在图论中,最小生成树是连接所有顶点的权重最小的树。Kruskal 算法通过贪心策略选择最小边来构建最小生成树。

class DisjointSet:def __init__(self, n):self.parent = list(range(n))self.rank = [0] * ndef find(self, u):if self.parent[u] != u:self.parent[u] = self.find(self.parent[u])return self.parent[u]def union(self, u, v):root_u = self.find(u)root_v = self.find(v)if root_u != root_v:if self.rank[root_u] > self.rank[root_v]:self.parent[root_v] = root_uelif self.rank[root_u] < self.rank[root_v]:self.parent[root_u] = root_velse:self.parent[root_v] = root_uself.rank[root_u] += 1def kruskal(n, edges):ds = DisjointSet(n)edges.sort(key=lambda x: x[2])mst = []for u, v, weight in edges:if ds.find(u) != ds.find(v):ds.union(u, v)mst.append((u, v, weight))return mstedges = [(0, 1, 10), (0, 2, 6), (0, 3, 5), (1, 3, 15), (2, 3, 4)]
n = 4  # Number of vertices
mst = kruskal(n, edges)
print("Edges in MST:", mst)

贪心算法的局限性

虽然贪心算法在许多问题中表现出色,但它并不适用于所有问题。贪心算法不能保证所有情况下都能找到全局最优解。例如,在0-1背包问题中,贪心算法可能无法找到最优解。

文章转载自:最小生成树

原文链接:https://www.cnblogs.com/zx618/p/18300342

体验地址:引迈 - JNPF快速开发平台_低代码开发平台_零代码开发平台_流程设计器_表单引擎_工作流引擎_软件架构

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

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

相关文章

详解ACL限制SSH、Telnet远程登录及抓包实验

要求&#xff1a;lsw5只能lsw6登录&#xff0c;lsw6只能PC2登录 <Huawei>sys [Huawei]sysname sw2 [sw2]int vlanif1 [sw2-Vlanif1]ip address 192.168.10.2 24 [sw2-Vlanif1]q [sw2] <Huawei>sys [Huawei]sysname sw1 [sw1]int vlanif1 [sw1-Vlanif1]ip address …

动态代理IP的适用范围与优势分析

1. 什么是动态代理IP&#xff1f; 动态代理IP是一种在每次连接时更换IP地址的代理服务。与静态代理IP不同&#xff0c;动态代理IP会在每次访问时分配一个新的IP地址&#xff0c;或在设定的时间间隔内自动更换。这种机制使得动态代理IP非常适合需要频繁更换IP的应用场景。 2. …

视频单条剪、脚本靠手写?云微客开启海量视频时代

老板们注意了&#xff0c;现在已不再是视频单条剪&#xff0c;脚本靠手写的时代&#xff01;在这个信息爆炸的时代&#xff0c;短视频已经成为了现代信息传播和娱乐消费的重要载体&#xff0c;那么我们该如何高效、快速地制作出大量高质量的短视频内容呢&#xff1f;这就需要云…

面试必备:接口自动化测试精选面试题大全

一、 请问你是如何做接口测试的&#xff1f; 大体来说&#xff0c;经历以下过程&#xff1a;接口需求调研、接口测试工具选择、接口测试用例编写、接口测试执行、接口测试回归、接口测试自动化持续集成。具体来说&#xff0c;接口测试流程分成以下九步&#xff1a; 第一步&am…

SpringBoot集成kafka开发-消息消费的分区策略(消费者如何判断从哪个分区中消费消息的?)

这里写目录标题 1、kafak消息者消费消息的4种分区策略2、kafka默认的消费分区策略1-RangeAssignor&#xff08;均匀分配、默认分配策略&#xff09;2.1、代码验证RangeAssignor的消息分区策略2.1.1、消费者2.1.2、生产者2.1.3、kafak配置类2.1.4、对象实体类2.1.5、项目配置文件…

基于vue框架的病床管理信息系统odt4v(程序+源码+数据库+调试部署+开发环境)系统界面在最后面。

系统程序文件列表 开题报告内容 基于Vue框架的病床管理信息系统开题报告 一、引言 随着医疗技术的不断进步和人口老龄化的加剧&#xff0c;医院面临着日益增长的医疗服务需求。病床作为医院资源的重要组成部分&#xff0c;其管理效率直接影响到患者的就医体验和医院的运营效…

Elasticsearch(面试篇)

目录 Elasticsearch的倒排索引是什么&#xff1f; 详细描述一下Elasticsearch更新和删除文档的过程 描述一下Elasticsearch搜索的过程 兄弟们一起加油 &#xff01; &#xff01; &#xff01; Elasticsearch的倒排索引是什么&#xff1f; 传统我们索引通过文章&#xff0c…

TCP/UDP的对比,粘包分包抓包,http协议

服务器端&#xff1a; 一、loop 127.0.0.1本地回环测试地址 二、tcp特点 面向连接、可靠传输、字节流 粘包问题&#xff1a;tcp流式套接字&#xff0c;数据与数据之间没有套接字&#xff0c;导致可能多次的数据粘到一起 解决方法&#xff1a;&#xff08;1&#xff09;规…

使用USB转485转接器,从机不响应

在调试485通信时&#xff0c;bms不响应主机&#xff0c;usb转485转换器接收指示灯常亮&#xff0c;现象如下&#xff0c;通过更新驱动程序解决。 更新驱动程序链接&#xff1a; 1. 下载并解压驱动文件 https://www.szutek.com/Uploads/file/20210917/20210917091627_42822.rar…

生信圆桌:专业生信服务器与平台服务的提供者

生信圆桌是一个专注于提供生物信息学&#xff08;生信&#xff09;服务器和平台服务的领先企业&#xff0c;致力于为全球科研机构、企业和独立研究者提供高性能的生信分析解决方案。随着生物信息学研究对计算资源的需求日益增加&#xff0c;生信圆桌凭借其先进的服务器技术和专…

C++ 多线程(互斥锁、条件变量)

互斥锁 最简单示例&#xff1a; #include <iostream> #include <thread> #include <mutex>std::mutex mtx; int counter 0;void increment() {for (int i 0; i < 10000; i) {// b1 是创建出来的对象. lock_guard 类似智能指针一样,为了防止忘记释放锁…

【QT学习】1-2 Liunx环境下QT5.12.9软件安装1——VMware17.0.0虚拟机安装

注意&#xff1a;如果电脑已经安装低版本的VMware&#xff0c;千万不要卸载&#xff0c;直接覆盖安装&#xff0c;更新到新的安装版本 1.点击.exe文件&#xff0c;右键以管理员身份运行&#xff0c;点击下一步&#xff0c;下一步 2.选择软件安装位置后&#xff0c;点击下一步。…

手写Spring框架(简单实现)

Spring风格的三级缓存管理&#xff1a;一个简单实现示例 在实现一个简单的Spring风格的依赖注入容器时&#xff0c;我们通常需要处理Bean的生命周期&#xff0c;包括实例化、属性注入以及完全初始化。为了处理复杂的依赖关系和循环依赖问题&#xff0c;我们可以使用三级缓存机…

虚幻5|制作一个木桩,含血量及伤害数字

一&#xff0c;基础设置 1.创建Actor蓝图类 2.编辑胶囊体和网格体的碰撞预设 3.打开敌人的角色蓝图&#xff0c;编辑飙血特效 二&#xff0c;创建敌人血量的ui&#xff0c;命名为敌人血量&#xff0c;如下 1. 2&#xff0c;打开后&#xff0c;添加一个画布画板和进度条&#…

ArkUI-布局(一)

ArkUI-布局 布局概述布局元素的组成如何选择布局布局位置对子元素的约束 线性布局部分属性与使用方式 层叠布局部分属性与使用方式 弹性布局基本概念布局方向布局换行主轴对齐方式交叉轴对齐方式容器设置交叉轴对齐方式子元素设置交叉轴对齐方式内容对齐 自适应拉伸 布局概述 …

C++基础面试题 | 什么是C++的列表初始化?

青山相待&#xff0c;白云相爱&#xff0c;梦不到紫罗袍共黄金带。 - 《山坡羊道情》(宋方壶) 2024.8.26 回答重点 C11中引入了列表初始化&#xff0c;其语法是用花括号{}来初始化变量或对象。列表初始化可以应用于&#xff1a; 基础数据类型用户自定义类型&#xff08;类、结…

云端集中管控边缘服务:利用 EMQX ECP 在 K8s 上快速部署 NeuronEX

随着物联网、边缘计算技术的发展&#xff0c;实现边缘服务的快速部署对于分布式计算环境至关重要。它不仅可以显著降低延迟、节省带宽资源、增强数据的安全性和隐私保护&#xff0c;同时还能改善用户体验&#xff0c;支持动态变化的工作负载需求&#xff0c;提供更高的灵活性和…

Linux 实时调度器:带宽限制

文章目录 1. 前言2. 概念3. 实时进程 的 带宽限制3.1 实时进程 带宽限制 初始化3.2 启动 实时进程 带宽 监测定时器3.3 累加 实时进程 消耗的带宽3.4 查看 实时进程 带宽消耗情况3.5 小结 1. 前言 限于作者能力水平&#xff0c;本文可能存在谬误&#xff0c;因此而给读者带来的…

JAVA毕业设计165—基于Java+Springboot+vue3的二手房交易管理系统(源代码+数据库+11000字论文)

毕设所有选题&#xff1a; https://blog.csdn.net/2303_76227485/article/details/131104075 基于JavaSpringbootvue3的二手房交易管理系统(源代码数据库11000字论文)165 一、系统介绍 本项目前后端分离(还有ssm版本)&#xff0c;分为用户、卖家、管理员三种角色 1、用户&a…

TOMCAT-企业级WEB应用服务器

一 WEB技术 1.1 HTTP协议和B/S 结构 HTTP&#xff08;HyperText Transfer Protocol&#xff09;协议即超文本传输协议&#xff0c;是用于在万维网&#xff08;WWW&#xff09;上传输超文本内容的基础协议。 一、HTTP 协议的特点 1、简单快速 客户向服务器请求服务时&#…