算法合集之《浅谈贪心思想在动态规划中的应用》

合集下载

贪心算法在优化问题中的运用

贪心算法在优化问题中的运用

贪心算法在优化问题中的运用

贪心算法(Greedy Algorithm)是一种常用的算法思想,它在解决一些优化问题时具有很高的效率和实用性。贪心算法的核心思想是每一步都选择当前状态下最优的解决方案,以期望最终能够得到全局最优解。在实际应用中,贪心算法常常被用来解决一些最优化问题,如最短路径问题、背包问题、任务调度等。本文将介绍贪心算法在优化问题中的运用,并通过具体案例来说明其应用场景和解决方法。

一、贪心算法的基本原理

贪心算法是一种在每一步选择当前状态下最优解决方案的算法思想。它与动态规划不同,贪心算法并不会保存之前的计算结果,而是根据当前状态做出最优选择。贪心算法的优势在于简单、高效,适用于一些特定类型的问题。

贪心算法的基本原理可以总结为以下几点:

1. 每一步都选择当前状态下的最优解决方案;

2. 不考虑未来的结果,只关注当前状态的最优选择;

3. 最终期望通过每一步的最优选择达到全局最优解。

二、贪心算法在优化问题中的应用

1. 最短路径问题

最短路径问题是图论中的经典问题,贪心算法可以用来解决一些简单的最短路径问题。例如,在无权图中,从起点到终点的最短路径可以

通过贪心算法来求解,每次选择距离最近的节点作为下一步的目标节点,直到到达终点为止。

2. 背包问题

背包问题是一个经典的优化问题,贪心算法可以用来解决一些特定类

型的背包问题。例如,在分数背包问题中,每种物品可以取任意比例,贪心算法可以按照单位价值最高的顺序选择物品放入背包,直到背包

装满为止。

3. 任务调度问题

任务调度问题是一个常见的优化问题,贪心算法可以用来解决一些简

贪心算法在任务调度中的应用

贪心算法在任务调度中的应用

贪心算法在任务调度中的应用在任务调度中,选择最优的方案是一个核心问题。贪心算法是

一种运用广泛的解决最优问题的算法,其优势在于可以处理高效率、可扩展性、可贪心性等众多特性。然而,在实际应用中,贪

心算法也需要根据不同场景进行不同的调整。本文将探讨贪心算

法在任务调度中的应用,包括背包问题、最小生成树问题和区间

调度问题等。

一、背包问题

背包问题是一个经典的优化问题,其核心是如何选择一组物品,使得总重量不超过背包能够容纳的最大值,同时价值最大化。在

任务调度中,背包问题可以被用来解决资源分配问题,例如在云

计算中,如何合理地分配虚拟机来保证服务质量和节约资源。

贪心策略是按照每个物品的单位价值来进行排序,优先选择单

位价值高的物品先放入背包中。这样可以使得背包中的物品价值

最大化,同时满足容量限制。具体实现中,可以在排序后从价值

最高的物品开始放入背包,直到背包无法容纳为止。

但是在实际应用中,贪心算法并不一定能够获得最优解。在一些场景中,例如物品具有相同的价值,需要根据其他因素进行调整。此外,在背包容量限制较小的情况下,贪心策略也可能会导致不优的解。

二、最小生成树问题

最小生成树问题是一个经典的图论问题,其核心是从一个无向图中寻找一棵生成树,使得树上所有边的权值之和最小。在任务调度中,最小生成树问题可以被用来解决任务分配问题,例如如何合理地分配人力资源来保证任务的顺利完成。

贪心策略是按照边的权值进行排序,优先选择权值最小的边来进行连接。在每个节点中维护一个集合,表示当前节点所在的连通块。在选择一条边之后,可以将两个连通块进行合并,直到所有节点被连接为止。

动态规划算法和贪心算法比较和分析

动态规划算法和贪心算法比较和分析

动态规划算法和贪心算法的比较与分析

1、最优化原理

根据一类多阶段问题的特点,把多阶段决策问题变换为一系列互相联系的单阶段问题,然后逐个加以解决。解决这类问题的最优化原理:一个过程的最优决策具有这样的性质,即无论其初始状态和初始决策如何,其今后诸策略对以第一个决策所形成的状态作为初始状态的过程而言,必须构成最优策略。简而言之,一个最优策略的子策略,对于它的初态和终态而言也必是最优的。

2、动态规划

2.1 动态规划算法

