当前位置: 首页 > news >正文

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

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

贪心算法的基本概念

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

贪心算法的特点

  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快速开发平台_低代码开发平台_零代码开发平台_流程设计器_表单引擎_工作流引擎_软件架构

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • selenium(二)基于java、元素操控、Frame切换、元素等待
  • 【Go语言基础】调度器模型GPM与垃圾回收器GC
  • GNU/Linux - RSYSLOG
  • 基于大数据分析景区消费行为影响因素研究【消费等级预测、携程,去哪网数据抓取】
  • 去雾去雨算法
  • 力扣top300:1.两数之和
  • 37-RPC HTTP区别是什么
  • 用于目标说话人提取的统一视听线索
  • CSS3 3D 转换
  • GPT-6曝光!阉割版「草莓」秋季兑现
  • qtcreator的vim模式下commit快捷键ctrl+g,ctrl+c没有反应的问题
  • labelImg使用
  • 基于网络技术的天气数据查询
  • 在 Spring Boot 中为 MyBatis 添加拦截器
  • .Net 6.0--通用帮助类--FileHelper
  • 【挥舞JS】JS实现继承,封装一个extends方法
  • Angular4 模板式表单用法以及验证
  • AngularJS指令开发(1)——参数详解
  • dva中组件的懒加载
  • Java读取Properties文件的六种方法
  • Python代码面试必读 - Data Structures and Algorithms in Python
  • react-native 安卓真机环境搭建
  • supervisor 永不挂掉的进程 安装以及使用
  • 彻底搞懂浏览器Event-loop
  • 搭建gitbook 和 访问权限认证
  • 等保2.0 | 几维安全发布等保检测、等保加固专版 加速企业等保合规
  • 复习Javascript专题(四):js中的深浅拷贝
  • ------- 计算机网络基础
  • 力扣(LeetCode)357
  • 聊聊flink的BlobWriter
  • 我这样减少了26.5M Java内存!
  • ​一帧图像的Android之旅 :应用的首个绘制请求
  • # centos7下FFmpeg环境部署记录
  • # Python csv、xlsx、json、二进制(MP3) 文件读写基本使用
  • ## 1.3.Git命令
  • #C++ 智能指针 std::unique_ptr 、std::shared_ptr 和 std::weak_ptr
  • (C)一些题4
  • (三)SvelteKit教程:layout 文件
  • (十二)Flink Table API
  • (十三)Maven插件解析运行机制
  • (贪心 + 双指针) LeetCode 455. 分发饼干
  • (续)使用Django搭建一个完整的项目(Centos7+Nginx)
  • (转)Mysql的优化设置
  • (转)Oracle存储过程编写经验和优化措施
  • (轉貼) UML中文FAQ (OO) (UML)
  • (自用)learnOpenGL学习总结-高级OpenGL-抗锯齿
  • **PyTorch月学习计划 - 第一周;第6-7天: 自动梯度(Autograd)**
  • .net core 客户端缓存、服务器端响应缓存、服务器内存缓存
  • .NET Core使用NPOI导出复杂,美观的Excel详解
  • .NET3.5下用Lambda简化跨线程访问窗体控件,避免繁复的delegate,Invoke(转)
  • .Net插件开发开源框架
  • .net反混淆脱壳工具de4dot的使用
  • .NET框架设计—常被忽视的C#设计技巧
  • ::before和::after 常见的用法
  • @ohos.systemParameterEnhance系统参数接口调用:控制设备硬件(执行shell命令方式)