数据结构-贪心策略(贪心算法)

  • 贪心算法

    • 1.贪心算法的核心思想

      • 局部最优思想:在每一步决策时做出对当前看起来最优的解,并且期望这些局部最优的选择能成全全局最优解.
      • 全局最优构造:对于给定的问题,其全局最优解可以通过将问题分解为一系列子问题,然后在每个子问题上独立做出贪心选择来构建。这种全局最优解可以通过局部最优解的简单组合(如累加、合并等)得到,而不需要回溯或重新考虑之前的选择。
      • 贪心选择性质:问题是否适合采用贪心算法,关键在于它是否具有贪心选择性质。一个具有贪心选择性质的问题意味着,无论之前的决策如何,只要按照贪心策略进行选择,最终一定能得到全局最优解。换句话说,问题的最优解可以被分解为各个阶段的最优决策之和,且这些局部最优决策之间没有冲突或依赖关系。
      • 局限性:贪心算法并非适用于所有问题。有些问题的全局最优解不能通过简单的局部最优选择直接构建,可能存在状态间的隐含依赖或冲突。
    • 2.贪心选择的性质(判断一个问题是否适合用贪心算法)

      • 最优子结构:问题的最优解可以被分解为多个子问题的最优解。
      • 贪心选择有效性:对于任何一步的决策,选择当前状态下最优的选项(局部最优解)不会影响后续步骤中获得全局最优解的可能性。这意味着,无论之前做了什么选择,后续的决策都可以独立地、无冲突地做出贪心选择,且这些选择共同构成的全局解仍为最优。
      • 不可逆性和无后效性:一旦做出了某个贪心选择,之后的决策不再受其影响,或者说之前的选择对未来决策没有副作用。这种特性使得在贪心算法中,每一步决策都是独立的,只需考虑当前状态下的最优选择即可。
      • 可行性约束:贪心选择必须在满足问题的可行性约束(如资源限制、时间窗口、物理规律等)的前提下进行。在做出局部最优选择时,必须确保所选方案符合问题设定的所有限制条件,否则即使该选择在贪心准则下最优,也无法纳入最终的全局解。
      • 贪心准则的一致性:贪心准则在整个决策过程中应保持一致,即每一步决策都使用相同的贪心标准进行评估。
    • 3.构建贪心算法

      • 确认问题的贪心选择性质:首先,要确保所解决的问题具备贪心选择性质,即满足最优子结构、贪心选择有效性、不可逆性或无后效性、可行性约束以及贪心准则的一致性。如果问题不具备这些性质,则贪心算法可能无法找到全局最优解,此时需要考虑其他算法(如动态规划、回溯等)。
      • 定义问题的数学模型:明确问题的输入、输出、约束条件和目标函数。将问题表述为数学形式.
      • 设计贪心准则:确定用于指导每一步决策的贪心准则。贪心准则应反映问题的目标,即在当前状态下,何种选择被认为是最优的。常见的贪心准则包括最大化收益、最小化成本、最短路径、最大满意度等。
      • 构建贪心选择函数:基于贪心准则,编写贪心选择函数。该函数负责在当前状态下,根据贪心准则从所有可行选项中选择一个最优解。贪心选择函数通常涉及排序、比较、选择等操作,确保所选选项在当前状态下满足贪心准则。
      • 实现贪心算法框架:根据问题的具体情况,设计贪心算法的基本框架。这通常包括初始化、贪心选择、更新状态等步骤。
    • 4.典型的贪心算法

      • 霍夫曼编码
        • 应用场景:数据压缩。霍夫曼编码是一种用于无损数据压缩的二叉树编码方法,特别适用于文本数据的压缩。
        • 贪心选择:构建霍夫曼树的过程中,每次选择频率最低的两个节点进行合并,生成一个新的节点,其频率为两个子节点频率之和。这个过程重复进行,直到只剩下一个节点,即构建出霍夫曼树。贪心选择体现在每次都选择当前频率最小的节点进行合并,以期望生成的编码尽可能短。
      • prim算法/ Kruskal 算法
        • 应用场景:最小生成树问题。在给定的带权无向图中,寻找一棵连接所有顶点且边权之和最小的树。
        • 贪心选择:
          1. Prim’s 算法:从任一顶点开始,每次选择与已选顶点集合相连的、权值最小的边,将其对应的未选顶点加入集合。贪心选择体现在每次只添加一条与已形成子树相连的、权值最小的边。
          2. Kruskal’s 算法:按照边的权值从小到大排序,每次选择当前未构成环的最小权值边加入结果集。贪心选择体现在每次都选择权值最小且不引入环的边。
      • Dijkstra算法
        • 应用场景:单源最短路径问题。在有向图或无向图中,寻找从指定起点到所有其他顶点的最短路径.
        • 贪心选择:维护一个优先队列(如堆),初始时包含起点,队列中的元素按已知的最短距离进行排序。每次从队列中取出当前距离最小的顶点,更新与其相邻顶点的距离(如果新路径更短)。贪心选择体现在每次从待处理顶点中选择已知最短路径距离最小的顶点进行扩展。
      • 活动安排问题
        • 应用场景:资源调度。给定一系列有开始时间和结束时间的活动,选择其中最多数量的互不冲突的活动进行安排。
        • 贪心选择:从开始时间最早的活动开始,依次选择结束时间最早的活动,只要其与已选活动不发生时间冲突。贪心选择体现在每次总是优先选择结束时间最早的活动,以期留出更多时间容纳后续活动。
      • 贪婪币找零算法
        • 应用场景:找零问题。
        • 贪心选择:按照面额从大到小对硬币排序。从最大面额的硬币开始,尽可能多地使用当前面额的硬币,直到剩余金额小于当前面额。然后转向下一个较小面额的硬币,重复该过程,直到剩余金额为零。贪心选择体现在每次总是优先使用最大面额的硬币,以尽快减少剩余金额。

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

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