动态规划是运筹学的一个分支,与其说它是一种算法,不如说它是一种思维方法更贴切。因为动态规划没有固定的框架,即便是应用到同一道题上,也可以建立多种形式的求解算法。许多隐式图上的算法,例如求单源最短路径的Dijkstra算法、广度优先搜索算法,都渗透着动态规划的思想。还有许多数学问题,表面上看起来与动态规划风马牛不相及,但是其求解思想与动态规划是完全一致的。因此,动态规划不像深度或广度优先那样可以提供一套模式,需要的时候,取来就可以使用。它必须对具体问题进行具体分析、处理,需要丰富的想象力去建立模型,需要创造性的思想去求解。

动态规划算法的基本思想是将待求解问题分解成若干子问题,先求解子问题,然后从这些子问题的解得到原问题的解。值得注意的是,用动态规划法求解的问题,经分解后得到的子问题往往不是互相独立的。

最优化原理是动态规划的基础。任何一个问题,如果失去了这个最优化原理的支持,就不可能用动态规划方法计算。能采用动态规划求解的问题都要满足两个条件:①问题中的状态必须满足最优化原理;②问题中的状态必须满足无后效性。

贪心法思想及其运用

贪心法思想及其运用

贪心法思想及其运用

摘要:

主要介绍贪心算法(又称贪婪算法)的基本思想,以及如何利用贪心算法来求解问题,如何选择最佳的贪心算法的策略,以及贪心算法在一些数学问题上的运用。

关键词:

贪心算法最优策略

正文:

贪心算法(又称贪婪算法)是指,在对问题求解时,总是做出在当前看来是最好的选择。也就是说,不从整体最优上加以考虑,他所做出的仅是在某种意义上的局部最优解。贪心算法不是对所有问题都能得到整体最优解,但对一些问题它能产生整体最优解或者是整体最优解的近似解。

贪心算法没有固定的算法框架,算法设计的关键是贪婪策略的选择。一定要注意,选择的贪婪策略要具有无后向性,即某阶段状态一旦确定以后,不受这个状态以后的策略影响,也就是说某个状态以后的过程不会影响以前的状态,只与当前状态有关,也称为这种特性为无后效性。因此,适应用贪婪策略解决的问题类型较少,对所采用的贪婪策略一定要仔细分析其是否满足无后效性。

为了说明在使用贪心算法中选择策略是关键,下面这个例子可以充分的说明这个问题:题目:设有n个正整数,将他们连接成一排,组成一个最大的多位整数。例如:n=3时,3个整数13,312,343,连成的最大整数为:34331213

第一种策略:把整数按从大到小的顺序连接起来,题目中的例子正好符合这个策略;

第二种策略:先把整数化成字符串,然后再比较a+b和b+a,如果a+b>b+a,就把a排在b 的前面,反之则把a排在b的后面。

许多同学开始看到这个题目的时候会毫不犹豫的选择第一种策略,这种策略表面上看起来是对的,从大到小排列之后,最终的数肯定会是最大的结果,但实际上这种策略师错误的,反例有很多,比如说当n=2时,2个整数为12,121 按照第一种策略就会组成12112,而正确的结果为12121,按照第二种策略的结果正是12121。由此可见算法策略的选择是非常关键的,会直接影响到最终结果的正确性。

面试问题之数据结构与算法:动态规划、分治法、贪心法的应用场景

面试问题之数据结构与算法:动态规划、分治法、贪心法的应用场景

⾯试问题之数据结构与算法:动态规划、分治法、贪⼼法的应⽤

场景

动态规划算法、分治法与贪⼼法都应⽤于:⼤问题可以分解为⼦问题求解的题⽬

⼀、分治法:

分治法容易理解,主要思想是:将⼤问题分解成⼦问题,求解出不同⼦问题的解,由各个⼦问题的解得到最终解。所有的⼦问题可能相关,也可能不相关,如果⼦问题相关,则求解⼦问题的解时,会重复计算,进⾏不必要的计算,这时应该考虑下⾯的动态规划算法。如果不相关⽤分治法最好,不会进⾏多余的计算。由不同的⼦问题求最终问题的解,这是⾃底向上的⽅法。

⼆、贪⼼法:

贪⼼法的主要思想是:在对问题求解时,总是做出在当前看来是最好的选择,也就是说,不从整体最优上加以考虑,他所做的是在某种意义上的局部最优解。贪⼼选择是指所求问题的整体最优解可以通过⼀系列局部最优的选择,即贪⼼选择来达到。这是贪⼼算法可⾏的第⼀个基本要素,也是贪⼼算法与动态规划算法的主要区别。贪⼼选择是采⽤从顶向下、以迭代的⽅法做出相继选择,每做⼀次贪⼼选择就将所求问题简化为⼀个规模更⼩的⼦问题。当⼀个问题的最优解包含其⼦问题的最优解时,称此问题具有最优⼦结构性质。⼀般是⼀维问题。

