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

数据结构与算法:贪心算法与应用场景

目录

11.1 贪心算法的原理

11.2 经典贪心问题

11.3 贪心算法在图中的应用

11.4 贪心算法的优化与扩展

总结


数据结构与算法:贪心算法与应用场景

贪心算法是一种通过选择当前最佳解来构造整体最优解的算法策略。贪心算法在很多实际问题中都取得了良好的效果,尤其在那些具有贪心选择性质和最优子结构的问题上。本章将深入探讨贪心算法的基本原理、经典问题及其应用,并使用表格对比贪心算法与其他算法的不同。

11.1 贪心算法的原理

贪心算法的核心思想是每一步都采取在当前情况下最优的选择,从而希望通过一系列最优的局部选择来达到整体最优。贪心算法适用于那些能够通过局部最优解构建全局最优解的问题。

贪心算法要素描述
贪心选择性质每一步的选择都可以保证局部最优,而不影响后续决策的整体最优性。
最优子结构整体问题的最优解由各个子问题的最优解组成。
与动态规划对比贪心算法只看局部最优,而动态规划则考虑所有可能的解。

贪心算法在一些问题中非常有效,但并不是所有问题都能通过贪心策略解决。问题是否适用贪心算法,需要仔细分析其贪心选择性质和最优子结构。

11.2 经典贪心问题

贪心算法在很多经典问题中都有应用,以下是几个典型的贪心问题。

问题名称问题描述贪心策略复杂度
活动选择问题从一组活动中选择尽可能多的互不重叠的活动。每次选择最早结束的活动。O(n log n)
哈夫曼编码构建最优二进制前缀码以压缩数据。每次合并最小权值的两个节点。O(n log n)
区间调度问题安排最大数量的兼容区间活动。每次选择最早结束的区间。O(n log n)
找零问题用最少的硬币数量找零(假设硬币面值适合贪心策略)。每次选择面值最大的硬币。O(n)

代码示例:活动选择问题的实现

#include <stdio.h>
#include <stdlib.h>struct Activity {int start;int end;
};int compare(const void* a, const void* b) {return ((struct Activity*)a)->end - ((struct Activity*)b)->end;
}void activitySelection(struct Activity activities[], int n) {qsort(activities, n, sizeof(struct Activity), compare);printf("选择的活动: \n");int i = 0;printf("(%d, %d)\n", activities[i].start, activities[i].end);for (int j = 1; j < n; j++) {if (activities[j].start >= activities[i].end) {printf("(%d, %d)\n", activities[j].start, activities[j].end);i = j;}}
}int main() {struct Activity activities[] = {{1, 3}, {2, 5}, {4, 7}, {1, 8}, {5, 9}, {8, 10}};int n = sizeof(activities) / sizeof(activities[0]);activitySelection(activities, n);return 0;
}

在上述代码中,通过贪心策略选择最早结束的活动,可以得到一组互不重叠的活动,从而最大化所选活动的数量。

11.3 贪心算法在图中的应用

贪心算法在图论中也有广泛应用,尤其是在最小生成树和最短路径问题中。

算法名称问题描述贪心策略复杂度
Prim算法构建最小生成树,使得总权重最小。每次选择权值最小且能扩展树的边。O(V^2) 或 O(E log V)
Kruskal算法构建最小生成树,使得总权重最小。每次选择权值最小且不形成环的边。O(E log E)
Dijkstra算法从单源点出发,找到到其他各点的最短路径。每次选择当前距离最小的未处理顶点。O(V^2) 或 O(E log V)

代码示例:Prim算法的实现

#include <stdio.h>
#include <limits.h>
#include <stdbool.h>
#define V 5int minKey(int key[], bool mstSet[]) {int min = INT_MAX, minIndex;for (int v = 0; v < V; v++) {if (mstSet[v] == false && key[v] < min) {min = key[v], minIndex = v;}}return minIndex;
}void printMST(int parent[], int graph[V][V]) {printf("边  权重\n");for (int i = 1; i < V; i++) {printf("%d - %d    %d\n", parent[i], i, graph[i][parent[i]]);}
}void primMST(int graph[V][V]) {int parent[V];int key[V];bool mstSet[V];for (int i = 0; i < V; i++) {key[i] = INT_MAX, mstSet[i] = false;}key[0] = 0;parent[0] = -1;for (int count = 0; count < V - 1; count++) {int u = minKey(key, mstSet);mstSet[u] = true;for (int v = 0; v < V; v++) {if (graph[u][v] && mstSet[v] == false && graph[u][v] < key[v]) {parent[v] = u, key[v] = graph[u][v];}}}printMST(parent, graph);
}int main() {int graph[V][V] = {{0, 2, 0, 6, 0},{2, 0, 3, 8, 5},{0, 3, 0, 0, 7},{6, 8, 0, 0, 9},{0, 5, 7, 9, 0}};primMST(graph);return 0;
}

