求一个任意实数c的算术平方根g的算法设计思想_算法复习第四篇——贪心法

09c7c4173789202a3339e7cca0a71161.png

公元2020年5月5日,距离算法考试仅剩4天。

一、知识归纳

1.设计思想

  • 只根据当前已有的信息就做出选择,而且一旦做出了选择,将来无论如何都不能更改
  • 不从整体最优考虑,所做的选择只是在某种意义上的局部最优
  • 这种选择并不总能获得整体最优解(Optimal Solution),但通常能获得近似最优解(Near-Optimal Solution)
动态规划法通常以自底向上的方式求解各个子问题。
贪心法则通常以自顶向下的方式做出一系列的贪心选择。

2.示例

【找钱问题】假设有面值为5元、2元、1元、5角、2角、1角的货币,需要找给顾客4元6角现金,使付出的货币的数量最少。

【思路】

  • 首先选出1张面值不超过4元6角的最大面值的货币,即2元,再选出1张面值不超过2元6角的最大面值的货币,即2元,再选出1张面值不超过6角的最大面值的货币,即5角,再选出1张面值不超过1角的最大面值的货币,即1角,总共付出4张货币。
  • 在付款问题每一步的贪心选择中,在不超过应付款金额的条件下,只选择面值最大的货币,而不去考虑在后面看来这种选择是否合理,而且它还不会改变决定:一旦选出了一张货币,就永远选定。
  • 贪心选择策略是尽可能使付出的货币最快地满足支付要求,其目的是使付出的货币张数最慢地增加

3.基本要素

(1) 最优量度标准(正确的贪心策略,贪心选择性质)

  • 贪心法求解问题的核心问题
  • 根据该量度标准,实行多步决策进行求解
  • 在该量度意义下,每步的贪心选择是局部最优的
  • 得到全局最优解

(2) 求解的问题有最优子结构性质(最优性原理)

  • 一个问题的最优解包含其子问题的最优解
注:贪心算法的基本要素是贪心选择性质和最优子结构性质。

4.求解过程

(1) 分解

  • 将原问题分解为若干相互独立的阶段;

(2) 求解

  • 对于每个阶段求局部最优解,即根据贪心策略进行贪心选择;
  • 在每个阶段,选择一旦做出就不可更改。

(3) 合并

  • 将各个阶段的解合并为原问题的一个可行解。

5.相关概念

(1) 候选解集合C

  • 问题的可能解
  • 问题的最终解均取自于该候选集合

(2) 解集合S

  • 随着贪心选择的进行不断扩展,直到构成一个满足问题的完整解

(3) 解判定函数solution

  • 检查解集合S是否构成问题的完整解

(4) 选择函数select

  • 贪心策略,这是贪心法的关键
  • 指出哪个候选对象最有希望构成问题的解
  • 通常和目标函数有关

(5) 可行解判定函数feasible

  • 检查解集合中加入一个候选对象是否可行,即解集合扩展后是否满足约束条件

6.贪心法的一般过程

Greedy

二、组合问题中的贪心法

  • 背包问题(物品可切割)
  • 多机调度问题
  • 活动安排问题

1.背包问题

问题表述】给定n种物品和一个容量为C的背包,物品i的重量是wi,其价值为vi,设xi表示物品i装入背包的情况,背包问题是如何选择装入背包的物品,使得装入背包中物品的总价值最大?

【建立模型】

bdea0eda61065e6e848465ef406f059b.png

【贪心策略】

贪心策略一:价值最大优先
因为这可以尽可能快地增加背包的总价值。但是,虽然每一步选择获得了背包价值的极大增长,但背包容量却可能消耗得太快,使得装入背包的物品个数减少,从而不能保证目标函数达到最大。贪心策略二:重量最轻优先
因为这可以装入尽可能多的物品,从而增加背包的总价值。但是,虽然每一步选择使背包的容量消耗的慢了,但背包的价值却没能保证迅速增长,从而不能保证目标函数达到最大。贪心策略三:单位重量价值最大优先
在背包价值增长和背包容量消耗两者之间寻找平衡。

例如,有3个物品,其重量分别是{20, 30, 10},价值分别为{60, 120, 50},背包的容量为50,应用三种贪心策略装入背包的物品和获得的价值如图所示。