相关文章

李飞飞团队发布《2024年人工智能指数报告》,预测人工智能未来发展趋势

昨天,斯坦福大学 Human-Center Artificial Intelligence (HAI)研究中心发布了《2024年人工智能指数报告》。 由斯坦福大学发起的人工智能指数(AI Index)是一个追踪 AI 动态和进展的非营利性项目,旨在全面研究 AI 行业状况&#xf…

Android Framework 常见解决方案(29)添加应用开发的共享库

1 原理说明 通过设置配置文件public.libraries.txt以及在system分区下添加so动态库的方式,让系统扩展动态库。关于动态库的拷贝较为简单,直接配置即可,这里主要解读下配置文件public.libraries.txt。 1.1 public.libraries.txt配置文件是什…

Redis主从复制及其原理

为什么要有主从复制 为了避免服务的单点故障,通过给主从复制可以把数据复制多个副本放在不同的服务器上,拥有数据副本的服务器可以用于处理客户端的读请求,扩展整体的性能 Redis的主从复制搭建 准备3台机器,主服务器ip为192.16…

云服务器租用一年、1个月优惠价格表,阿里/腾讯/京东/华为云

现在租一个服务器多少一个月?优惠价格低至3.8元1个月,租用一个月云服务器收费价格表:阿里云和腾讯云2核2G3M服务器优惠价格61元一年,折合一个月5元,京东云轻量云主机5.8元一个月,华为云服务器优惠价格3.8元…

未来交通:UWB模块引领智能交通系统的发展方向

随着城市化进程的加速和交通需求的不断增长,智能交通系统正成为解决城市交通问题的重要途径之一。UWB不断发展正在引领智能交通系统的发展方向。UWB模块作为UWB技术的核心组成部分,具有精准定位、快速响应、抗干扰等特点,为智能交通系统的构建…

Swift-19-基础入门

从本章开始大概用10篇左右文章介绍下Swift语言的基本用法。 简介 Objective-C作为一门比较老的语言, 缺少很多现代语言所具备的高级特性。Swift是目标是比C,C, ObjC更安全可靠,从而减少开发者对在应用运行时出错的代码进行调试的时间成本。本…

github,raw.githubusercontent.com 等网址登陆不上不去的设置方法

目录 提示域名解析错误: 出现的现象: 解决办法:修改host host改完不生效 解决方案1: 解决方案2: 提示域名解析错误: 出现的现象: 登陆github,raw.githubusercontent.com 等网…

Jmeter 接口造10w条用户数据

1、将mysql-connector-java-5.1.22-bin.jar放到D:\apache-jmeter-5.5\lib\ext目录下 2、在测试计划中,添加mysql-connector-java-5.1.22-bin.jar包路径 3、添加-线程组-添加-配置元件-jdbc connection configuration 4、配置jdbc连接参数 设置变量名称:…

