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

【数据结构】贪心算法:决策的艺术

贪心算法(Greedy Algorithm)是一类在每一步选择中都采取局部最优解的方法,希望最终能够达到全局最优解。通俗地说,贪心算法的思想就是“每一步都尽量做出最好的选择”,以期望整个过程的最终结果也达到最优状态。贪心算法在解决某些特定问题时可以提供快速且高效的方案,因此广泛应用于路径选择、调度、资源分配等领域。

贪心算法的工作原理


算法实战:找零问题

假设我们需要找零的金额为 amount,并且我们有一些面值的硬币。贪心算法的目标是尽可能少地使用硬币来找零。我们将从面值最大的硬币开始找零。

#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
// 找零函数
int coinChange(vector<int>& coins, int amount) {sort(coins.rbegin(), coins.rend()); // 从大到小排序int count = 0;for (int coin : coins) {while (amount >= coin) { // 当金额大于或等于硬币面值时amount -= coin; // 减去硬币面值count++; // 记录使用的硬币数量}}return amount == 0 ? count : -1; // 如果找零成功,返回硬币数量,否则返回-1
}int main() {vector<int> coins = {25, 10, 5, 1}; // 硬币面值int amount = 63; // 要找的金额int result = coinChange(coins, amount);if (result != -1) {cout << "最少需要使用的硬币数量: " << result << endl;} else {cout << "无法找零" << endl;}return 0;
}

实践中的挑战与扩展

虽然贪心算法在找零问题中表现出色,但并非所有硬币组合都能保证找到最优解。例如,若面值为 3 和 4 的硬币用于找零 6,贪心算法可能选择 4 + 3,而最优解为 3 + 3。这种情况下,动态规划将更适合解决问题,因为它能考虑所有可能的组合。

但通过动态规划解决的找零问题会考虑所有组合,确保最终解为全局最优。

如果不清除什么是动态规划的话可以去看我另外一篇文章

  • 【数据结构】动态规划:揭开算法优化的秘密
#include <iostream>
#include <vector>
#include <climits>
using namespace std;int coinChangeDP(vector<int>& coins, int amount) {vector<int> dp(amount + 1, INT_MAX);dp[0] = 0; // 基础情况for (int coin : coins) {for (int x = coin; x <= amount; x++) {if (dp[x - coin] != INT_MAX) {dp[x] = min(dp[x], dp[x - coin] + 1);}}}return dp[amount] == INT_MAX ? -1 : dp[amount];
}

贪心算法的优缺点

优点

  1. 高效:贪心算法的时间复杂度通常较低,在需要快速求解的情况下尤为适合。
  2. 实现简单:贪心算法的逻辑清晰,易于实现。它只需一步一步地做出决策,不需要复杂的回溯操作。
  3. 适用于动态数据:在许多实时计算中,贪心算法可以处理不断变化的数据,因为它只关心当前的最佳选择。

缺点

  1. 不能保证全局最优:贪心算法不能保证所有问题的最优解,有时会因局部选择导致全局次优解。
  2. 缺乏灵活性:贪心算法无法回溯,也不适合多步决策或组合问题。
  3. 适用范围有限:贪心算法主要适用于具有贪心选择性质和最优子结构性质的问题。

时空复杂度

如果不清除什么是时空复杂度的话可以去看我另外一篇文章

  • 【数据结构】时间复杂度和空间复杂度是什么?

时间复杂度