e3b18403f0985cf8fcdac1f030e50d0d.png

应用第三种贪心策略,每次从物品集合中选择单位重量价值最大的物品,如果其重量小于背包容量,就可以把它装入,并将背包容量减去该物品的重量,然后我们就面临了一个最优子问题——它同样是背包问题,只不过背包容量减少了,物品集合减少了。因此背包问题具有最优子结构性质。

【算法描述】

设背包容量为C,共有n个物品,物品重量存放在数组w[n]中,价值存放在数组v[n]中,问题的解存放在数组x[n]中。

1.改变数组w和v的排列顺序,使其按单位重量价值v[i]/w[i]降序排列;
2.将数组x[1:n]初始化为0;  //初始化解向量
3.i=1;      
4.循环直到(w[i]>C)4.1 x[i]=1;     //将第i个物品放入背包4.2 C=C-w[i];4.3 i++;
5.    x[i]=C/w[i];
void Knapsack(int n,float M,float v[],float w[],float x[])
{Sort(n,v,w);int i;for (i=1;i<=n;i++) x[i]=0;float c=M;for (i=1;i<=n;i++) {if (w[i]>c) break;x[i]=1;c - =w[i];}if (i<=n) x[i]=c/w[i];
}

【算法时间复杂度分析】

该算法的时间主要消耗在将各种物品依其单位重量的价值从大到小排序。因此,其时间复杂性为O(nlog2n)。

注:贪心算法不能解决0/1背包问题,可通过动态规划法解决。

三、图问题中的贪心法

  • 单源最短路径问题 - Dijkstra算法
  • TSP问题
  • 最小生成树问题 - Prim算法 - Kruskal算法
  • 图着色问题

1.最小代价生成树问题

问题表述】设G=(V,E)是一个无向连通图,生成树上各边的权值之和称为该生成树的代价,在G的所有生成树中,代价最小的生成树称为最小生成树(Minimal Spanning Trees)。

【贪心策略】

①最近顶点策略任选一个顶点,并以此建立起生成树,每一步的贪心选择是简单地把不在生成树中的最近顶点添加到生成树中。②最短边策略设G = (V,E)是一个无向连通网,令T= (V,TE)是G的最小生成树。从TE={}开始,每一次贪心选择都是在边集E中选取最短边(u,v),如果边(u, v)加入集合TE中不产生回路,则将边(u,v)加入边集TE中,并将它在集合E中删去。

最近顶点策略—Prim算法

  • 使生成树以一种自然的方式生长
  • 从任意顶点开始,每一步为这棵树添加一个分枝,直到生成树中包含全部顶点

78729a37ff3563b8d587613f7afcbd16.png

【算法描述】

设图G中顶点的编号为0~n-1

Prim算法1. 初始化两个辅助数组lowcost和adjvex;2. U={u0}; 输出顶点u0;    //将顶点u0加入生成树中3. 重复执行下列操作n-1次3.1 在lowcost中选取最短边,取adjvex中对应的顶点序号k;3.2 输出顶点k和对应的权值;3.3 U=U+{k};3.4 调整数组lowcost和adjvex;

【算法时间复杂度分析】

设连通网中有n个顶点,则

  • 第一个进行初始化的循环语句需要执行n一1次
  • 第二个循环共执行n - 1次,内嵌两个循环:
  • 其一是在长度为n的数组中求最小值,需要执行n- 1次;
  • 其二是调整辅助数组,需要执行n- 1次。

所以,Prim算法的时间复杂度为


四、考点总结

1.满足最优子结构性质一定满足贪心性质吗?

满足贪心选择性质一定满足最优子结构性质,而满足最优子结构性质不一定满足贪心选择性质,比如背包问题可以用贪心算法解决,而0-1背包问题只能用动态规划。

2.活动选择问题中:

☞最优的贪心策略是“最早结束活动优先”

☞怎么衡量两个活动A和B是相容的?

3.背包问题的贪心算法所需的计算时间为 nlogn

4.贪心算法与动态规划算法的主要区别是 贪心选择性质

动态规划法通常以自底向上的方式求解各个子问题。
贪心法则通常以自顶向下的方式做出一系列的贪心选择。

5.最大效益优先是( 贪心法 )的搜索方式