在这个代码中,通过 Prim 算法找到最小生成树,每次选择未被包含在树中的、具有最小权重的边来扩展生成树。

11.4 贪心算法的优化与扩展

虽然贪心算法在某些问题上能够很好地工作,但它的局限性在于无法保证所有情况下的全局最优解。因此,针对特定问题,可以通过以下方法对贪心算法进行优化或扩展:

优化策略描述
启发式优化在贪心选择的基础上加入启发式信息,提高对全局解的估计精度。
与动态规划结合将贪心算法与动态规划结合,使用动态规划来处理贪心策略的不足。
混合算法将贪心算法与其他算法结合,如回溯或分支限界,以求得最优解。

贪心算法在很多情况下非常高效,但对于无法满足贪心性质的问题,需要考虑其他的算法策略。通过将贪心与动态规划等方法结合,通常可以找到更优的解。

总结

本章深入介绍了贪心算法的基本原理及其在各种经典问题中的应用。通过表格比较和代码示例,我们了解了贪心算法在活动选择、最小生成树、最短路径等场景中的广泛应用。同时,我们讨论了贪心算法的局限性及其与其他算法的结合方式。在下一章中,我们将深入探讨动态规划的核心思想及其在复杂问题中的应用。

相关文章:

数据结构与算法:贪心算法与应用场景

目录 11.1 贪心算法的原理 11.2 经典贪心问题 11.3 贪心算法在图中的应用 11.4 贪心算法的优化与扩展 总结 数据结构与算法&#xff1a;贪心算法与应用场景 贪心算法是一种通过选择当前最佳解来构造整体最优解的算法策略。贪心算法在很多实际问题中都取得了良好的效果&am…...

音频编解码器音频文件格式

0 Preface/Foreword 1 音频编解码器 算法压缩越高&#xff0c;那么音频延迟越大&#xff0c;音频效果越好。 1.1 SBC SBC: sub-band coding&#xff0c;自带编码 A2DP强制规定使用的audio编解码器。 在音视频中&#xff0c;为了增加用户体验&#xff0c;规避视频和音频的不…...

FreeSWITCH JSON API

仅举几例&#xff1a; fs_cli -x json {"command" : "status", "data" : ""} fs_cli -x json {"command" : "sofia.status", "data" : ""} fs_cli -x json {"command" : "…...

学习docker第三弹------Docker镜像以及推送拉取镜像到阿里云公有仓库和私有仓库

docker目录 1 Docker镜像dockers镜像的进一步理解 2 Docker镜像commit操作实例案例内容是ubuntu安装vim 3 将本地镜像推送至阿里云4 将阿里云镜像下载到本地仓库5 后记 1 Docker镜像 镜像&#xff0c;是docker的三件套之一&#xff08;镜像、容器、仓库&#xff09;&#xff0…...

一文掌握Kubernates核心组件,构建智能容器管理集群

1.Kubernates简要概述 Kubernates&#xff08;常称为K8s&#xff0c;因省略了“ubernate”中的8个字符&#xff09;是Google开源的容器编排平台&#xff0c;专为简化和自动化应用服务的部署、扩展和管理而设计。它将应用与底层的服务器抽象开来&#xff0c;提供了自动化的机制…...

正则表达式快速入门

正则表达式是由一系列元字符&#xff08;Meta-characters&#xff09;组成的模式&#xff0c;用于定义搜索或替换文本的规则。元字符具有特殊含义&#xff0c;用于指定搜索模式的结构。以下是一些常用的正则表达式元字符及其功能&#xff1a; 字符匹配符 符号含义.匹配除 \r\…...

【小程序】-基础语法(二)

文章目录 知识回顾前言微信小程序开发一、模板语法2.1 数据绑定2.2 条件渲染2.3 列表渲染三、内置API3.1 网络请求3.2 界面交互3.3 本地存储3.4 API 特征3.5 相册/拍照3.6 小练习四、事件处理4.1 事件对象4.2 组件事件五、生命周期5.1 页面生命周期5.2 应用生命周期知识回顾 前…...

js 填充数组

let arr Array.from({ length: 10 }, (_, index) > index)console.log(arr) 人工智能学习网站 https://chat.xutongbao.top...

