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

数据结构与算法 — 贪心算法

数据结构与算法

数据结构与算法是计算机科学中的两个核心概念,它们在软件开发和问题解决中起着至关重要的作用。

数据结构

数据结构是计算机中存储、组织和管理数据的方式,它能够帮助我们高效地访问和修改数据。不同的数据结构适用于不同类型的应用场景。

常见的数据结构包括:

  • 数组:一种线性数据结构,用于存储具有相同类型的元素集合,每个元素在内存中占据连续的位置。
  • 链表:由节点组成的线性数据结构,每个节点包含数据和指向下一个节点的指针。
  • 栈:一种后进先出(LIFO)的数据结构,常用于管理函数调用、表达式求值等。
  • 队列:一种先进先出(FIFO)的数据结构,适用于任务调度、缓冲处理等场景。
  • 树:一种分层数据结构,由节点组成,每个节点可以有零个或多个子节点。
  • 图:由顶点(节点)和边组成,可以表示多对多的关系,适用于网络分析、路径查找等。

算法

算法是解决特定问题的一系列步骤和规则。算法的性能通常通过时间复杂度和空间复杂度来衡量。算法的设计和选择对程序的效率有很大影响。

常见的算法类型包括:

  • 排序算法:如快速排序、归并排序、堆排序等,用于将数据集合按特定顺序排列。
  • 搜索算法:如二分搜索、深度优先搜索(DFS)、广度优先搜索(BFS)等,用于在数据结构中查找特定元素。
  • 图算法:如Dijkstra算法、A*搜索算法、Prim算法和Kruskal算法等,用于解决图中的最短路径、最小生成树等问题。
  • 动态规划:一种通过将问题分解为重叠的子问题来解决问题的方法,适用于具有最优子结构特性的问题。
  • 分治算法:将问题分解为若干个规模较小的子问题,递归解决子问题后合并结果,适用于某些特定类型的优化问题。
  • 贪心算法:基于贪心策略,这种策略在每一步选择中都采取当前状态下最优的局部解,希望通过一系列局部最优解最终构造出一个全局最优解。

贪心算法

贪心算法的原理是基于贪心策略,这种策略在每一步选择中都采取当前状态下最优的局部解,希望通过一系列局部最优解最终构造出一个全局最优解。贪心算法的核心思想可以概括为以下几点:

  • 选择标准:根据问题定义一个选择标准,这个标准用于评价哪个选择是当前最优的。这个标准通常与问题的最终目标直接相关,例如最小化总成本或最大化总价值。

  • 局部最优解:在每一步决策中,算法都会选择当前看起来最优的解决方案。这种选择是基于局部信息做出的,而不依赖于未来的信息。

  • 无回溯:一旦做出了选择,贪心算法就不会撤销或回溯。这意味着算法的决策是一次性的,一旦确定,就会沿着这个方向继续前进。

  • 迭代过程:贪心算法通常通过迭代过程逐步构建解决方案。在每一轮迭代中,算法都会根据选择标准选择最优的决策,直到达到问题的终止条件。

  • 问题构造:贪心算法适用于某些特定类型的问题,这些问题可以通过贪心选择性质和最优子结构性质来解决。选择性质意味着局部最优选择可以确保全局最优解;子结构性质意味着问题的最优解包含其子问题的最优解。

贪心算法的适用性

贪心算法并不适用于所有问题。一个问题是否适合使用贪心算法,需要满足以下两个重要性质:

  • 贪心选择性质:算法可以做出局部最优选择,并且这些局部最优选择能够导向全局最优解。这意味着选择过程中不需要考虑将来的后果,因为局部最优解总是能够导致全局最优解。

  • 最优子结构性质:一个问题的最优解包含其子问题的最优解。这意味着问题可以通过解决其子问题并组合这些子问题的解来解决。