6.贪心算法的基本要素是 贪心选择 性质和 最优子结构 性质 。

最优子结构性质是贪心算法与动态规划算法的共同点。贪心选择性质 是贪心算法可行的第一个基本要素,也是贪心算法与动态规划算法的主要区别。

72e54eb9ee219146008866ce800f601e.png

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

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

相关文章

安装百分之80卡住_关注丨男子翻越高铁站台丢命,家属向铁路部门索赔80万!法院这样判...

去年3月&#xff0c;一名男子翻越高铁站台被卡住致死引发广泛关注。事发后&#xff0c;其家属将铁路部门告上法庭&#xff0c;索赔80余万元。日前&#xff0c;法院宣判&#xff1a;死者杨某擅自闯入危险区域负全责&#xff0c;其父母要求铁路部门赔偿的诉请被驳回。事件还原201…

ARIMA模型的介绍

目录 ARIMA模型结构 随机游走模型(random walk) 举例&#xff1a; ARIMA模型的性质 小结 ARIMA模型结构 使用场合&#xff1a;差分平稳序列拟合 模型结构 则有&#xff1a; 随机游走模型(random walk) 模型结构&#xff1a; Karl Pearson(1905)在《自然》杂志上提问:假…

java斗地主游戏

使用java实现斗地主小游戏。 程序分析&#xff1a; 1、创建扑克牌的实体类Poker&#xff0c;设置四个参数&#xff1a;花色、数字、牌值&#xff08;判断大小&#xff09;、是否地主牌&#xff0c;实现getset方法和构造方法&#xff1b; 2、创建玩家的实体类Player&#xff0…

为什么总是封板又打开涨停_警惕!如果股票涨停板反复打开说明了什么?

股市禁忌“三进三出”&#xff1a;“三进”为&#xff1a;一是“高位进”&#xff0c;这就是我们常说的追涨。犯有这种错误的投资者&#xff0c;喜欢在股票已经有了很大的涨幅后买进&#xff0c;其买进的依据往往是股票已经放量突破了历史高点或突破了某个高点阻力位等&#xf…

python中表示空类型的是_python中怎么表示空值

首先了解python对象的概念 python中&#xff0c;万物皆对象&#xff0c;所有的操作都是针对对象的。 那什么是对象&#xff1f;5是一个int对象&#xff0c;‘oblong是一个str对象&#xff0c;异常也是一个对象&#xff0c;抽象一点是&#xff0c;人&#xff0c;猫&#xff0c;够…

动态背景登录

前端动态背景登录 效果演示 完整代码 首先我们要导入jquery.js包 html代码 <!doctype html> <html lang"zh"> <head> <meta charset"UTF-8"> <meta http-equiv"X-UA-Compatible" content"IEedge,chrome1&qu…

ARIMA模型的建模和预测

目录 基本过程&#xff1a; 1.Green 函数递推公式 2.ARIMA模型的预测 例题 小结 基本过程&#xff1a; 1.Green 函数递推公式 ARIMA模型 也可写成 确定 设 则可得Green函数递推公式 2.ARIMA模型的预测 原则&#xff1a;最小均方误差预测原理 传递形式&#xff1a; 预测…

python画画用哪库好_数据可视化哪款工具更好用?对比7款Python 数据图表工具的性能...

更多腾讯海量技术文章&#xff0c;请关注云加社区&#xff1a;https://cloud.tencent.com/developer/column 作者&#xff1a;CDA数据分析师 摘要&#xff1a;Python 的科学栈相当成熟&#xff0c;各种应用场景都有相关的模块&#xff0c;包括机器学习和数据分析。数据可视化是…

jsp论坛网站模版_网站被降权了?看看这些解决方法,或许有帮助哦

点击标题下「蓝色微信名」可快速关注在前面的文章中&#xff0c;笔者已经给大家介绍了网站被降权的因素。那么当遇到降权的问题该怎么办呢&#xff1f;接下来&#xff0c;笔者就结合本身经历过的网站降权来给大家介绍一下补救措施。1、造成网站首页降权的原因&#xff1a;服务器…

ARIMA模型之疏系数模型