贪心算法的时间复杂度通常依赖于具体问题和实现方式。一般来说,它的时间复杂度可以通过以下几个方面进行分析:

  1. 排序:许多贪心算法需要对输入数据进行排序,例如在找零问题中,我们对硬币面值进行了排序。排序的时间复杂度为 ( O ( n log ⁡ n ) (O(n \log n) (O(nlogn),其中 ( n ) (n) (n) 是输入数据的规模。

  2. 遍历:贪心算法通常需要遍历输入数据,选择当前的最佳解。这个过程的时间复杂度通常为 (O(n)) 或 (O(m)),其中 (m) 是选定的子问题规模。

综合考虑,贪心算法的时间复杂度通常为 ( O ( n log ⁡ n ) ) (O(n \log n)) (O(nlogn)) ( O ( n ) ) (O(n)) (O(n)),具体取决于是否需要排序以及遍历的复杂性。

空间复杂度

贪心算法的空间复杂度通常较低,因为它通常不需要额外的存储空间来存储中间结果。常见的空间复杂度为:

  1. 输入数据存储:需要存储输入数据,时间复杂度与输入规模成正比,空间复杂度为 (O(n))。

  2. 常量空间:在大多数贪心算法中,只需使用常量空间来保存临时变量和结果,因此其额外空间复杂度通常为 (O(1))。

因此,贪心算法的空间复杂度一般为 (O(n)),但在许多情况下,其有效空间复杂度为 (O(1))。

复杂度总结

复杂度类型复杂度表达式说明
时间复杂度 ( O ( n log ⁡ n ) ) (O(n \log n)) (O(nlogn)) ( O ( n ) ) (O(n)) (O(n))取决于排序和遍历的复杂性
空间复杂度 ( O ( n ) ) (O(n)) (O(n)) ( O ( 1 ) ) (O(1)) (O(1))通常只需常量空间或输入空间

通过对时空复杂度的分析,我们可以更好地理解贪心算法的性能表现,并在实际应用中做出合理的选择。

常见应用

  • 最短路径问题

    在图算法中,Dijkstra算法就是一种基于贪心策略的算法,用来找到从起点到目标节点的最短路径。该算法在每一步选择当前节点的最短边,从而逐步构建最短路径。Dijkstra算法在权值非负的情况下非常有效,但在权值为负的情况下可能无法得到最优解。

  • 活动选择问题

    活动选择问题是典型的贪心算法应用之一。在一组互不相容的活动中,贪心算法可以帮助选择出最多的活动。例如,若有一组活动需要在不同时间段进行,使用贪心算法可以按活动的结束时间从早到晚排序,依次选择不冲突的活动,从而最大化活动数量。

  • 分数背包问题

    在背包问题中,贪心算法可用于求解“分数背包问题”,即物品可以按任意比例选择。贪心算法在此问题中选择单位重量价值最高的物品直到背包装满,从而实现价值最大化。

  • 区间调度问题

    区间调度问题是一种经典的贪心算法应用,它需要从一组区间中选择互不重叠的最大数量。贪心算法的策略是首先选择结束时间最早的区间,以便为后续区间腾出时间,从而实现最大化选择。

如何判断贪心算法是否适用?

在选择是否应用贪心算法时,通常需要满足以下两个条件:

  • 贪心选择性质:即可以通过局部最优解一步步获得全局最优解。
  • 最优子结构:问题可以通过子问题的最优解构建得到全局最优解。

如果问题不符合这两个条件,那么贪心算法可能不适用,可以考虑动态规划或回溯等更复杂的算法。

贪心算法与动态规划的区别

虽然贪心算法和动态规划都用于解决优化问题,但两者的策略截然不同。动态规划通过记忆化存储和子问题分解来保证全局最优解,而贪心算法则在每一步选择中追求最优。一般而言,当问题具有“贪心选择性质”和“最优子结构”时,贪心算法才适用;否则,动态规划可能是更好的选择。

贪心算法的实现步骤

在实际应用中,贪心算法的实现通常可以分为以下几步:

  1. 选择贪心策略:定义每一步的选择标准,确保每次选择局部最优。
  2. 构建选择序列:基于贪心策略逐步构建问题的解答。
  3. 验证全局解的可行性:确保贪心选择不会影响整体解的正确性。
  4. 执行选择:按照贪心策略选择直到获得最终解。

总结

贪心算法是一种高效、简便的算法,在特定条件下可以迅速求解最优问题。然而,贪心算法并非万全之策,适用于具有贪心选择性质和最优子结构的问题。它的应用领域广泛,涉及路径规划、活动选择、资源分配等多个方面。在选择是否使用贪心算法时,需要全面分析问题特点,确保其满足贪心算法的适用条件。

相关文章:

【数据结构】贪心算法:决策的艺术

贪心算法&#xff08;Greedy Algorithm&#xff09;是一类在每一步选择中都采取局部最优解的方法&#xff0c;希望最终能够达到全局最优解。通俗地说&#xff0c;贪心算法的思想就是“每一步都尽量做出最好的选择”&#xff0c;以期望整个过程的最终结果也达到最优状态。贪心算…...

Linux LVS详解

LVS&#xff08;Linux Virtual Server&#xff09;即Linux虚拟服务器&#xff0c;是一个基于Linux操作系统的高性能、可扩展的负载均衡器。以下是对LVS的详细介绍&#xff1a; 一、简介 LVS项目由章文嵩博士在1998年5月发起&#xff0c;是中国国内最早出现的自由软件项目之一…...

LabVIEW显微镜自动对焦系统

在生物医学研究中&#xff0c;显微镜图像的清晰度对于细胞分析非常重要。传统的手动对焦方法容易受到人为因素的影响&#xff0c;因此开发了一种自动对焦技术&#xff0c;以提高图像采集的准确性和效率。 自动对焦方法概述 该系统结合了图像清晰度评估和一维功能优化&#xff…...

基于IP的真实地址生成器

ip-geoaddress-generator 是一个基于 Web 的在线应用程序&#xff0c;能够根据 IP 地址生成真实的随机地址信息。通过多个 API 获取位置数据和随机用户信息&#xff0c;该工具为用户提供了完整的虚拟身份。它由 Next.js 和 Radix UI 构建&#xff0c;具备自动检测当前 IP 地址和…...

下面程序头的三个import语句可以合并或简化么?

下面程序头的三个import语句可以合并或简化么&#xff1f; from tkinter.simpledialog import askinteger from tkinter import * from tkinter import messagebox ——是的&#xff0c;三个import语句可以合并为一个。 合并后的import语句如下所示&#xff1a; from tkinte…...

深度学习--CNN实现猫狗识别二分类(附带下载链接, 长期有效)

1. 代码实现(包含流程解释) 样本量: 8005 # # 1.导入数据集(加载图片)数据预处理# 进行图像增强, 通过对图像的旋转 ,缩放,剪切变换, 翻转, 平移等一系列操作来生成新样本, 进而增加样本容量, # 同时对图片数值进行归一化[0:1] from tensorflow.keras.preprocessing.image …...

Depcheck——专门用于检测 JavaScript 和 Node.js 项目中未使用依赖项的工具

文章目录 Depcheck 是什麽核心功能&#x1f4da;检测未使用的依赖&#x1f41b;检测缺失的依赖✨支持多种文件类型&#x1f30d;可扩展性 安装与使用1. 安装 Depcheck2. 使用 Depcheck Depcheck 的应用总结项目源码&#xff1a; Depcheck 是什麽 来看一个常见错误场景&#x1…...

前端构建工具vite的优势

1. 极速冷启动 Vite 使用原生 ES 模块 (ESM) 在开发环境下进行工作。相比于传统构建工具需要打包所有的文件&#xff0c;Vite 只在浏览器请求模块时动态加载所需的文件。无打包冷启动&#xff1a;无需预先打包&#xff0c;项目启动非常快&#xff0c;尤其对于大型项目效果更明…...

hive查询语句

1.基本语法 SELECT [ALL | DISTINCT]select_expr, select_expr, ... FROM table_reference [WHERE where_condition] [GROUP BYcol_list] [HAVING where_condition] [ORDER BYcol_list] [CLUSTER BYcol_list | [DISTRIBUTE BY col_list] [SORT BY col_list] ] [LIMIT number] …...

【AIGC】2024-ECCV-ControlNet++:通过有效的一致性反馈改进条件控制

2024-ECCV-ControlNet: Improving Conditional Controls with Efficient Consistency Feedback ControlNet&#xff1a;通过有效的一致性反馈改进条件控制摘要1. 引言2. 相关工作2.1 基于扩散的生成模型2.2 可控的文本到图像扩散模型2.3 语言和视觉奖励模型 3. 方法3.1. 初步3.…...

Mysql5.7变为GreatSQL 8.0.32-25过程中,SQL语句报错及解决方案

考虑兼容国产化数据库&#xff0c;现需要将Mysql5.7变为GreatSQL&#xff0c;在执行部分sql时&#xff0c;发现在Mysql5.7无报错&#xff0c;在GreatSQL有报错&#xff0c;在此记录一下遇到的几个错误。 1.ERROR 1231 (NO_AUTO_CREATE_USER) 1.1.报错提示 ERROR 1231 (42000…...

Qt 使用QAxObject将QTableView数据导出到Excel表格

这是我记录Qt学习过程的第6篇心得文章&#xff0c;主要是方便自己编写的应用程序导出Excel数据的&#xff0c;走了不少弯路直接上代码。 实现代码&#xff1a; //人员信息导出 ui->pbtn2->setEnabled(false); // 打开文件对话框&#xff0c;选择 excel文件 QString fil…...

fastGpt

参考本地部署FastGPT使用在线大语言模型 1 rockylinx 1 ollama安装 在rockylinux中安装的&#xff0c;ollama由1.5G&#xff0c;还是比较大&#xff0c;所有采用在windows下下载&#xff0c;然后安装的方式&#xff0c;linux安装 tar -C /usr -xzf ollama-linux-amd64.tgz #…...

如何全方位应对服务可用性的挑战

在数字化转型的浪潮中&#xff0c;运维团队正站在企业IT架构的核心位置&#xff0c;面对着前所未有的挑战。服务响应时间和失败率&#xff0c;作为衡量服务质量的重要指标&#xff0c;一直备受关注。然而&#xff0c;在追求这两项指标优化的同时&#xff0c;运维团队还需关注其…...

二进制方式部署k8s集群

目标任务: 1、Kubernetes集群部署架构规划 2、部署Etcd数据库集群 3、在Node节点安装Docker 4、部署Flannel网络插件 5、在Master节点部署组件(api-server,schduler,controller-manager) 6、在Node节点部署组件(kubelet,kube-proxy) 7、查看集群状态 8、运行⼀个测…...

Vivado时序报告七:Report Clock NetworkReport Clock Interaction详解

目录 一、前言 二、Report Clock Network 2.1 Report Clock Network流程 2.2 Report Clock Network报告 三、Report Clock Interaction 3.1 示例设计 3.2 配置选项 3.2.1 Options 3.2.2 Timer_Settings 3.3 Clock Interaction报告 3.3.1 Clock Pair Classification …...

HarmonyOS 组件样式@Style 、 @Extend、自定义扩展(AttributeModifier、AttributeUpdater)

1. HarmonyOS Style 、 Extend、自定义扩展&#xff08;AttributeModifier、AttributeUpdater&#xff09; Styles装饰器&#xff1a;定义组件重用样式   ;Extend装饰器&#xff1a;定义扩展组件样式   自定义扩展&#xff1a;AttributeModifier、AttributeUpdater 1.1. 区…...

信息安全工程师(73)网络安全风险评估过程

一、确定评估目标 此阶段需要明确评估的范围、目标和要求。评估目标通常包括特定的网络系统、信息系统或网络基础设施&#xff0c;评估范围可能涉及整个组织或仅特定部门。明确评估要求有助于确保评估过程的针对性和有效性。 二、收集信息 在评估开始之前&#xff0c;需要对目标…...

在MacOS玩RPG游戏 - RPGViewerPlus

背景知识 由于我一直使用Mac电脑&#xff0c;所以一直对Mac如何玩RPGMV/RPGMZ游戏的方式有进一步的想法。 网上能给出的方案都是自行启动一个HTTP服务进行&#xff0c;进行服务加载。这个方法有效&#xff0c;但兼容性较差。涉及到自定义功能模块的游戏&#xff0c;都会有报错…...

2024.10.27 直接插入排序 非递归后序遍历(复杂版)

直接插入排序 思路&#xff1a;用temp变量存放需要插入前面有序序列的变量&#xff0c;然后用里面的那个for循环寻找到需要插入的位置。 额外注意的点&#xff1a;arr[j1]temp;这个是因为内置循环每次出来之后所指向的位置是我们要插入的位置的前一个&#xff08;-1或者插入…...

Ubuntu 22.04系统启动时自动运行ROS2节点

在 Ubuntu 启动时自动运行 ROS2 节点的方法 环境&#xff1a;Ubuntu 系统&#xff0c;ROS2 Humble&#xff0c;使用系统自带的 启动应用程序 目标&#xff1a;在系统启动时自动运行指定的 ROS2 节点 效果展示 系统启动后&#xff0c;自动运行小乌龟节点和键盘控制节点。 实践…...

张三进阶之路 | 基于Spring AOP的Log收集

前情提要 &#x1f4cc; 张三对于公司的日志处理系统不满意&#xff0c;认为其性能不佳且功能有限。为了展示自己的能力和技术实力&#xff0c;他决定利用Spring AOP&#xff08;面向切面编程&#xff09;开发一个更高效的日志处理系统&#xff0c;并将其存储在Redis中。 首先…...

ubuntu新装ubuntu,重启黑屏

现象&#xff1a;双系统电脑向移动硬盘安装Ubuntu系统后&#xff0c;重启黑屏并显示Minimal BASH-like line editing is supported. For the first word, TAB lists possible command completions. Anywhere else TAB lists possible device or file completions. 又拔下无法启…...

太极安全监控系统0.8

完善后的代码及功能详细介绍 完善后的代码 python import os import sys import subprocess import re import datetime import threading import tkinter as tk from tkinter import messagebox, simpledialog, ttk import scapy.all as scapy import whois import numpy as …...

E-清楚姐姐的布告规划【01背包】

就当一个01背包写就行&#xff0c;只不过需要保证不交叉&#xff0c;w[i]覆盖i点&#xff0c;用一个if来判断即可 #include<bits/stdc.h> #define int long long using namespace std; int w[5005]; int f[5005]; int t,n,m; signed main() {cin>>t;while(t--){…...

哪款宠物空气净化器噪音低?希喂、美的、安德迈测评分享

今年双11&#xff0c;宠物空气净化器到底应该如何选&#xff1f;在所有的家电品类里&#xff0c;宠物空气净化器算是比较特殊的那个&#xff0c;产品迭代太快&#xff0c;我们把今年双11在售的各大主流品牌的宠物空气净化器统一汇总整理&#xff0c;发现基本一多半都是24年下半…...

2024年10月23日第一部分

1.马小民要不要承担责任 2.主动 我就是那种平常沉默寡言孤僻内向自卑又宅又无趣&#xff0c;感觉不管在哪里都是比较边缘不合群的人。6月份遇到一个女生&#xff0c;还是人家主动加的我&#xff0c;断断续续聊了一个月就没下文了&#xff0c;可能我没谈过恋爱吧&#xff0c;快…...

医院信息化与智能化系统(9)

医院信息化与智能化系统(9) 这里只描述对应过程&#xff0c;和可能遇到的问题及解决办法以及对应的参考链接&#xff0c;并不会直接每一步详细配置 如果你想通过文字描述或代码画流程图&#xff0c;可以试试PlantUML&#xff0c;告诉GPT你的文件结构&#xff0c;让他给你对应的…...

逻辑回归与神经网络

从逻辑回归开始学习神经网络 神经网络直观上解释&#xff0c;就是由许多相互连接的圆圈组成的网络模型&#xff1a; 而逻辑回归可以看作是这个网络中的一个圆圈&#xff1a; 圆圈被称为神经元&#xff0c;整个网络被称为神经网络。 本节的任务是我们究竟如何理解具体的一个神…...

隨筆 20241024 Kafka 数据格式解析:批次头与数据体

Kafka作为分布式流处理平台&#xff0c;以其高吞吐量、可扩展性和强大的数据传输能力&#xff0c;成为了现代大数据和实时处理的核心组件之一。在Kafka中&#xff0c;数据的存储和传输遵循一种高效的结构化格式&#xff0c;主要由 批次头&#xff08;Batch Header&#xff09;和…...

学电子商务有用吗/seo网络优化软件

因为经常要涉及到版本号的判断&#xff0c;经常记不住特来记录下供下次查阅 版本号判断代码&#xff1a; if(Build.VERSION.SDK_INT > Build.VERSION_CODES.Q){//>安卓10的逻辑部分 }API 版本号版本名称英文名称194.4KITKAT204.4KITKAT_WATCH215.0LOLLIPOP225.1LOLL…...

wordpress 上传任意附件/搜狐视频

如何判断R为第几范式&#xff1f; 已知一个关系模式的属性之间的语义&#xff0c;也就是相互依赖的关系&#xff0c;如何判断该模式满足第几范式&#xff1f; 1、首先要通过语义把属性之间的函数依赖关系列出来&#xff0c; 2、然后确定哪些属性组合可以候选码&#xff0c;从…...

商城网站建站方案/石家庄新闻网头条新闻

一、调试前提 1. Hardware 720p的DSI接口屏hx8394d,MIPI接口相关原理图如下图 通过原理图获取的信息: 1)2.8V VDD供电脚 —— LDO17; 2)1.8V VDD供电脚 —— LDO6; 3)RESET脚 —— GPIO25; 4)TE脚(一般DSI CMD模式下才会使用)—— GPIO24; 5)背光使能脚 —— G…...

php手机网站/四年级摘抄一小段新闻

简介 之前我们想到Excel解析一般是使用POI&#xff0c;但POI存在一个严重的问题&#xff0c;就是非常消耗内存。所以阿里人员对它进行了重写从而诞生了easyexcel&#xff0c;它解决了过于消耗内存问题&#xff0c;也对它进行了封装让使用者使用更加便利。 新手同学&#xff0…...

网站流量数据分析/吸引客人的产品宣传句子

查了一些资料也不是太明白两个的区别&#xff0c;但是前者是最安全的用法 打个简单的比方&#xff0c;你一个WEB程序&#xff0c;发布到Tomcat里面运行。首先是执行Tomcat org.apache.catalina.startup.Bootstrap类&#xff0c;这时候的类加载器是ClassLoader.getSystemClassLo…...

做背景图获取网站/附子seo教程

【杠精学物理】第267篇原创文章。今天视频要讲的是一个高考中常见的问题——欧姆表的误差分析(当电源电动势降低&#xff0c;内阻增大时&#xff0c;测量值与真实值差异问题)。问题来源于前两天看到学生群里的讨论&#xff0c;感觉同学们越辩越糊涂。在此录制一个视频&#xff…...