一、什么是贪心算法?

贪心算法是一种算法设计范式,指在解决问题时,依赖于每次选择最优的局部解,以期最终得到全局最优解。贪心算法的关键特点是:

  • 局部最优选择:每个阶段选择当前看起来最好的选择(局部最优解)。
  • 不回溯:一旦做出选择,就不再回溯,不会重新考虑先前的选择。
  • 全局最优性:假设通过局部最优解的选择能够得到全局最优解,但这种假设并不适用于所有问题。

贪心算法并不总能得到最优解,但它在很多特定问题中可以取得很好的近似解,且在实践中非常高效。

二、贪心算法的特性
  1. 贪心选择性质:可以通过局部最优解来推导出全局最优解。这意味着,每次选择当前最好的选择,不考虑其他可能的选择。
  2. 最优子结构:问题的最优解可以由其子问题的最优解构成。
  3. 无后效性:一旦做出决策,就无法改变选择。即,在每一步的选择中,已经做出的决策会影响后续的选择,但不会后悔或撤销决策。
三、贪心算法适用的条件

贪心算法并不适用于所有问题。为了使贪心算法得到全局最优解,问题必须具备以下两个性质:

  1. 最优子结构:即问题的最优解能够通过子问题的最优解构造出来。例如,最小生成树、最短路径等问题就具有最优子结构。
  2. 贪心选择性质:每一步的选择是局部最优的,能够最终得到全局最优解。例如,活动选择问题、找零问题等问题。
四、贪心算法的优缺点
优点:
  • 简单易懂:贪心算法的思想非常直观,通常可以通过简单的选择策略来实现。
  • 高效:贪心算法通常可以在较短的时间内完成计算,尤其适合解决某些具有贪心选择性质的简单问题。
  • 不需要回溯:每次选择都独立进行,不需要回溯或重新计算,算法流程简单。
缺点:
  • 无法保证最优解:贪心算法并不总能给出全局最优解,尤其是当问题的局部最优解不能保证全局最优时。
  • 适用范围有限:并非所有问题都适合使用贪心算法,必须确保问题满足贪心选择性质和最优子结构。
五、经典的贪心算法问题
  1. 找零问题

    • 给定不同面额的硬币,求如何用最少数量的硬币兑换给定的金额。
    • 例如,硬币面额为 {1, 5, 10, 25},目标金额为 63,贪心算法的选择是先用25元硬币,接着用10元硬币,再用5元硬币,最后用1元硬币,直到金额兑换完。
  2. 活动选择问题

    • 给定多个活动的开始和结束时间,选择能够参与的最多活动,且活动之间没有重叠。
    • 通过贪心策略,每次选择结束时间最早的活动,确保可以安排尽可能多的活动。
  3. 霍夫曼编码

    • 给定一组字符及其出现频率,设计一种最优的编码方式,使得常用字符使用较短的编码,减少信息存储空间。
    • 通过构造霍夫曼树来实现,每次选择频率最小的两个字符合并,直到所有字符都合并成一个树。
  4. 最小生成树

    • 例如 Kruskal 和 Prim 算法,都是利用贪心算法求解图的最小生成树。每次选择当前边权最小的边,直到图中包含所有节点且没有回路。
六、贪心算法的实现示例
1. 找零问题

假设我们有硬币面额 {1, 5, 10, 25},我们要用最少的硬币数量兑换金额 63。

#include <iostream>
#include <vector>using namespace std;// 贪心算法求解最少硬币问题
void minCoins(int amount, vector<int>& coins) {int count = 0;  // 记录所需硬币数// 从大到小按面额排序for (int i = coins.size() - 1; i >= 0; --i) {while (amount >= coins[i]) {amount -= coins[i];count++;}}cout << "Minimum coins needed: " << count << endl;
}int main() {vector<int> coins = {1, 5, 10, 25};  // 硬币面额int amount = 63;  // 目标金额minCoins(amount, coins);return 0;
}

解释:

  • 贪心算法从最大的硬币开始选择,每次尽可能使用最多的当前硬币面额,直到找零金额为零。
  • 时间复杂度是 O(n),其中 n 是硬币种类数。
2. 活动选择问题

给定活动的开始和结束时间,我们希望选择最多的活动,且没有重叠。

#include <iostream>
#include <vector>
#include <algorithm>using namespace std;struct Activity {int start, end;
};bool compare(Activity a, Activity b) {return a.end < b.end;  // 按结束时间升序排序
}void activitySelection(vector<Activity>& activities) {sort(activities.begin(), activities.end(), compare);  // 按结束时间排序int n = activities.size();int i = 0;  // 选择第一个活动cout << "Selected activities: " << endl;cout << "Activity: (" << activities[i].start << ", " << activities[i].end << ")" << endl;for (int j = 1; j < n; ++j) {if (activities[j].start >= activities[i].end) {cout << "Activity: (" << activities[j].start << ", " << activities[j].end << ")" << endl;i = j;  // 更新上一个活动}}
}int main() {vector<Activity> activities = {{1, 4}, {3, 5}, {0, 6}, {5, 7}, {3, 8}, {5, 9}, {6, 10}, {8, 11}, {8, 12}};activitySelection(activities);return 0;
}

