《贪心算法:原理剖析与典型例题精解》

 必刷的贪心算法典型例题!

算法竞赛(蓝桥杯)贪心算法1——数塔问题-CSDN博客

算法竞赛(蓝桥杯)贪心算法2——需要安排几位师傅加工零件-CSDN博客

算法(蓝桥杯)贪心算法3——二维数组排序与贪心算法——活动选择-CSDN博客

算法(蓝桥杯)贪心算法4——拦截导弹的系统数量求解-CSDN博客

算法(蓝桥杯)贪心算法5——删数问题的解题思路-CSDN博客

算法(蓝桥杯)贪心算法6——均分纸牌问题的解题思路与代码实现-CSDN博客

算法(蓝桥杯)贪心算法7——过河的最短时间问题解析-CSDN博客


贪心算法:在选择中追求最优解

在算法的世界里,贪心算法是一种简单而强大的策略,它如同一位精明的决策者,在每一步都做出看似最优的选择,以期达到全局的最优解。本文将带你深入了解贪心算法的原理、特点、应用场景以及局限性,让你对这一算法有全面而清晰的认识。

一、贪心算法的定义与原理

贪心算法是一种在每一步选择中都采取当前状态下最优(即最有利)的选择,从而希望导致结果是全局最优的算法。它的核心思想是“贪心”,即在解决问题的过程中,总是做出局部最优的选择,希望通过一系列局部最优的选择来达到全局最优解。

举个简单的例子,假设你面前有一堆硬币,有1元、5角、1角等不同面值,现在需要凑出3元7角。贪心算法的思路就是先选择面值最大的硬币,也就是1元硬币,尽可能多地拿,直到不能再拿为止。然后选择次大的5角硬币,继续尽可能多地拿……按照这种贪心的策略,最终可以凑出所需的金额。在这个过程中,每一步都选择了当前能拿的最大的硬币,这就是局部最优的选择,而通过这种方式,最终也得到了全局最优的解,即用最少的硬币数凑出了3元7角。

二、贪心算法的特点

(一)简单直观

贪心算法的逻辑非常简单,它不需要复杂的数学推导和大量的数据结构支持,只需按照一定的规则在每一步做出选择即可。这种简单性使得贪心算法容易理解和实现,对于一些简单的问题,甚至可以直接凭借直觉写出贪心算法的解决方案。例如在解决“找零钱”问题时,按照硬币面值从大到小依次选择,这种思路几乎人人都能迅速理解并应用。

(二)高效性

由于贪心算法在每一步都只考虑当前的最优选择,而不需要回溯或者考虑其他可能的选择,因此它的执行效率通常很高。在很多情况下,贪心算法的时间复杂度相对较低,能够快速得到问题的解。比如在“活动安排问题”中,通过按照活动结束时间对活动进行排序,然后依次选择不冲突的活动,这个过程的时间复杂度主要取决于排序操作,通常为O(nlogn),在处理大量数据时,这种高效的算法能够显著节省时间和计算资源。

(三)局限性

然而,贪心算法并非万能的。它的局限性在于不能保证对所有问题都能得到全局最优解。因为贪心算法只是在每一步选择局部最优解,而这些局部最优解组合起来并不一定就是全局最优解。有些问题可能存在多种选择路径,而贪心算法可能会因为早期的错误选择而陷入局部最优的陷阱,从而无法得到真正的全局最优解。例如在“背包问题”中,如果单纯按照物品价值从高到低或者单位价值(价值/重量)从高到低的顺序选择物品放入背包,可能会导致背包无法充分利用,从而得不到最大价值的解。

三、贪心算法的应用场景

(一)活动安排问题

假设有一个教室,需要安排多个活动,每个活动都有开始时间和结束时间。如何安排这些活动,使得这个教室能够容纳尽可能多的活动呢?这就是一个典型的活动安排问题。使用贪心算法,可以按照活动结束时间对活动进行排序,然后依次选择结束时间最早的活动,并且保证选择的活动之间不冲突。通过这种方式,能够最大化教室的利用率,安排尽可能多的活动。

(二)最短路径问题

在图论中,求解从一个顶点到另一个顶点的最短路径是一个常见的问题。Dijkstra算法就是一种基于贪心思想的算法,用于解决单源最短路径问题。它从源点开始,按照距离源点的远近依次选择顶点,每次选择距离源点最近且未被访问过的顶点,然后更新该顶点到其他顶点的距离。通过这种贪心的选择策略,Dijkstra算法能够逐步构建出从源点到图中所有顶点的最短路径树,从而得到最短路径。

(三)霍夫曼编码

在数据压缩领域,霍夫曼编码是一种广泛应用的压缩算法。它通过构建霍夫曼树来实现对字符的高效编码。在构建霍夫曼树的过程中,贪心算法发挥了关键作用。每次选择频率最低的两个字符(或者节点)进行合并,然后更新字符的频率,重复这个过程,直到所有字符都被合并到一棵树中。通过这种方式构建的霍夫曼树能够保证字符的编码长度与其频率成反比,从而实现对数据的有效压缩。