三、动态规划

与贪⼼法类似:⼤问题的解包含其⼦问题的解,每⼀步由⼦问题向最终问题靠近时,保留⼦问题的解,以供使⽤。⼀般是⼆维问题。动态规划算法通常⽤于求解具有某种最有性质的问题。在这类问题中,可能会有许多可⾏解。每⼀个解都对应于⼀个值,我们希望找到具有最优值的解。动态规划算法与分治法类似,其基本思想也是将待求解问题分解成若⼲个⼦问题,先求解⼦问题,然后从这些⼦问题的解得到原问题的解。不同于分治法的是,⼦问题有相关性,⼀般需要保存⼦问题的解以供下⾯的求解使⽤。

贪心与动态规划算法的主要区别

贪心与动态规划算法的主要区别

贪心算法与动态规划算法的主要区别

所谓贪心选择性质是指所求问题的整体最优解可以通过一系列局部最优的选择,即贪心选择来达到。这是利用贪心算法求解最优解的第一个基本要素,也是贪心算法与动态规划算法的主要区别。

共同点:

求解的问题都具有最优子结构性质

差异点:

动态规划算法通常以自底向上的方式解各子问题,而贪心算法则通常以自顶向下的方式进行,以迭代的方式作出相继的贪心选择,每做一次贪心选择就将所求问题简化为规模更小的子问题。

Prim算法O(n2)

首先置S={1},然后,只要S是V的真子集,就作如下的贪心选择:选取满足条件i∈S,j∈V-S,且c[i][j]最小的边,将顶点j添加到S中。

这个过程一直进行到S=V时为止。在这个过程中选取到的所有边恰好构成G的一棵最小生成树。

在上述Prim算法中,还应当考虑如何有效地找出满足条件i∈S, j∈V-S,且权c[i][j]最小的边(i,j)。实现这个目的的较简单的办法是设置2个数组closest和lowcost。在Prim算法执行过程中,先找出V-S中使lowcost值最小的顶点j,然后根据数组closest选取边(j,closest[j]),最后将j添加到S中,并对closest和lowcost作必要的修改。

Kruskal算法O(eloge)

首先将G的n个顶点看成n个孤立的连通分支。将所有的边按权从小到大排序。然后从第一条边开始,依边权递增的顺序查看每一条边,并按下述方法连接2个不同的连通分支:当查看到第k条边(v,w)时,如果端点v和w分别是当前2个不同的连通分支T1和T2中的顶点时,就用边(v,w)将T1和T2连接成一个连通分支,然后继续查看第k+1条边;如果端点v和w在当前的同一个连通分支中,就直接再查看第k+1条边。这个过程一直进行到只剩下一个连通分支时为止。

贪心算法与动态规划

贪心算法与动态规划
贪心算法 与 动态规划
贪心算法 ( Greedy Algorithm )
贪心法的基本思路:
—— 从问题的某一个初始解出发逐步逼近给定的 目标,以尽可能快的地求得更好的解。当达到某 算法中的某一步不能再继续前进时,算法停止。 该算法存在问题: 1. 不能保证求得的最后解是最佳的; 2. 不能用来求最大或最小解问题; 3. 只能求满足某些约束条件的可行解的范围。
FOJ 1111 Radar Installation
•给出雷达的扫描半径 R 与孤岛的个数 N 与坐标, •求最小要用几个这样的雷达。

枚举每一个孤岛 求出其与 X 轴的交点 dx = sqrt(r * r - y * y); x_min = x - dx; x_max = x + dx; Nlog(n) 排序 判断其它点也 X 轴的交点是否在 [x_min,x_max] 范围内 , 或包含
相关题目
1574 一食堂宣传栏 1230 区间相交问题
FOJ 1106 Sum of Factorials
问一个数能否由相应的阶乖的和组合而成 列表 {1,1,2,6,24,120,720,5040,40320,362880}; 将 N 尝试性的减去表中的数,为零则 YES ,否则为 NO 证明?
FOJ1004 Number Triangle
求人从顶端到底部 , 每次只能向左下右下走 , 最 多能取得的值 .

关于贪心算法的经典问题(算法效率or动态规划)

关于贪心算法的经典问题(算法效率or动态规划)

关于贪⼼算法的经典问题(算法效率or动态规划)