解释:

  • 通过贪心选择最早结束的活动来确保后续的活动不与已选活动重叠。
  • 活动排序时间复杂度是 O(n log n),选择活动的时间复杂度是 O(n)
七、贪心算法的应用与总结

贪心算法适用于具有最优子结构贪心选择性质的问题,在这些问题中,通过选择当前最优的解来达到整体的最优解。虽然贪心算法简单高效,但并不适合所有问题。在应用时,我们必须验证问题是否符合贪心算法的应用条件。

  • 对于一些问题(如最短路径问题、背包问题等),贪心算法可能无法得到最优解,因此需要使用动态规划或回溯算法来求解。
  • 对于合适的问题,贪心算法可以大大减少计算量,是非常实用的解决方案。

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

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

相关文章

电梯的构造|保养|维修视频全集_电梯安全与故障救援(课程下载)

课程下载&#xff1a;https://download.csdn.net/download/m0_66047725/91699586 电梯原理与维修视频教程 相关简介: 电梯现在运用的非常广泛,比如大型商场,建筑工地,特别是现在建造的很多高楼、商品房,基本都是安装了电梯。电梯维保不力是导致电梯运行中安全事故频发的主要原…

Traefik网关DNS解析超时问题优化

1、背景 在生产环境使用 Traefik 网关时出现了偶发的 DNS 解析超时导致网关与后端服务建立连接异常的情况。通过调用链埋点数据观察发现&#xff0c;该部署环境中 Traefik 的 DNS 解析性能较差&#xff0c;耗时通常在 4ms 以上&#xff08;正常应该是 1ms 以内&#xff09; 初…

从0到1掌握 Spring Security(第三篇):三种认证方式,按配置一键切换

> 本文是Spring Security系列第三篇,将带你实现内存、JDBC和自定义三种认证方式的无缝切换,只需修改配置文件即可完成认证策略变更! ## 一、为什么需要多种认证方式? 在软件开发的不同阶段,我们需要不同的认证策略: - **开发阶段**:使用内存认证,快速配置测试账号…

阿里云国际站云防火墙:如何利用阿里云云防火墙实现细粒度的访问控制?

利用阿里云云防火墙实现细粒度的访问控制&#xff0c;可以从分层策略、精确匹配、动态调整三个方面着手&#xff0c;让不同业务、用户和资源的访问权限清晰可控。一、明确控制目标业务隔离&#xff1a;不同业务系统、部门或环境&#xff08;生产/测试&#xff09;之间互不干扰。…

rom定制系列------小米cc9机型 原生安卓15系统 双版线刷root 定制修改功能项

小米 9 Lite/CC9 机型代码;pyxis.搭载骁龙710处理器.适用于以下型号的小米机型&#xff1a;M1904F3BG, M1904F3BC. 刷写前提; 需要当前机型已经解锁bl的状态下进入fast模式刷写。此机型可以正常官方解锁与强解bl锁。效果都是一样的。在fast模式下装好联机驱动。使用官方平台刷…

解读60页全面认识大数据基础知识培训【附全文阅读】

该培训课件适用于对大数据知识感兴趣的初学者、企业管理人员、相关技术从业者等。内容围绕大数据展开,先介绍其基本概念,包括定义、数据级别、来源、类型、价值挖掘等,还阐述了 5 个 “V” 特征及与传统数据的区别。接着讲述大数据的发展演进,涵盖国际国内发展历程、发展阶…

Prompt engineering(PE) —— prompt 优化如何进行?

从新手到高手&#xff1a;Prompt最佳实践全解析 一、引言&#xff1a;开启 Prompt 的神秘大门在这个人工智能飞速发展的时代&#xff0c;AI 已经悄然融入我们生活的方方面面。你是否有过这样的经历&#xff1a; 当你对着智能音箱询问 “明天天气如何” 时&#xff0c;它能迅速给…

云服务器的优缺点都有哪些?

云服务器作为一种有着高度灵活性的服务器类型&#xff0c;能够根据用户的需求来调整资源&#xff0c;有着很强的优势&#xff0c;但是云服务器还是有着一定的缺点的&#xff0c;本文就来共同探讨一下云服务器的优缺点都有哪些吧&#xff01;首先&#xff0c;云服务器能根据业务…

宋红康 JVM 笔记 Day05|运行时数据区内部结构、JVM中的线程说明、程序计数器