四、贪心算法的实现步骤

实现贪心算法通常需要遵循以下步骤:

(一)建立数学模型

首先,需要对问题进行分析,建立一个数学模型来描述问题。明确问题的目标是什么,需要做出哪些选择,以及这些选择之间的关系。例如在“最小生成树问题”中,数学模型就是一个带权图,目标是找到一棵生成树,使得树的总权重最小。

(二)确定贪心策略

根据问题的特点和数学模型,确定一个贪心策略,即在每一步选择中,如何做出局部最优的选择。这个策略需要能够清晰地指导算法在每一步应该选择什么。例如在“最小生成树问题”中,可以采用Prim算法的贪心策略,每次选择权重最小的边,将一个新的顶点加入到生成树中;或者采用Kruskal算法的贪心策略,按照边的权重从小到大依次选择边,只要这条边不会与已经选择的边构成环,就将其加入到生成树中。

(三)逐步求解

按照确定的贪心策略,从初始状态开始,逐步进行选择,直到得到问题的解。在每一步选择中,都需要根据当前的状态和贪心策略来做出决策,并更新当前的状态。例如在“哈夫曼编码”中,从初始的字符集合开始,按照贪心策略逐步选择频率最低的字符进行合并,每次合并后更新字符集合,直到构建出完整的霍夫曼树。

(四)验证解的正确性

得到解之后,需要对解进行验证,确保它满足问题的要求。对于一些问题,可以通过与已知的最优解进行比较来验证;对于没有已知最优解的问题,可以通过逻辑推理或者测试不同的输入来验证解的正确性。例如在“活动安排问题”中,验证得到的活动安排是否满足活动之间不冲突的要求,以及是否确实安排了尽可能多的活动。

五、总结

贪心算法是一种简单、高效的算法策略,在很多问题中都能发挥重要作用。它通过在每一步选择局部最优解,希望能够得到全局最优解。虽然贪心算法不能保证对所有问题都能得到最优解,但在很多实际问题中,它能够快速得到一个相对较好的解。了解贪心算法的原理、特点和应用场景,可以帮助我们在面对问题时,快速判断是否可以使用贪心算法来解决,从而提高解决问题的效率。在实际应用中,我们需要结合问题的具体情况,灵活运用贪心算法,同时也要注意其局限性,避免陷入局部最优的陷阱。

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

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

相关文章

基于 Python 的深度学习的车俩特征分析系统,附源码

博主介绍:✌stormjun、7年大厂程序员经历。全网粉丝12w、csdn博客专家、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ 🍅文末获取源码联系🍅 👇🏻 精彩专栏推荐订阅👇&…

VSCode 的部署

一、VSCode部署 (1)、简介 vsCode 全称 Visual Studio Code,是微软出的一款轻量级代码编辑器,免费、开源而且功能强大。它支持几乎所有主流的程序语言的语法高亮、智能代码补全、自定义热键、括号匹配、代码片段、代码对比Diff、版本管理GIT等特性&…

【开源免费】基于SpringBoot+Vue.JS欢迪迈手机商城(JAVA毕业设计)

本文项目编号 T 141 ,文末自助获取源码 \color{red}{T141,文末自助获取源码} T141,文末自助获取源码 目录 一、系统介绍二、数据库设计三、配套教程3.1 启动教程3.2 讲解视频3.3 二次开发教程 四、功能截图五、文案资料5.1 选题背景5.2 国内…

Transformer创新模型!Transformer+BO-SVR多变量回归预测,添加气泡图、散点密度图(Matlab)