如题,贪⼼算法⾪属于提⾼算法效率的⽅法,也常与动态规划的思路相挂钩或⼀同出现。下⾯介绍⼏个经典贪⼼问题。(参考⾃刘汝佳著《算法竞赛⼊门经典》)。

P.S.下⽂皆是我⼀个字⼀个字敲出来的,绝对“童叟⽆欺”,哈哈。(。⌒∇⌒) 耗费了我的很多时间,所以——希望对⼤家有帮助啊~ (=^‸^=)⼀、背包相关问题

1.最优装载问题:给出N个物体,有⼀定重量。请选择尽量多的物体,使总重量不超过C。

解法:只关⼼数量多,便把重量从⼩到⼤排序,依次选,直到装不下。

2.部分背包问题:给出N个物体,有⼀定重量和价值。请选择⼀些物体的⼀部分使在总重量不超过C的条件下总价值最⼤。

解法:关⼼总价值⼤,物体可取部分,便优先取单位重量价值较⼤的物体。

3.乘船问题:有N个⼈,有⼀定重量。每艘船的最⼤载重量均为C,且最多载2⼈。请⽤最少的船装载所有⼈。

解法:关⼼数量少,要尽量使每艘船的实际载重量尽量接近于最⼤载重量。便把重量从⼩到⼤排序,每艘船依次先载⼀个⼈,再载重量最接近船的剩余可载重量的⼈。这样可以使眼前的消费(剩余载重量)最少。

实现:⽤2个变量 l , r 分别从两头往中间移动,l 和 r 可共乘⼀艘船,或 r ⾃⼰乘⼀艘船。

⼆、区间相关问题

1.选择不相交区间:数轴上有N个开区间(Li,Ri),请选择尽量多个区间,并保证这些区间两两没有公共点。

解法:先把这些区间按找 Ri 从⼩到⼤的顺序排序,再对按序排列的每2个区间A,B分情况讨论:(1)A被B包含,选A最优;(2)A右边的⼀部分与B左边的⼀部分相交,选A最优,因为选A⽐B减少了与后⾯区间相交的可能性;(3)A、B不相交,便2个都选。总的来说就是排序后,从左到右选第⼀个没有与前⾯已选的区间相交的区间。O(n)。

第二讲 贪心法和动态规划法PPT课件

第二讲 贪心法和动态规划法PPT课件