贪心算法应用场景

  1. 最小生成树问题
    问题描述:给定一个带权的无向连通图,如何选择边构造一棵包含所有顶点且总权重最小的生成树。
    解决方案
    1)Prim算法:从一个顶点开始,逐步增加新的边和顶点,每次都选择连接已选顶点和未选顶点之间权重最小的边。
    2)Kruskal算法:将所有边按权重从小到大排序,依次选择边,如果加入当前边不会形成环,则加入该边,直到所有顶点都被连接。

  2. 背包问题
    问题描述:给定一组物品,每个物品有重量和价值,在限定的总重量内,选择一部分物品,使得总价值最大。
    解决方案:按照单位重量价值(价值/重量)从高到低排序,然后从最高单位重量价值的物品开始,尽可能选择物品,直到达到背包重量限制。

  3. 活动选择问题
    问题描述:给定一系列活动,每个活动有开始时间和结束时间,选择最大的互不相交的活动集合。
    解决方案:将活动按结束时间从早到晚排序,然后选择第一个活动,之后每次都选择与已选活动不相交的最早结束的活动。

  4. 哈夫曼编码(Huffman Coding)
    问题描述:如何为一组字符设计最优的二进制编码,使得编码的平均长度尽可能短。
    解决方案
    1)统计每个字符出现的频率。
    2)将每个字符看作一个叶子节点,并根据频率创建一个优先队列(最小堆)。
    3)每次从优先队列中取出两个频率最小的节点,创建一个新的内部节点作为它们的父节点,其
    频率为两个子节点频率之和。
    4)将新创建的节点加入优先队列。
    5)重复步骤3和4,直到优先队列中只剩下一个节点,这个节点就是哈夫曼树的根节点。
    6)从根节点到每个叶子节点的路径就构成了字符的哈夫曼编码。

  5. 找零问题
    问题描述:假设你是一名收银员,需要给顾客找零n元,你手头有各种面额的货币。如何用最少的硬币数找给顾客。
    解决方案:首先,确定货币的面额顺序,例如1元、5元、10元、20元、50元、100元。然后,从最大面额开始,尽可能多地使用该面额的硬币,直到剩余找零金额小于该面额,然后转向下一个较小的面额,重复此过程,直到找零完成。

  6. 硬币问题(Coin Changing Problem)
    问题描述:给定不同面额的硬币和目标金额,如何用最少的硬币达到目标金额。
    解决方案:使用贪心算法的变种,每次选择当前可用的最大面额硬币,直到达到目标金额。注意,这种方法不总是能得到最优解,对于某些特定的硬币面额和目标金额,可能需要采用其他算法(如动态规划)来找到最优解。

找零问题 c++示例

假设我们有面额为 1, 5, 10, 20, 50, 100 的货币,现在需要给顾客找零 n 元。我们希望用最少的硬币数找给顾客。贪心算法的策略是每次都选择面值最大的货币,直到找零总额达到 n。

#include <iostream>
#include <vector>// 定义货币面额的数组
std::vector<int> denominations = {1, 5, 10, 20, 50, 100};// 贪心算法找零函数
int greedyChange(int amount, const std::vector<int>& denoms) {int count = 0; // 用于计数找零需要的硬币数量for (int i = denoms.size() - 1; i >= 0; --i) {// 尽可能多地使用当前最大面额的硬币int coins = amount / denoms[i];count += coins;amount -= coins * denoms[i];// 如果找零金额为0,则结束循环if (amount == 0) {break;}}return count;
}int main() {int amountToChange;std::cout << "Enter the amount to change: ";std::cin >> amountToChange;// 调用贪心算法函数,获取找零所需的硬币数量int coinCount = greedyChange(amountToChange, denominations);std::cout << "The minimum number of coins to change " << amountToChange<< " is: " << coinCount << std::endl;return 0;
}

在这个例子中,首先定义了一个货币面额的数组 denominations,然后实现了一个 greedyChange 函数,该函数接受需要找零的金额和货币面额数组作为参数。在函数中,从最大面额的货币开始,尽可能多地使用它,直到找零金额不足以再次使用当前面额的货币,然后转向下一个较小的面额。这个过程一直持续到找零金额为0。

在 main 函数中,我们获取用户输入的找零金额,然后调用 greedyChange 函数计算并输出所需的最小硬币数量。

这个代码示例展示了如何在C++中使用贪心算法来解决实际问题。需要注意的是,这个贪心算法只适用于找零问题中的特定情况,即货币面额的组合能够无限制地分割。对于不可分割的情况,如硬币问题,需要采用不同的贪心策略或者其他算法。