Transformer创新模型!TransformerBO-SVR多变量回归预测,添加气泡图、散点密度图(Matlab) 目录 Transformer创新模型!TransformerBO-SVR多变量回归预测,添加气泡图、散点密度图(Matlab&#xff0…

Nmap之企业漏洞扫描(Enterprise Vulnerability Scanning for Nmap)

简介 Namp是一个开源的网络连接端扫描软件,主要用于网络发现和安全审核。‌它可以帮助用户识别网络上的设备、分析它们的服务、检测操作系统类型,甚至发现潜在的安全漏洞。Nmap由Fyodor开发,最初是为了满足网络管理员的需求,但随…

windows下安装并使用node.js

一、下载Node.js 选择对应你系统的Node.js版本下载 Node.js官网下载地址 Node.js中文网下载地址??? 这里我选择的是Windows64位系统的Node.js20.18.0(LTS长期支持版本)版本的.msi安装包程序 官网下载: 中文网下载: 二、安…

Ability Kit-程序框架服务(类似Android Activity)

文章目录 Ability Kit(程序框架服务)简介Stage模型开发概述Stage模型应用组件应用/组件级配置UIAbility组件概述概述声明配置 生命周期概述生命周期状态说明Create状态WindowStageCreate**和**WindowStageDestroy状态WindowStageWillDestroy状态Foregrou…

Redis超详细入门教程(基础篇)

目录 一、什么是Redis 二、安装Redis 1、Windows系统安装 2、Linux系统安装 三、Redis通用命令 四、Redis基本命令 五、五种数据结构类型 5.1、String类型 5.2、List集合类型 5.3、Set集合类型 5.4、Hash集合类型 5.5、Zset有序集合类型 六、总结 一、什么是Redi…

黑马Java面试教程_P1_导学与准备篇

系列博客目录 文章目录 系列博客目录导学Why?举例 准备篇企业是如何筛选简历的(筛选简历的规则)HR如何筛选简历部门负责人筛选简历 简历注意事项简历整体结构个人技能该如何描述项目该如何描述 应届生该如何找到合适的练手项目项目来源找到项目后,如何深入学习项目…

在Linux上如何让ollama在GPU上运行模型

之前一直在 Mac 上使用 ollama 所以没注意,最近在 Ubuntu 上运行发现一直在 CPU 上跑。我一开始以为是超显存了,因为 Mac 上如果超内存的话,那么就只用 CPU,但是我发现 Llama3.2 3B 只占用 3GB,这远没有超。看了一下命…

算法(蓝桥杯)贪心算法7——过河的最短时间问题解析

一、题目描述 在漆黑的夜里,N位旅行者来到了一座狭窄且没有护栏的桥边。他们只带了一只手电筒,且桥窄得只够让两个人同时过。如果各自单独过桥,N人所需的时间已知;若两人同时过桥,则所需时间是走得较慢的那个人单独行动…

LDD3学习7--硬件接口I/O端口(以short为例)

1 理论 1.1 基本概念 目前对外设的操作,都是通过寄存器。寄存器的概念,其实就是接口,访问硬件接口,有I/O端口通信和内存映射I/O (Memory-Mapped I/O),I/O端口通信是比较老的那种,都是老的串口并口设备&am…

前端【3】--CSS布局,CSS实现横向布局,盒子模型

盒子分类 1、块级盒子 2、内联级盒子 3、内联块级盒子 4、弹性盒子 5、盒子内部分区 方法一:使用 float 普通盒子实现横向布局 方法二:使用 display: inline-block 内联块级元素实现横向布局 方法三:使用弹性盒子 flexbox&#xff0…

初学stm32 --- flash模仿eeprom

目录 STM32内部FLASH简介 内部FLASH构成(F1) FLASH读写过程(F1) 闪存的读取 闪存的写入 内部FLASH构成(F4 / F7 / H7) FLASH读写过程(F4 / F7 / H7) 闪存的读取 闪存的写入 …

LLM - 大模型 ScallingLaws 的 CLM 和 MLM 中不同系数(PLM) 教程(2)

欢迎关注我的CSDN:https://spike.blog.csdn.net/ 本文地址:https://spike.blog.csdn.net/article/details/145188660 免责声明:本文来源于个人知识与公开资料,仅用于学术交流,欢迎讨论,不支持转载。 Scalin…

【数据库】MySQL数据库SQL语句汇总

目录 1.SQL 通用语法 2.SQL 分类 2.1.DDL 2.2.DML 2.3.DQL 2.4.DCL 3.DDL 3.1.数据库操作 3.1.1.查询 3.1.2.创建 3.1.3.删除 3.1.4.使用 3.2.表操作 3.2.1.查询 3.2.2.创建 3.2.3.数据类型 3.2.3.1.数值类型 3.2.3.2.字符串类型 3.2.3.3.日期时间类型 3.2…

JavaEE之CAS

上文我们认识了许许多多的锁,此篇我们的CAS就是从上文的锁策略开展的新概念,我们来一探究竟吧 1. 什么是CAS? CAS: 全称Compare and swap,字⾯意思:“比较并交换”,⼀个CAS涉及到以下操作: 我们假设内存中…

【Go】Go数据类型详解—指针

1. 前言 在我看来,一门编程语言语法的核心就在于数据类型。而各类编程语言的基本数据类型大致相同:int整型、float浮点型、string字符串类型、bool布尔类型,但是在一些进阶数据类型上就有所不同了。本文将会介绍Go语言当中核心的数据类型——…

前端性能-HTTP缓存

前言 开启 HTTP 缓存是提升前端性能的常见手段之一。通过缓存,浏览器可以临时存储资源,在后续请求中直接使用本地副本,从而有效减少 HTTP 请求次数,显著缩短网页加载时间。以下是 HTTP 缓存的几个关键点: 1、减少重复…

2024CVPR《HomoFormer》

这篇论文提出了一种名为HomoFormer的新型Transformer模型,用于图像阴影去除。论文的主要贡献和创新点如下: 1. 研究背景与动机 阴影去除的挑战:阴影在自然场景图像中普遍存在,影响图像质量并限制后续计算机视觉任务的性能。阴影的空间分布不均匀且模式多样,导致传统的卷积…