AI创作3款软件分享,助力内容创作者高效产出优质作品

为了增加创造力和作品质量&#xff0c;许多创作者开始利用人工智能辅助工具。这些工具不仅可以帮助我们迅速生成各种类型的内容&#xff0c;例如文章、绘画、视频广告等&#xff0c;还提供语法检查和优化建议等实用功能。本文将向大家推荐三款适用于Ai先行者、Tracup、Adoe Fir…...

A survey of loss functions for semantic segmentation——论文笔记

摘要 图像分割一直是一个活跃的研究领域&#xff0c;因为它有着广泛的应用范围&#xff0c;从自动疾病检测到自动驾驶汽车。过去五年中&#xff0c;各种论文提出了用于不同场景&#xff08;如数据偏斜、稀疏分割等&#xff09;的目标损失函数。在本文中&#xff0c;我们总结了…...

docker部署es与kibana Mac

1. 创建网络 神一样的链接&#xff0c;不用谢&#xff1a; 1.Docker命令链接&#xff1a;黑马整理的docker速成链接 2.jdk11链接&#xff1a;jdk11 3.神资源链接&#xff1a;别点&#xff0c;要脸 注意&#xff1a;es需要先安装jdk环境&#xff0c;推荐jdk11&#xff0c;否则…...

redis的渐进式哈希?说一下细节?------面试题分享

渐进式哈希&#xff08;Progressive Hashing&#xff09;是 Redis 中的一种优化机制&#xff0c;用于在执行 HGETALL 命令时逐步读取哈希表中的所有字段。这种机制避免了一次性加载大量数据到内存&#xff0c;从而减少了内存消耗和提高系统的响应速度。 渐进式哈希的背景 在 R…...

javaWeb项目-springboot+vue-车辆管理系统功能介绍

本项目源码&#xff08;点击下方链接下载&#xff09;&#xff1a;java-springbootvue车辆管理系统源码(项目源码-说明文档)资源-CSDN文库 项目关键技术 开发工具&#xff1a;IDEA 、Eclipse 编程语言: Java 数据库: MySQL5.7 框架&#xff1a;ssm、Springboot 前端&#xff1…...

redis和memcached的区别

Redis和Memcached都是流行的内存缓存数据库&#xff0c;但它们有一些区别&#xff1a; 数据类型&#xff1a;Redis支持更多的数据类型&#xff0c;包括字符串、哈希、列表、集合和有序集合等&#xff0c;而Memcached只支持简单的键值对。 持久化&#xff1a;Redis支持数据的持…...

构建安全基石:网络安全等级保护定级指南

在数字化时代&#xff0c;网络安全已成为企业与个人不可忽视的重要课题。网络安全等级保护定级指南&#xff0c;作为国家指导网络安全保护的重要文件&#xff0c;为各类机构提供了精准的安全防护蓝图。本文旨在深度解析网络安全等级保护定级指南的精髓&#xff0c;助力建构全面…...

PyQt 入门教程(3)基础知识 | 3.1、使用QtDesigner创建.ui文件

文章目录 一、使用QtDesigner创建.ui文件1、创建.ui文件2、生成.py文件3、使用新生成的.py文件4、编辑新生成的.py文件 一、使用QtDesigner创建.ui文件 1、创建.ui文件 打开PyCharm&#xff0c;使用自定义外部工具QtDesigner创建mydialog.ui文件&#xff0c;如下&#xff1a; …...

解锁金融大门,你的基从备考秘籍全揭秘!

大家好&#xff01;随着金融行业的快速发展&#xff0c;基金从业资格证已经成为越来越多金融从业者的必备证书。为了帮助大家更好地备考&#xff0c;今天我们就来聊聊基金从业资格证&#xff01; 一、考试时间 2024年下半年基金从业资格考试时间为11月9日。准考证打印的时间是…...

详解Linux系统中的设备驱动程序.ko文件

目录 一、主要特点&#xff1a; 二、常见用法&#xff1a; 三、典型应用&#xff1a; 设备驱动程序、文件系统、网络协议、内核安全模块等都可能以 .ko 文件的形式存在。 .ko 文件是 Linux 内核模块的文件扩展名&#xff0c;表示 "kernel object"。这些文…...

MG协议转换器:高效连接,智控未来

在当今自动化和工业4.0浪潮中&#xff0c;设备间的无缝连接和数据高效传输成为提升生产效率、保障系统稳定运行的关键。我们凭借在工业自动化领域的深厚积累与创新精神&#xff0c;推出了MG系列一体式协议转换器&#xff0c;为不同协议总线之间的通讯架起了一座坚实的桥梁。 产…...