相关文章:

数据结构与算法 — 贪心算法

数据结构与算法 数据结构与算法是计算机科学中的两个核心概念&#xff0c;它们在软件开发和问题解决中起着至关重要的作用。 数据结构 数据结构是计算机中存储、组织和管理数据的方式&#xff0c;它能够帮助我们高效地访问和修改数据。不同的数据结构适用于不同类型的应用场…...

python如何连接openGauss及django相关配置

前言 网络上很多类似教程&#xff0c;但是有可能不适用。这里给出官网的教程当作参考网络上的方案 安装psycopg2包。 pip install psycopg2 -i https://pypi.tuna.tsinghua.edu.cn/simple 安装完成后&#xff0c;导入包即可使用import psycopg2# Connect to your postgres DB…...

​开箱子的游戏能做吗?

类似寻道大千、咸鱼之王、无名之辈、疯狂骑士团这种类型的游戏,大家应该都知道吧,目前非常受欢迎. 这类游戏注重玩家的成长感和探索体验,玩家在进入游戏后&#xff0c;就能够直接开启宝箱获得各种装备&#xff0c;装备的品质越好、级别越高&#xff0c;能为角色带来的属性加成…...

一、Spring基础 --- 基础内容(二) (咕P4)

一、IOC容器 1.1 基础 1.1.1 容器 1、Spring框架的主要功能是通过其核心容器来实现的。2、Spring容器是生成Bean的工厂&#xff0c;它负责创建Bean的实例&#xff0c;并管理其生命周期。所有的组件都被当成Bean处理&#xff0c;例如数据源、Hibernate的SessionFactory、事务管…...

uview2 表单Form校验validate不生效处理方法

先贴官网实例&#xff1a; <template><view class""><u-form :model"form" ref"uForm"><u-form-item label"姓名" prop"name"><u-input v-model"form.name" /></u-form-item&g…...

给已存在的docker容器修改端口映射

1、systemctl stop docker 2、find / -name hostconfig.json 3、cd * 4、vim hostconfig.json 5、找到“PortBindings”字段&#xff0c;如下所示&#xff1a; "PortBindings":{"80/tcp": [{ //容器内端口"HostIp": "","…...

【Keil5-调试】

Keil5-调试 ■ 好的链接■ watch窗口中&#xff0c;变量值不会刷新■ 当选择了非0级优化时■■ ■ 好的链接 参考地址&#xff1a; debug ■ watch窗口中&#xff0c;变量值不会刷新 有时候在watch窗口中&#xff0c;变量值不会刷新&#xff0c;这时候就需要查看一下"V…...

OpenHarmony分布式软总线API调用测试工具 softbus_tool使用说明

softbus_tool 是 OpenHarmony 分布式软总线 API 调用测试工具&#xff0c;文件结构如下图所示。 softbus_tool 能够将软总线 interfaces 目录下的一些常用接口集中起来&#xff0c;供设备间搭建一些场景时使用&#xff08;比如设备绑定、BR 组网&#xff0c;BLE 组网&#xff…...

Go第三方框架--ants协程池框架

1. 背景介绍 1.1 goroutine ants是站在巨人的肩膀上开发出来的&#xff0c;这个巨人是goroutine&#xff0c;这是连小学生都知道的事儿&#xff0c;那么为什么不继续使用goroutine(以下简称go协程)呢。这是个思考题&#xff0c;希望讲完本文大家可以有个答案。 go协程只涉及用…...

【原创】springboot+vue个人财务记账管理系统设计与实现

个人主页&#xff1a;程序猿小小杨 个人简介&#xff1a;从事开发多年&#xff0c;Java、Php、Python、前端开发均有涉猎 博客内容&#xff1a;Java项目实战、项目演示、技术分享 文末有作者名片&#xff0c;希望和大家一起共同进步&#xff0c;你只管努力&#xff0c;剩下的交…...

MySQL基础练习题:习题2-3

这部分主要是为了帮助大家回忆回忆MySQL的基本语法&#xff0c;数据库来自于MySQL的官方简化版&#xff0c;题目也是网上非常流行的35题。这些基础习题基本可以涵盖面试中需要现场写SQL的问题。上期帮助大家建立数据库&#xff0c;导入数据&#xff0c;接下来让我们继续练习。 …...