目录 1.疏系数模型的定义 2.拟合ARIMA疏系数模型函数 例题&#xff1a; 小结 1.疏系数模型的定义 ARIMA(p,d,q)模型是指d阶差分后自相关最高阶数为p&#xff0c;移动平均最高阶数为q的模型&#xff0c;通常它包含pq个独立的未知系数: 如果该模型中部分自相关系数 ,1≤j<…

动画分享菜单

制作一个动画分享的菜单 效果演示 注意&#xff1a;在我们的程序开始之前我们一定要导入jquery.js架包并且找到如图所示的矢量图标。 完整代码 html代码 <!DOCTYPE html> <html> <head> <meta http-equiv"Content-Type" content"text/…

java 双向链表_23张图!万字详解「链表」,从小白到大佬

链表和数组是数据类型中两个重要又常用地基础数据类型&#xff0c;数组是连续存储在内存中的数据结构&#xff0c;因此它的优势是可以通过下标迅速的找到元素的位置&#xff0c;而它的缺点则是在插入和删除元素时会导致大量元素的被迫移动&#xff0c;为了解决和平衡此问题于是…

安庆机器人编程选_安庆市首届中小学机器人创客竞赛举行 460名选手比智慧拼创新 科技感满满!...

机器人熟练完成“奥林匹克火种”采集、点燃、传递等动作;“小狗皮皮的智能家园”、智能停车场、多功能智能小车等创意智能作品巧思新奇……11月28日&#xff0c;在2020年安庆市中小学机器人创客竞赛活动现场&#xff0c;可谓科技感满满&#xff0c;炫酷十足。本次比赛由市教育体…

有季节效应的非平稳序列分析之因素分解

目录 6.1 因素分解理论 6.2因素分解模型 6.2.1因素分解模型的选择 6.2.2趋势效应的提取 简单中心移动平均的良好属性 R语言中&#xff0c;使用filter函数可以做简单移动平均 6.2.3 季节效应的提取 6.2.4 X11季节调节模型 X11模型分析步骤&#xff1a; ​ 确定性…

python变量的使用_python – 如何在变量中使用冒号(:)

你想要一个 slice() object&#xff1a; index slice(0, 2) print(somelist[index]) slice()模拟您可以在[start&#xff1a;stop&#xff1a;stride]预订语法中指定的start,stop和stride值作为对象. 从文档&#xff1a; Return a 07001 object representing the set of indic…

for循环执行 mybatis_Mybatis中使用循环遍历

Mybatis中传参数的方法1.使用注解绑定&#xff0c;mapper.xml 对应方法 不需要指定 parameterType,(推荐使用注解绑定方式)方法接口&#xff1a;List selectByExample(Param("example") CalculateIdeacommissionsum example,Param("roleNameList") List ro…

指数平滑预测模型

目录 1.分类 2.简单指数平滑 简单指数平滑预测&#xff1a; 平滑系数的确定 R中实现&#xff1a; 3. Holt两参数指数平滑 4. Holt-Winters三参数指数平滑 5.ARIMA加法季节模型 R实现 例题&#xff1a; 1.分类 2.简单指数平滑 简单移动平均法向前预测1期&#xff1a; …

Java反射机制API

实现 Java 反射机制的类都位于 java.lang.reflect 包中&#xff0c;java.lang.Class 类是 Java 反射机制 API 中的核心类。 java.lang.Class 类 java.lang.Class 类是实现反射的关键所在&#xff0c;Class 类的一个实例表示 Java 的一种数据类型&#xff0c;包括类、接口、枚…

ARIMA乘法季节模型

目录 ARIMA乘法季节模型 例题1 例题 2 例题3 ARIMA乘法季节模型 序列的季节效应、长期趋势效应和随机波动之间有着复杂的相互关联性,简单的季节模型不能充分地提取其中的相关关系&#xff0c;这时常采用乘积季节模型。 例题1 我国1949-2008年年末人口总数&#xff08;单…

R语言acres92 region_[R语言 学习笔记] circlize绘制基因组圈图的原理与使用(一)...

由于图形大多由点、线、多边形等简单图形组成&#xff0c;circlize实现了在圆形作图区域添加图形的低级绘图函数&#xff0c;通过低级绘图函数的不同组合&#xff0c;可以轻松生成更复杂的图形。这一原则确保了各种类型的高级图形不会受软件包本身的通用性限制&#xff0c;并且…