6
一些经典贪心算法问题
背包问题 带有限期的作业排序问题 哈夫曼树 最小生成树 磁带最优存储 ……
10.08.2020
安徽师范大学数学计算机科学学院 李杰
7
例1 最小生成树
1. 问题的描述 生成树:设G=(V,E)是一个无向连通图。如果G的生 成子图T=(V,E')是一棵树,则称T是G的一棵 生成树(spanning tree).
这些可行解可能有多个。为了衡量可行解的优劣,事 先给了一个关于可行解的函数,称为目标函数。目标 函数最大(或最小)的可行解,称为最优解。
10.08.2020
安徽师范大学数学计算机科学学院 李杰
4
贪心法的基本思想
选取一种量度标准,然后按量度标准对n个 输入排序,按顺序一次输入一个量。如果 这个输入和当前已构成在这种量度意义下 的部分最优解加在一起不能产生一个可行 解,则不把此输入加到这部分解中。
棵树;对将要计入到A中的下一条边(u,v), 应是E中一条当前不在A中且使得A∪{(u,v)} 也是一棵树的最小成本边。
10.08.2020
安徽师范大学数学计算机科学学院 李杰
9
Prim算法
1 10
2
50
45
40 35 3
30
5
25 55
4
15
20 6
边 (1,2) (2,6)

贪心算法与动态规划

贪心算法与动态规划

贪⼼算法与动态规划

接下来学习贪⼼算法和动态规划,学习的过程中由于看的是录播,发现⽼师上课发现⼈有些没来有些许失落,下次在没有确定有充⾜时间的情况下,取消⼀切⽹络课程的报名。

贪⼼算法

贪⼼算法在求解某个问题时,总是做出眼前的最⼤利益,也就是说只顾眼前不顾⼤局,所以他是局部最优解。

贪⼼算法不是对所有问题都能得到整体最好的解决办法,关键是贪⼼策略的选择,选择的贪⼼策略必须具备⽆后效性,即某个状态以前的状态不会影响以后的状态,只与当前状态有关。

贪⼼算法两个重要的特点是:

(1)贪⼼策略

(2)通过局部最优解能够得到全局最优解

会议安排问题

有N个同等级的会议需要在同⼀天使⽤同⼀个会议室,现在给出这N个会议的开始时间和结束时间,怎么样才能使会议室最⼤利⽤,安排最多场次的会议?

分析:这个问题需要⽤到贪⼼算法,即先将这些会议根据结束时间⾃然排序,肯定是先安排最先结束的,如果最先安排最后结束的,那如果⼀个会议开的很久,那本来可以多安排⼏场结果全被这个占了,显然不是最优的选择,因此优先安排会议先结束的才是合理的。然后接着在剩余的场次⾥判断会议开始时间是否在当前会议结束时间之后,如果在后⾯说明可以继续安排,下⾯就是代码实现。

(1)定义会议实体类,需要实现Comparable接⼝。

1/**

2 * 会议类,需实现Comparable接⼝

3*/

4public class Meeting implements Comparable<Meeting>{

5//定义会议属性

6private int number;

贪心算法的应用

贪心算法的应用

贪心算法的应用

贪心算法是一种经典的算法思想,它在解决一些优化问题时具有很高的效率和实用性。本文将介绍贪心算法的原理和应用,并以实际场景为例,详细讲解贪心算法的实施过程。

一、贪心算法简介

贪心算法是一种基于贪心策略的算法思想,即每一步都选择当前最优解,以期望最终能够达到全局最优解。它的核心思想是通过不断地做出局部最优选择,从而达到全局最优。贪心算法通常适用于满足“最有子结构性质”的问题,即通过局部最优解来推导出全局最优解。

二、贪心算法的应用场景

贪心算法的应用非常广泛,以下将介绍几个常见的应用场景。

1. 零钱找零问题

假设我们需要找零n元,而手上只有面额为1元、2元、5元的硬币若干。为了找零的硬币数量最少,我们可以采用贪心算法的思想:每一步选择面额最大的硬币,再找零,直到找够n元为止。

2. 区间调度问题

给定一个由n个区间组成的集合,每个区间都有一个起始时间和结束时间,我们的目标是在不重叠的前提下,尽量多地选择区间。解决这个问题的贪心策略是选择结束时间最早的区间,再继续选择剩余区间中结束时间最早的区间,依次类推。

3. 最优装载问题

假设有一批货物和一个固定容积的仓库,每个货物有自己的体积和价值。我们的目标是在仓库容积有限的情况下,选择部分货物使得总价值最大化。贪心算法可以通过按单位价值排序,每次选择价值最高的货物进行装载,直到仓库容量不足为止。

三、贪心算法的实施过程

以区间调度问题为例,介绍贪心算法的实施过程。

1. 首先,将所有区间按照结束时间进行排序。

2. 初始化一个空的结果集res,将第一个区间加入res中。

贪心算法及其应用

贪心算法及其应用

贪心算法及其应用

近年来,随着科技的发展和数据的爆炸式增长,优化问题成为了研究的热点。在高效解决各种优化问题中,贪心算法发挥了重要作用。本文将介绍贪心算法的定义、特点、优缺点及其常见应用。

一、什么是贪心算法

贪心算法是一种常见的算法方法,通过贪心策略来求解问题的最优解。其思想是在每一个阶段上,选择当前最优解的策略,最终得到的就是问题的最优解。

二、贪心算法的特点

贪心算法具有以下特点:

1、局部最优解一定是全局最优解的一个组成部分;

2、求解过程中不需要回溯;

3、贪心算法具有高效性,时间复杂度低。

三、贪心算法的优缺点

1、优点

贪心算法具有简单、高效等优点。对于那些没有明确要求最优

解的问题,贪心算法是一个不错的选择。

2、缺点

贪心算法的局限性在于,有些问题不能用贪心策略求得最优解。因为每一步选择的最优解并不一定能导致全局最优解。此外,贪

心算法需要注意到问题的结构性质,否则可能做出错误决策。

四、贪心算法的应用

1、背包问题

背包问题是一个最经典的贪心算法应用场景。在这个问题中,

我们需要将一组物品放到一个容器中。每个物品有一个权值和一

个体积。容器有一个最大承载体积,求容器可以承载的最大权值。

使用贪心算法在背包问题中是具有局限性的。但是,在有些情

况下,贪心策略是可行的。例如在只考虑单个维度时,贪心算法

以效率极高的速度求得其最优解。

2、最小生成树

最小生成树问题是一个常见的求解问题。其问题的目标是在一

张图中找到一棵生成树,该树的所有边权之和最小。

在这个问题中,我们采用贪心策略选择当前最优边并添加到生

成树中,以此来求得最优解。

算法合集之《浅谈贪心思想在动态规划中的应用》

算法合集之《浅谈贪心思想在动态规划中的应用》

田忌最强的马 输给 齐王最强的马 战平 能赢
用田忌最强的马去打平齐王最强的马
或者 用田忌最强的马去战胜齐王最强的马 用田忌最差的马去输给齐王最强的马 用田忌最差的马去输给齐王最强的马
[例二] The Horse Racing
最强的马战平时,单一的贪心策略存在反例
光是打平比赛
田忌的马 1 2 3
f[i, j] max{f[i-1, j] g[n - (i - j) 1,i], f[i -1, j -1] g[j, i]}
其中g[i,j]表示齐王和田忌的马分别按由强到弱的顺序排 序之后,田忌的第i匹马和齐王的第j匹马赛跑所能取得 的盈利,胜为200,负为-200,平为0。
田忌
齐王
时间复杂度过大,无法满足要求 如果田忌的马胜,则连一条
权为200的边; 如果平局,则连一条权为0 的边; 如果输,则连一条权为-200 的边。
[例二] The Horse Racing
运用贪心思想分析问题:
田忌掌握有比赛的“主动权”,他总是根据齐王所出的 马来分配自己的马去对抗齐王的马 可以假设齐王按照马的强弱顺序由强到弱出马
收益为200 收益为0
齐王的马 1 2 3
[例二] The Horse Racing
最强的马战平时,单一的贪心策略存在反例
光是输掉比赛

贪心与动态规划算法的主要区别

贪心与动态规划算法的主要区别

贪心算法与动态规划算法的主要区别

所谓贪心选择性质是指所求问题的整体最优解可以通过一系列局部最优的选择,即贪心选择来达到。这是利用贪心算法求解最优解的第一个基本要素,也是贪心算法与动态规划算法的主要区别。

共同点:

求解的问题都具有最优子结构性质

差异点:

动态规划算法通常以自底向上的方式解各子问题,而贪心算法则通常以自顶向下的方式进行,以迭代的方式作出相继的贪心选择,每做一次贪心选择就将所求问题简化为规模更小的子问题。

Prim算法O(n2)

首先置S={1},然后,只要S是V的真子集,就作如下的贪心选择:选取满足条件i∈S,j∈V-S,且c[i][j]最小的边,将顶点j添加到S中。

这个过程一直进行到S=V时为止。在这个过程中选取到的所有边恰好构成G的一棵最小生成树。

在上述Prim算法中,还应当考虑如何有效地找出满足条件i∈S, j∈V-S,且权c[i][j]最小的边(i,j)。实现这个目的的较简单的办法是设置2个数组closest和lowcost。在Prim算法执行过程中,先找出V-S中使lowcost值最小的顶点j,然后根据数组closest选取边(j,closest[j]),最后将j添加到S中,并对closest和lowcost作必要的修改。

Kruskal算法O(eloge)

首先将G的n个顶点看成n个孤立的连通分支。将所有的边按权从小到大排序。然后从第一条边开始,依边权递增的顺序查看每一条边,并按下述方法连接2个不同的连通分支:当查看到第k条边(v,w)时,如果端点v和w分别是当前2个不同的连通分支T1和T2中的顶点时,就用边(v,w)将T1和T2连接成一个连通分支,然后继续查看第k+1条边;如果端点v和w在当前的同一个连通分支中,就直接再查看第k+1条边。这个过程一直进行到只剩下一个连通分支时为止。

在算法分析与设计中的贪心策略

在算法分析与设计中的贪心策略

在算法分析与设计中的贪心策略算法分析与设计中的贪心策略

贪心算法是一种经典的求解最优化问题的算法思想。它在很多实际应用中都非常有效。贪心算法的基本思想是将问题分解成若干个子问题,对每个子问题进行求解,并将其解合并起来得到原问题的最优解。在算法分析与设计中,贪心策略经常被使用。本文将探讨在算法分析与设计中贪心策略的应用及其特点。

1. 基本概念

贪心算法是一种算法思想,它在求解最优化问题时,总是采取当前状态下最优的选择。贪心算法的基本思想是将问题分解成若干个子问题,对每个子问题进行求解,并将其解合并起来得到原问题的最优解。贪心算法通常是一种快速算法,可以在很短的时间内解决问题。

2. 贪心策略的特点

贪心策略有以下特点:

(1)贪心策略通常具有高效性和优秀的实用性。

(2)贪心策略可以解决一些较为复杂的问题,但不一定能得到全局最优解。

(3)贪心策略一般不需要存储全部计算信息,因此它的空间占用通常比较小。

(4)贪心策略可以使用动态规划算法来优化,从而得到更为精准的结果。

3. 贪心策略的应用

贪心策略广泛应用于算法分析与设计中的问题求解。例如,背包问题、最小生成树问题、最优路径问题等都可以使用贪心策略来解决。我们选取一道经典的贪心算法问题:零钱找零问题,来深入探讨贪心策略的应用。

零钱找零问题:假设我们有面值分别为1元、2元、5元和10元的硬币数量不限,问用最少的硬币数找出15元?

解决方法:根据贪心策略,我们首先选取最大面值的硬币,即10元硬币,此时我们需要找5元。接下来,我们选取次大面值的硬币,即5元硬币,此时我们需要找0元。最后,我们选取次次小面值的硬币,即2元硬币,此时我们需要找1元。因此,我们需要一枚10元硬币、一枚5元硬币和一枚2元硬币,共计三枚硬币。

算法导论-贪心算法

算法导论-贪心算法

算法导论——贪心算法

求解最优化问题的算法通常需要经过一系列的步骤,在每个步骤都面临多种选择。对于许多最优化问题,使用动态规划算法来求最优解有些杀鸡用牛刀了,可以使用更简单、更高效的算法。贪心算法(greedy algorithm)就是这样的算法,它在每一步都做出当时看起来最佳的选择。也就是说,它总是做出局部最优的选择,寄希望这样的选择能导致全局最优解。本章介绍一些贪心算法能找到最优解的最优化问题。

贪心算法并不保证得到最优解,但对很多问题确实可以求得最优解。我们首先在16.1节介绍一个简单但非平凡的问题—活动选择问题,这是一个可以用贪心算法求得最优解的问题。首先考虑用动态规划方法解决这个问题,然后证明一直做出贪心选择就可以得到最优解,从而得到一个贪心算法。16. 2节会回顾贪心方法的基本要素,并给出一个直接的方法,可用来证明贪心算法的正确性。16. 3节提出贪心技术的一个重要应用:设计数据压缩编码(Huffman编码)。在16. 4节中,我们讨论一种称为“拟阵"(matroid)的组合结构的理论基础,贪心算法总是能获得这种结构的最优解。最后,16. 5节将拟阵应用于单位时间任务调度问题,每个任务均有截止时间和超时惩罚。

贪心方法是一种强有力的算法设计方法,可以很好地解决很多问题。在后面的章节中,我们会提出很多利用贪心策略设计的算法,包括最小生成树(minimum-spanning-tree)算法(第23章)、单源最短路径的djikstra算法(第24章),以及集合覆盖问题的Chvatal贪心启发式算法(第35章)。最小生成树算法提供了一个经典的贪心方法的例子。

相关主题
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
的话,可以将复杂度降为O(n2kk),勉强可 以接受了
[例四] The Lost House
运用贪心思想分析问题
u
元素之1 间2 存。在。。可v比v性+1 ,。。且。 可k 比 性存在着传递性,因此可以确 (F另前对这因在b定此我[v一,交只此S时们的v出个可换如跟]F考前a结以前果元[虑一2S面)1一论推后交素..k个]L种和v:导的换e和访aFF如出后全vbv问ae[+A果的Ss[顺1序u[1一.S本.A值]k序值v]的一定关身1优中]做值定放的的秀系差都(放在两F信的已b个在C[息话知S前相Bv有,,1邻前。]F关那元a,[2!么u素)B]的vv一+和L值e1定va一待+v放1e定定s在[放SvC]
贪婪的动态规划
——浅谈贪心思想在动态规划中的应用 绍兴县柯桥中学 黄劲松
引言
在动态规划的解题中我们面临着两大困难
1、不知道是否可以用动态规划求解 2、直观的动态规划算法过于低效
在这个时候,巧妙的使用贪心思想,将其 融入到动态规划中,动态规划便焕发出了 新的光彩
目录
贪心思想在动态规划中的应用
小结1
抛弃了原本直观而低效的算法
结合贪心思想分析问题
用合理的假设得到了“田忌出马不是出最强,就 是出最弱”的信息
因此得知可以用动态规划求解且确立出动规状态
贪心思想在动态规划中的应用二: 优化算法
一些题目虽然容易确立出状态以及轻松的 写出状态转移方程,但是直观上的算法往 往效率不高
确立状态
[例一]青蛙的烦恼(详见论文) [例二]The Horse Racing
优化算法
[例三]石子归并(详见论文) [例四]The Lost House
贪心思想在动态规划中的应用一: 确立状态
动态规划当中,状态的确立是重点 而在实际的解题过程中,状态信息往往是
隐含的
这个时候,合理的运用贪心思想,可以迅 速的从繁芜丛杂的问题背景中巧妙地抽象 出状态
用f[i,j]表示齐王出了i匹较强的马和田忌的j匹较强的马, i-j匹较弱的马比赛之后,田忌所能够得到的最大盈利。
f[i, j] max{f[i-1, j] g[n - (i - j) 1,i], f[i-1, j-1] g[j,i]}
其中g[i,j]表示齐王和田忌的马分别按由强到弱的顺序排 序之后,田忌的第i匹马和齐王的第j匹马赛跑所能取得 的盈利,胜为200,负为-200,平为0。
而贪心历来是与高效一词密不可分的
运用好贪心思想能够使原来效率低下的算 法得到重生
[例四]The Lost House
蜗牛从根结点出发开始寻 找它遗失在某个叶子结点 的房子
一些中间结点上住着的虫 子会告诉蜗牛它的房子是
否树在上以的这结个点点为个根数的n子最树多为1000,每个结点 上的分叉数k最多为8。
房子遗失在每个叶子结点 的概率都是相等的
求蜗牛找到房子的最小数 学期望步数(走过一条边 算作一步)
[例四]The Lost House
(1+4+6)/3 = 11/3 这种走法没有充分发挥蜗牛虫从子根结在点这1出里发的开始作寻用找!它的房子
它的房子可能遗失在叶结点2、4、5上 在结点3上住着一只虫子,它会告诉蜗 牛,房子是否在以3为根的子树上
[例二]The Horse Racing
齐王和田忌各派出N匹马(N≤2000) 每匹马都有一个固定的速度值 每场比赛,输的一方将要给赢的一方200两黄金,如果
是平局的话,双方都不必拿出钱 请你扮演一下孙膑,帮助田忌赢最多的钱
[例二] The Horse Racing
这个问题很显然可以转化成一 个二分图最佳匹配的问题
光是打平比赛
田忌的马 1 2 3 齐王的马 1 2 3
收益为0200
[例二] The Horse Racing
最强的马战平时,单一的贪心策略存在反例
光是输掉比赛
田忌的马 2 3 齐王的马 1 3
收益为2000
[例二] The Horse Racing
“田忌出马不是出最强的,就是出最弱的”
k i1
Fa[u] ( ((Fb[S j ] 2) 1) Leaves[Si ] Fa[Si ]) i1 j1
Fb[u]的值与访问顺序无关
[例四] The Lost House
问题的关键是如何决定儿子的访问顺序 一种直观的方法是枚举所有可能访问顺序,
复杂度是O(nk!),实在是很低效 上述算法存在冗余, 我们再用一次动态规划
马来分配自己的马去对抗齐王的马 可以假设齐王按照马的强弱顺序由强到弱出马
田忌最强的马 输能战给赢平 齐王最强的马
用田忌最强的马去打平齐王最强的马 用田忌最差 强的马去或输战者给胜齐王最强的马 用田忌最差的马去输给齐王最强的马
[例二] The Horse Racing
最强的马战平时,单一的贪心策略存ቤተ መጻሕፍቲ ባይዱ反例
Fa[uF] =b[i0]表; F示b[蜗u]牛= 的0; 房子不在i为根的子树上的期望步数 for i 和= 1(to也k就d是o 遍历该子树需要的时间,如果i处有虫子, begin那么Fb[i]=0)
Fa用[uL] e=aFveas[u[i]] +表(示Fbi[为u]根+的1)子×树L上ea叶ve子s[节S[点i]] 的+ 数Fa目[S。[i]]; Fb问[u题] =的F解b[答u] 就+ F是bF[Sa[i根]] +结2点; ]/Leaves[根结点]。 end;
[例四]The Lost House
Worm Said : No!
(3+2+4)/3 = 3
Worm Said : Yes!
[例四]The Lost House
如不果难结分点析u出有本k个题儿是子用,我树们型按动照态S规[1划]..来S[k求]进解行。访 问,FFa[ai][表u]示的蜗计牛算的方房式子在是i为:根的子树上的期望步数和
田忌 齐王
把田忌的马放左边,把齐王的 马放右边
时间复杂度过大,无法满足要求 如果田忌的马胜,则连一条 权为200的边;
如果平局,则连一条权为0 的边;
如果输,则连一条权为-200 的边。
[例二] The Horse Racing
运用贪心思想分析问题:
田忌掌握有比赛的“主动权”,他总是根据齐王所出的
相关文档
最新文档