超图SuperMap-Cesium,地形图层,可以渲染一个或多个地形(地形可缓存DEM,TIN方式),webGL代码开发(2024-04-08)

1、缓存文件类型TIN格式&#xff0c;TIN的地形sct只能加一个 const viewer new Cesium.Viewer(cesiumContainer); viewer.terrainProvider new Cesium.CesiumTerrainProvider({isSct: true, // 是否为iServer发布的TIN地形服务,stk地形设置为falserequestWaterMask : true,…...

PCB学习记录---原理图

一、注释 NC&#xff1a;no connect,默认不连接 NF: no fix&#xff0c;默认不安装 0R: 0R的电阻&#xff0c;即可以短路 二、看图流程 1、看标题&#xff0c;了解功能 2、浏览有几个模块 3、找芯片对应的数据手册&#xff0c;了解芯片功能和使用 例如CH224&#xff…...

结构型模式--3.组合模式【草帽大船团】

1. 好大一棵树 路飞在德雷斯罗萨打败多弗朗明哥之后&#xff0c;一些被路飞解救的海贼团自愿加入路飞麾下&#xff0c;自此组成了草帽大船团&#xff0c;旗下有7为船长&#xff0c;分别是&#xff1a; 俊美海贼团75人 巴托俱乐部56人 八宝水军1000人 艾迪欧海贼团4人 咚塔塔海…...

网络基础三——其他周边问题

3.1ARP原理 ​ ARP不是一个单纯的数据链路层的协议&#xff0c;而是一个介于数据链路层和网络层之间的协议&#xff1b; ​ 以广播的形式(主机号填成全1)构建Mac帧&#xff0c;发送ARP请求包&#xff0c;告诉所有在局域网的主机我的IP地址和Mac帧&#xff0c;与目的IP相同的主…...

学习周报:文献阅读+Fluent案例+水力学理论学习

目录 摘要 Abstract 文献阅读&#xff1a;物理信息的神经网络与湍流传质的非封闭机制模型相结合 文献摘要 提出问题 提出方案 实验设置 所需方程介绍 雷诺时均方程&#xff08;RANS&#xff09; K-epsilon两方程模型 神经网络框架 DNN部分 损失函数定义 PINN部分…...

Redis(持久化 -- RDB AOF)

持久化 通常我们认为持久化为: 重启进程/重启主机之后, 数据仍然存在不丢失 把数据存储在硬盘上 – 持久 把数据存储在内存中 – 不持久 Redis 持久化 redis 是一个内存数据库, 也就是说本身是不持久的(但是快[效率高]), 于是 Redis 提供了持久化机制 — RDB 和 AOF 二者都是对…...

LDR6328助力Type-C普及,便捷充电,绿色生活更精彩

随着科技的进步和全球统一接口的需求&#xff0c;Type-C接口正日益受到青睐。越来越多的设备正选择采纳这一先进的接口设计&#xff0c;它的普及无疑在改善着我们的日常生活。 在过往&#xff0c;许多小功率设备如小风扇、蓝牙音箱、桌面台灯以及家用加湿器等&#xff0c;都普遍…...

redis主从复制、哨兵模式、集群

文章目录 redis主从复制主从复制的配置**安装Redis**配置主服务器配置从服务器验证主从效果 哨兵模式哨兵的工作机制哨兵模式的搭建启动哨兵 集群分布式集群的搭建 redis主从复制 Redis主从复制&#xff08;Redis replication&#xff09;是Redis提供的一种数据备份和故障转移…...

shell免登陆脚本

#!/bin/bash ## 脚本接收的参数&#xff0c;也就是要互相配置 SSH 免密登录的服务器列表参数 BASE_HOST_LISTip ## 密码&#xff0c;默认用户是当前运行脚本的用户&#xff0c;比如 root 用户 ## 这里改成你的用户对应的密码 BASE_PASSWORD"password" ## shell 函…...

【Python】 -- 趣味代码 - 小恐龙游戏