一、今日视频区间 P39-P43 二、一句话总结 运行时数据区内部结构&#xff1b;JVM中的线程说明&#xff1b;程序计数器&#xff08;PC寄存器&#xff09;&#xff1b; 三、关键图/命令 3.1 运行时数据区内部结构3.2 JVM中的线程说明3.3 程序计数器&#xff08;PC寄存器&#xff…

Java增强for循环(小白友好版)

前言&#xff1a;为什么需要增强for循环&#xff1f;作为Java初学者&#xff0c;你或许已经学会使用传统for循环来遍历数组或集合&#xff1a;for (int i 0; i < array.length; i) {System.out.println(array[i]); }这种写法需要手动维护索引变量i&#xff0c;对于集合还需…

【OLAP】trino安装和基本使用

目录 ​一、概述 1.1Trino不是什么 1.2Trino是什么 二、Trino特点 三、Trino架构 3.1架构和服务节点 3.2Trino数据模型 四、Trino安装部署 4.1配置JDK 4.2单机版&#xff08;Coordinator和Worker同进程&#xff09; 4.2.1启动服务 4.2.2下载客户端 五、配置HTTPS&…

如何写出更清晰易读的布尔逻辑判断?

列编码技巧和规范&#xff0c;来降低逻辑的“认知负荷”。成功的实践&#xff0c;必须系统性地涵盖五大关键策略&#xff1a;采用有意义的变量名进行封装、将复杂的判断拆解为独立的函数、优先使用“肯定式”而非“否定式”逻辑、利用括号明确运算的优先级、以及运用德摩根定律…

新手向:Java方向讲解

从诺基亚塞班到阿里双11&#xff0c;从安卓应用到华尔街交易&#xff0c;Java用一行System.out.println()征服了数字世界1998年&#xff0c;诺基亚在塞班系统上首次采用Java ME技术&#xff0c;让手机具备了运行应用程序的能力&#xff0c;开启了移动互联网的序幕。当时的Java开…

视觉图像界面设计【QT-creator高级编程 - 01】图像显如何保证跟随主窗口变化,且保留必要的设定窗口

前言&#xff1a;问题&#xff0c;显示图像的时候&#xff0c;按最大窗口&#xff0c;图片窗口不跟着变大&#xff0c;还有&#xff0c;右边那些设置控件都没有动解决&#xff1a;步骤1&#xff1a;1️⃣ 让 graphicsView 自动占满在 Qt Creator 中选中 graphicsView_7 / 12 / …

pair之于vector、queue(vector<pair<int,int>>)

1、vector&#xff1c;pair&#xff1c;int,int&#xff1e;&#xff1e; 和 Map 的异同点map&#xff1a;会对插入的元素按键Key&#xff0c;自动排序&#xff0c;而且键Key不允许重复&#xff1b;vector&#xff1a;的这种用法不会自动排序&#xff0c;而且允许重复。2、queu…

从合规到卓越:全星QMS如何成为制造企业的质量战略引擎

从合规到卓越&#xff1a;全星质量管理QMS软件系统如何成为制造企业的质量战略引擎 全星质量管理QMS软件系统凭借其高度定制化、智能化、全流程覆盖等核心优势&#xff0c;已在汽车制造、电子、医疗、航空航天等多个高端制造领域实现领先性应用&#xff0c;显著提升了企业的质…

按键及消抖

方法一&#xff1a;延时阻塞key.c:#include "key.h" #include "delay.h"//初始化GPIO void key_init(void) {GPIO_InitTypeDef gpio_initstruct;//打开时钟__HAL_RCC_GPIOA_CLK_ENABLE(); // 使能GPIOA时钟//调用GPIO初始化函数…

什么是接口?PHP如何使用 SessionHandlerInterface 接口实现Session自定义会话数据存储

在面向对象编程中&#xff0c;接口&#xff08;Interface&#xff09;作为类与类之间的契约规范&#xff0c;定义了实现类必须遵守的方法签名集合&#xff0c;却不包含具体实现细节。这种抽象机制通过强制统一的方法命名和参数结构&#xff0c;实现了代码的解耦与多态性&#x…

健身房预约系统SSM+Mybatis-plus实现(二、增删改查的具体实现)

文章目录一、环境搭建二、用户管理页面&#xff08;纯展示无事件操作&#xff09;0.三步走1.查询表单&#xff08;1&#xff09;书写页面代码 &#xff1a;&#xff08;2&#xff09;对应的js部分创建对象数据模型的绑定部分&#xff1a;&#xff08;3&#xff09;引入需要的库…

在IAR Embedded Workbench for Arm中实现NXP S32K3安全调试

随着汽车电子系统变得越来越智能&#xff0c;对功能安全&#xff08;Safety&#xff09;的要求越来越高&#xff0c;同时信息安全&#xff08;Security&#xff09;也越来越被关注&#xff0c;安全调试&#xff08;Secure Debug&#xff09;机制已成为一个重要的信息安全特性。…