pyqt之QNetworkAccessManager

QNetworkAccessManager是Qt自带的一个网络请求库,网上很多说的很模糊,在这总结一下 # coding: utf-8 import json import sys from pathlib import Path from typing import Union from urllib.parse import urlencodefrom PyQt5.QtNetwork import QNetw…

关于 AssertionError: Torch not compiled with CUDA enabled 问题

你好,我是 shengjk1,多年大厂经验,努力构建 通俗易懂的、好玩的编程语言教程。 欢迎关注!你会有如下收益: 了解大厂经验拥有和大厂相匹配的技术等 希望看什么,评论或者私信告诉我! 文章目录 一…

javaWeb智能医疗管理系统

简介 在当今快节奏的生活中,智能医疗系统的崛起为医疗行业带来了一场革命性的变革。基于JavaWeb技术开发的智能医疗管理系统,不仅为医疗机构提供了高效、精准的管理工具,也为患者提供了更便捷、更个性化的医疗服务。本文将介绍一个基于SSM&a…

vue快速入门(二十九)echarts在vue中的使用

注释很详细&#xff0c;直接上代码 上一篇 新增内容 echarts.js的下载途径echarts的饼图示范 echarts.js&#xff0c;点击跳转&#xff0c;右键另存即可 源码 <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8" /><m…

python内置函数frozenset()详解

Python 内置函数 frozenset() 1. 概述 frozenset() 是 Python 中的一个内置函数&#xff0c;用于创建一个不可变的集合&#xff08;frozenset&#xff09;。与普通的集合&#xff08;set&#xff09;不同&#xff0c;frozenset 不能被修改&#xff0c;也不能添加或删除元素。…

小试牛刀!

1.从双倍数组中还原原数组&#xff08;力扣&#xff0c;vector&#xff09; java式c解法。 class Solution { public:vector<int> findOriginalArray(vector<int>& changed) {int n changed.size();if(n % 2 1) return {};map<int, int> mp;for(int c…

Applied Spatial Statistics(二)统计推断:排列测试

Applied Spatial Statistics&#xff08;二&#xff09;统计推断&#xff1a;排列测试 本笔记本演示了如何执行假设检验和 p 值计算的排列检验。 相关系数Moran’s I 相关性 import pandas as pd import matplotlib.pyplot as plt import numpy as np from scipy.stats imp…

pycharm永久改变sys.path

进入pycharm&#xff0c;选择file->settings->interpreter 在这里选择图中所示show all 再单击左上角减号右侧第三个&#xff0c;长得像思维导图的图标 之后添加你的路径&#xff0c;确认即可

2024最新面试跳槽,软件测试面试题的整理与解析

今天接着来说说测试工程师面试比较高频的面试题&#xff0c;大家可以通过面试题内的一些解析再结合自己的真实工作经验来进行答题思路的提取、整理。 硬背答案虽可&#xff0c;但容易翻车哦。能够举一反三才是重点&#xff01; 1&#xff1a;请介绍一下UI自动化测试中三种时间等…

【若依前后端分离】设置已选中内容条数

示例&#xff1a; 将已选中n行加在了分页中&#xff0c;有分页才可以选择已选中多少行。如果想要不加分页也可以展示已选中n行&#xff0c;自行修改部分代码即可。 关键代码&#xff1a; 这使用了span&#xff0c;可使用其他元素 使用了Vue.js的v-if指令来根据条件是否渲染该…

前端JS必用工具【js-tool-big-box】,时间日期转换学习一

这一小节&#xff0c;我们学习一下 js-tool-big-box 这个npm 前端工具库&#xff0c;关于时间日期格式转换的一部分&#xff0c;后续还会有。 目录 1 安装 2 项目中引入 3 工具使用 3.1 年月日时分秒的单独处理 3.2 以上方法中第一个参数 3.3 日期时间的转换 3.4 更个…

6.C++:继承

一、继承 //1.类中的保护和私有在当前类中没有差别&#xff1b; //2.在继承后的子类中有差别&#xff0c;private在子类中不可见&#xff0c;所以用protected&#xff1b; class person { public:void print(){cout << "name:" << _name << endl;c…