文章目录 文章目录 00 小恐龙游戏程序设计框架代码结构和功能游戏流程总结01 小恐龙游戏程序设计02 百度网盘地址00 小恐龙游戏程序设计框架 这段代码是一个基于 Pygame 的简易跑酷游戏的完整实现,玩家控制一个角色(龙)躲避障碍物(仙人掌和乌鸦)。以下是代码的详细介绍:…...

iOS 26 携众系统重磅更新,但“苹果智能”仍与国行无缘

美国西海岸的夏天&#xff0c;再次被苹果点燃。一年一度的全球开发者大会 WWDC25 如期而至&#xff0c;这不仅是开发者的盛宴&#xff0c;更是全球数亿苹果用户翘首以盼的科技春晚。今年&#xff0c;苹果依旧为我们带来了全家桶式的系统更新&#xff0c;包括 iOS 26、iPadOS 26…...

UE5 学习系列(三)创建和移动物体

这篇博客是该系列的第三篇&#xff0c;是在之前两篇博客的基础上展开&#xff0c;主要介绍如何在操作界面中创建和拖动物体&#xff0c;这篇博客跟随的视频链接如下&#xff1a; B 站视频&#xff1a;s03-创建和移动物体 如果你不打算开之前的博客并且对UE5 比较熟的话按照以…...

React Native在HarmonyOS 5.0阅读类应用开发中的实践

一、技术选型背景 随着HarmonyOS 5.0对Web兼容层的增强&#xff0c;React Native作为跨平台框架可通过重新编译ArkTS组件实现85%以上的代码复用率。阅读类应用具有UI复杂度低、数据流清晰的特点。 二、核心实现方案 1. 环境配置 &#xff08;1&#xff09;使用React Native…...

镜像里切换为普通用户

如果你登录远程虚拟机默认就是 root 用户&#xff0c;但你不希望用 root 权限运行 ns-3&#xff08;这是对的&#xff0c;ns3 工具会拒绝 root&#xff09;&#xff0c;你可以按以下方法创建一个 非 root 用户账号 并切换到它运行 ns-3。 一次性解决方案&#xff1a;创建非 roo…...

【单片机期末】单片机系统设计

主要内容&#xff1a;系统状态机&#xff0c;系统时基&#xff0c;系统需求分析&#xff0c;系统构建&#xff0c;系统状态流图 一、题目要求 二、绘制系统状态流图 题目&#xff1a;根据上述描述绘制系统状态流图&#xff0c;注明状态转移条件及方向。 三、利用定时器产生时…...

工业自动化时代的精准装配革新:迁移科技3D视觉系统如何重塑机器人定位装配

AI3D视觉的工业赋能者 迁移科技成立于2017年&#xff0c;作为行业领先的3D工业相机及视觉系统供应商&#xff0c;累计完成数亿元融资。其核心技术覆盖硬件设计、算法优化及软件集成&#xff0c;通过稳定、易用、高回报的AI3D视觉系统&#xff0c;为汽车、新能源、金属制造等行…...

【碎碎念】宝可梦 Mesh GO : 基于MESH网络的口袋妖怪 宝可梦GO游戏自组网系统

目录 游戏说明《宝可梦 Mesh GO》 —— 局域宝可梦探索Pokmon GO 类游戏核心理念应用场景Mesh 特性 宝可梦玩法融合设计游戏构想要素1. 地图探索&#xff08;基于物理空间 广播范围&#xff09;2. 野生宝可梦生成与广播3. 对战系统4. 道具与通信5. 延伸玩法 安全性设计 技术选…...

CRMEB 中 PHP 短信扩展开发:涵盖一号通、阿里云、腾讯云、创蓝

目前已有一号通短信、阿里云短信、腾讯云短信扩展 扩展入口文件 文件目录 crmeb\services\sms\Sms.php 默认驱动类型为&#xff1a;一号通 namespace crmeb\services\sms;use crmeb\basic\BaseManager; use crmeb\services\AccessTokenServeService; use crmeb\services\sms\…...

DBLP数据库是什么?

DBLP&#xff08;Digital Bibliography & Library Project&#xff09;Computer Science Bibliography是全球著名的计算机科学出版物的开放书目数据库。DBLP所收录的期刊和会议论文质量较高&#xff0c;数据库文献更新速度很快&#xff0c;很好地反映了国际计算机科学学术研…...