pycharm设置自动格式化代码

1.手动格式化代码: 在PyCharm中,您可以使用快捷键Ctrl + Alt + L来格式化当前文件中的代码。此操作将根据PyCharm默认的代码风格规则对代码进行格式化。 您也可以在“File”菜单中选择“Reformat Code”选项来进行格式化。 2.自动格式化代码 2.1 安装File Watchers插件 F…...

《通信之道——从微积分到 5G》读书总结

第1章 绪 论 1.1 这是一本什么样的书 通信技术&#xff0c;说到底就是数学。 那些最基础、最本质的部分。 1.2 什么是通信 通信 发送方 接收方 承载信息的信号 解调出其中承载的信息 信息在发送方那里被加工成信号&#xff08;调制&#xff09; 把信息从信号中抽取出来&am…...

如何理解 IP 数据报中的 TTL?

目录 前言理解 前言 面试灵魂一问&#xff1a;说说对 IP 数据报中 TTL 的理解&#xff1f;我们都知道&#xff0c;IP 数据报由首部和数据两部分组成&#xff0c;首部又分为两部分&#xff1a;固定部分和可变部分&#xff0c;共占 20 字节&#xff0c;而即将讨论的 TTL 就位于首…...

九天毕昇深度学习平台 | 如何安装库?

pip install 库名 -i https://pypi.tuna.tsinghua.edu.cn/simple --user 举个例子&#xff1a; 报错 ModuleNotFoundError: No module named torch 那么我需要安装 torch pip install torch -i https://pypi.tuna.tsinghua.edu.cn/simple --user pip install 库名&#x…...

QT3D学习笔记——圆台、圆锥

类名作用Qt3DWindow3D渲染窗口容器QEntity场景中的实体&#xff08;对象或容器&#xff09;QCamera控制观察视角QPointLight点光源QConeMesh圆锥几何网格QTransform控制实体的位置/旋转/缩放QPhongMaterialPhong光照材质&#xff08;定义颜色、反光等&#xff09;QFirstPersonC…...

LRU 缓存机制详解与实现(Java版) + 力扣解决

&#x1f4cc; LRU 缓存机制详解与实现&#xff08;Java版&#xff09; 一、&#x1f4d6; 问题背景 在日常开发中&#xff0c;我们经常会使用 缓存&#xff08;Cache&#xff09; 来提升性能。但由于内存有限&#xff0c;缓存不可能无限增长&#xff0c;于是需要策略决定&am…...

Spring AI Chat Memory 实战指南:Local 与 JDBC 存储集成

一个面向 Java 开发者的 Sring-Ai 示例工程项目&#xff0c;该项目是一个 Spring AI 快速入门的样例工程项目&#xff0c;旨在通过一些小的案例展示 Spring AI 框架的核心功能和使用方法。 项目采用模块化设计&#xff0c;每个模块都专注于特定的功能领域&#xff0c;便于学习和…...

VisualXML全新升级 | 新增数据库编辑功能

VisualXML是一个功能强大的网络总线设计工具&#xff0c;专注于简化汽车电子系统中复杂的网络数据设计操作。它支持多种主流总线网络格式的数据编辑&#xff08;如DBC、LDF、ARXML、HEX等&#xff09;&#xff0c;并能够基于Excel表格的方式生成和转换多种数据库文件。由此&…...

spring Security对RBAC及其ABAC的支持使用

RBAC (基于角色的访问控制) RBAC (Role-Based Access Control) 是 Spring Security 中最常用的权限模型&#xff0c;它将权限分配给角色&#xff0c;再将角色分配给用户。 RBAC 核心实现 1. 数据库设计 users roles permissions ------- ------…...

Python常用模块:time、os、shutil与flask初探

一、Flask初探 & PyCharm终端配置 目的: 快速搭建小型Web服务器以提供数据。 工具: 第三方Web框架 Flask (需 pip install flask 安装)。 安装 Flask: 建议: 使用 PyCharm 内置的 Terminal (模拟命令行) 进行安装,避免频繁切换。 PyCharm Terminal 配置建议: 打开 Py…...

C# winform教程(二)----checkbox

一、作用 提供一个用户选择或者不选的状态&#xff0c;这是一个可以多选的控件。 二、属性 其实功能大差不差&#xff0c;除了特殊的几个外&#xff0c;与button基本相同&#xff0c;所有说几个独有的 checkbox属性 名称内容含义appearance控件外观可以变成按钮形状checkali…...