第4章贪心算法解读
贪心算法的基本原理
![贪心算法的基本原理](https://img.taocdn.com/s3/m/4c5c0189d4bbfd0a79563c1ec5da50e2524dd1b4.png)
贪心算法的基本原理贪心算法(Greedy Algorithm)是一种常用的算法思想,它在求解最优化问题时通常能够得到较好的近似解。
贪心算法的基本原理是:每一步都选择当前状态下的最优解,从而希望最终能够得到全局最优解。
在实际应用中,贪心算法常常用于解决一些最优化问题,如最小生成树、最短路径、任务调度等。
一、贪心算法的特点贪心算法具有以下特点:1. 简单:贪心算法通常比较简单,易于实现和理解。
2. 高效:贪心算法的时间复杂度通常较低,能够在较短的时间内得到结果。
3. 局部最优:每一步都选择当前状态下的最优解,但不能保证最终能够得到全局最优解。
4. 适用范围:贪心算法适用于一些特定类型的问题,如无后效性、最优子结构等。
二、贪心算法的基本原理贪心算法的基本原理可以概括为以下几个步骤:1. 初始状态:确定问题的初始状态,定义问题的输入和输出。
2. 状态转移:根据当前状态,选择局部最优解,并更新状态。
3. 筛选解:判断当前状态下是否满足问题的约束条件,若满足则保留该解,否则舍弃。
4. 终止条件:重复以上步骤,直至满足终止条件,得到最终解。
三、贪心算法的应用举例1. 找零钱:假设有 25、10、5、1 四种面额的硬币,需要找零 41 元,如何使得找零的硬币数量最少?贪心算法可以先选择面额最大的硬币,然后逐步选择面额较小的硬币,直至找零完毕。
2. 区间调度:给定一组区间,如何选择最多的互不重叠的区间?贪心算法可以先按照区间的结束时间排序,然后依次选择结束时间最早的区间,直至所有区间都被覆盖。
3. 最小生成树:在一个连通的带权无向图中,如何选择边使得生成树的权值最小?贪心算法可以按照边的权值从小到大排序,然后依次选择权值最小且不构成环的边,直至所有顶点都被连接。
四、贪心算法的优缺点1. 优点:贪心算法简单高效,适用于一些特定类型的问题,能够在较短的时间内得到近似最优解。
2. 缺点:贪心算法不能保证一定能够得到全局最优解,可能会出现局部最优解不是全局最优解的情况。
贪心算法在优化问题中的运用
![贪心算法在优化问题中的运用](https://img.taocdn.com/s3/m/8fa1de6859fb770bf78a6529647d27284a73376a.png)
贪心算法在优化问题中的运用贪心算法(Greedy Algorithm)是一种常用的算法思想,它在解决一些优化问题时具有很高的效率和实用性。
贪心算法的核心思想是每一步都选择当前状态下最优的解决方案,以期望最终能够得到全局最优解。
在实际应用中,贪心算法常常被用来解决一些最优化问题,如最短路径问题、背包问题、任务调度等。
本文将介绍贪心算法在优化问题中的运用,并通过具体案例来说明其应用场景和解决方法。
一、贪心算法的基本原理贪心算法是一种在每一步选择当前状态下最优解决方案的算法思想。
它与动态规划不同,贪心算法并不会保存之前的计算结果,而是根据当前状态做出最优选择。
贪心算法的优势在于简单、高效,适用于一些特定类型的问题。
贪心算法的基本原理可以总结为以下几点:1. 每一步都选择当前状态下的最优解决方案;2. 不考虑未来的结果,只关注当前状态的最优选择;3. 最终期望通过每一步的最优选择达到全局最优解。
二、贪心算法在优化问题中的应用1. 最短路径问题最短路径问题是图论中的经典问题,贪心算法可以用来解决一些简单的最短路径问题。
例如,在无权图中,从起点到终点的最短路径可以通过贪心算法来求解,每次选择距离最近的节点作为下一步的目标节点,直到到达终点为止。
2. 背包问题背包问题是一个经典的优化问题,贪心算法可以用来解决一些特定类型的背包问题。
例如,在分数背包问题中,每种物品可以取任意比例,贪心算法可以按照单位价值最高的顺序选择物品放入背包,直到背包装满为止。
3. 任务调度问题任务调度问题是一个常见的优化问题,贪心算法可以用来解决一些简单的任务调度问题。
例如,在单处理器任务调度中,每个任务有一个开始时间和结束时间,贪心算法可以按照结束时间的先后顺序对任务进行调度,以最大化处理器的利用率。
三、案例分析:活动选择问题活动选择问题是一个经典的优化问题,通过贪心算法可以高效地解决。
问题描述如下:假设有n个活动,每个活动都有一个开始时间和结束时间,活动之间不能交叉进行,问如何安排活动才能使参加的活动数量最多。
贪心算法(陈鹏)
![贪心算法(陈鹏)](https://img.taocdn.com/s3/m/2e0c0d19c5da50e2524d7f64.png)
— 20 —
江苏省青少年信息学奥林匹克竞赛委员会 | 版权所有
© Copyright JSOI 2010
JSOI2010江苏省青少年信息学奥林匹克集训队(夏令营)
2、贪心算法的特点
[贪心算法解题的一般步骤] 1、设计数据找规律 2、进行贪心猜想 3、正确性证明(严格证明和一般证明) ·严格证明:数学归纳和反证法 ·一般证明:列举反例 4、程序实现
— 12 —
江苏省青少年信息学奥林匹克竞赛委员会 | 版权所有
© Copyright JSOI 2010
JSOI201——纪念品分组(NOIP2007普及组)
[输入输出样例] 输入: 输出: 100 6 9 90 20 20 30 50 60 70 80 90
若无法证明, 此步骤可缺省
— 21 —
江苏省青少年信息学奥林匹克竞赛委员会 | 版权所有
© Copyright JSOI 2010
JSOI2010江苏省青少年信息学奥林匹克集训队(夏令营)
2、贪心算法的特点
[典型的贪心算法简介] 贪心策略在树和图论中有着极其重要的应用,Prim、 Kruskal、Huffman等体现“贪心”思想的算法更是广泛地 应用于树与图的处理。 下面介绍一种利用“贪心”思想的算法——哈夫曼 (Huffman)树。
—7—
江苏省青少年信息学奥林匹克竞赛委员会 | 版权所有
© Copyright JSOI 2010
JSOI2010江苏省青少年信息学奥林匹克集训队(夏令营)
1、贪心概念
[求解这类问题的方法] 1、搜索 最原始的方法是搜索(穷举)法。当然,为了尽快搜 索出解,我们往往会利用限制条件进行可行性判断剪枝, 或利用目标函数的上界(或下界)进行分枝定界。 2、动态规划 第二种解决此类问题的方法是动态规划。当然,使用 动态规划必须要满足一些条件,如无后效性和最优子结构 等等。
4-贪心法
![4-贪心法](https://img.taocdn.com/s3/m/9f064617844769eae009edf4.png)
应用实例
活动安排问题—算法设计与分析
template<class Type> void GreedySelector(int n, Type s[], Type f[], bool A[]) { A[1] = true; int j = 1; for (int i=2;i<=n;i++) { if (s[i]>=f[j]) { A[i]=true; j=i; } else A[i]=false; } }
贪心法的正确性问题
针对具体问题不同,贪心策略的选择可能有多种 ,如何选择合适的贪心策略并证明该策略的正确 性是贪心算法设计中的一个关键问题。 一般可以通过对算法步数的归纳或通过对问题规 模的归纳来证明贪心法的正确性。
应用实例
活动安排问题
有n个活动申请使用同一个礼堂,每项活动有一个开始时间和一 个截止时间,如果任何两个活动不能同时举行,问如何选择这 些活动,从而使得被安排的活动数量达到最多? 设S={1, 2, …, n}为活动的集合,si和fi分别为活动i的开始和截止 时间,i=1, 2, …, n。定义 活动i与j相容:si ≥ fj或sj ≥fi, i≠j 求S最大的两两相容的活动子集。 蛮力法 动态规划方法
若硬币的面值改为一角一分、五分和一分,要找给顾客的 是一角五分,情况如何?
贪心算法的基本思想
顾名思义,贪心算法总是作出在当前看来最好的 选择。也就是说贪心算法并不从整体最优考虑, 它所作出的选择只是在某种意义上的局部最优选 择。 贪心算法不能对所有问题都得到整体最优解,但 对许多问题它能产生整体最优解。 在一些情况下,即使贪心算法不能得到整体最优 解,其最终结果却是最优解的很好近似。
4—贪心法 Greedy Approach
贪心算法的概念和适用条件
![贪心算法的概念和适用条件](https://img.taocdn.com/s3/m/b307b80dce84b9d528ea81c758f5f61fb7362834.png)
贪心算法的概念和适用条件什么是贪心算法?贪心算法(Greedy Algorithm)是一种以局部最优解为导向的算法思想,通过每一步选择当前状态下的最佳操作来达到整体最优解的目标。
贪心算法的核心思想是每次都做出当前看来最优的选择,以期望能够达到整体的最优解。
贪心算法通常用于一些问题中,即每一步的选择只依赖于当前状态,而不考虑将来可能出现的情况。
贪心算法的适用条件:1. 贪心选择性质:贪心算法每一步都选择一个当前的最优解,此处的“最优”指的是局部最优。
这种最优选择可以确保问题能够被拆解,并且进行下一步求解。
2. 最优子结构性质:当问题的整体最优解能够通过局部最优解得到时,可以采用贪心算法求解。
这种情况下,问题的最优解可以由子问题的最优解推导出来。
3. 无后效性:贪心算法选择某一步操作时,只考虑当前状态,不会改变以前的操作,并且不关心未来的操作。
这种无后效性使得贪心算法在实际应用中操作简单、效率高。
贪心算法的基本步骤:1. 确定问题的局部最优解:贪心算法的核心是每一步都选择在当前情况下的最优解。
因此,需要确定问题如何拆解以及如何进行局部最优选择。
2. 定义问题的子问题:根据问题的最优子结构性质,将问题拆解为较小规模的子问题。
子问题应该是原问题的一个更小、更简单的实例。
3. 定义贪心选择策略:根据问题的特性,确定当前步骤下的最优选择策略。
这个选择应该是局部最优的,可以在不考虑子问题和整体未来状态的情况下得出。
4. 重复执行步骤2和3,直至求解出全局最优解。
贪心算法的优缺点:贪心算法具有简单易懂、快速高效的特点,适用于许多实际问题。
它可以避免穷举所有可能性,节省了计算时间。
此外,贪心算法常常能够找到近似最优解,尽管不一定能够保证全局最优解。
在实际问题中,近似最优解也往往可以满足实际需求。
然而,贪心算法并非适用于所有问题。
由于贪心算法只考虑当前状态的最优选择,而不考虑未来的影响,因此可能会导致局部最优解与全局最优解不一致。
算法设计与分析第04章 贪心算法PPT课件
![算法设计与分析第04章 贪心算法PPT课件](https://img.taocdn.com/s3/m/1995352ff7ec4afe04a1dfb0.png)
4.1 活动安排问题
若被检查的活动i的开始时间Si小于最近选择的活动j 的结束时间fi,则不选择活动i,否则选择活动i加入集 合A中。
贪心算法并不总能求得问题的整体最优解。但对 于活动安排问题,贪心算法greedySelector却总能求 得的整体最优解,即它最终所确定的相容活动集合A的 规模最大。这个结论可以用数学归纳法证明。
•}
6
4.1 活动安排问题
由于输入的活动以其完成时间的非减序排列,所 以算法greedySelector每次总是选择具有最早完成 时间的相容活动加入集合A中。直观上,按这种方法 选择相容活动为未安排活动留下尽可能多的时间。也 就是说,该算法的贪心选择的意义是使剩余的可安排 时间段极大化,以便安排尽可能多的相容活动。
算法greedySelector的效率极高。当输入的活 动已按结束时间的非减序排列,算法只需O(n)的时间 安排n个活动,使最多的活动能相容地使用公共资源。 如果所给出的活动未按非减序排列,可以用O(nlogn) 的时间重排。
7
4.1 活动安排问题
例:设待安排的11个活动的开始时间和结束时间按结 束时间的非减序排列如下:
13
4.2 贪心算法的基本要素
3.贪心算法与动态规划算法的差异
贪心算法和动态规划算法都要求问题具有最优子结构 性质,这是2类算法的一个共同点。但是,对于具有最 优子结构的问题应该选用贪心算法还是动态规划算法 求解?是否能用动态规划算法求解的问题也能用贪心算 法求解?下面研究2个经典的组合优化问题,并以此说 明贪心算法与动态规划算法的主要差别。
11
4.2 贪心算法的基本要素
1.贪心选择性质
所谓贪心选择性质是指所求问题的整体最优解可以通 过一系列局部最优的选择,即贪心选择来达到。这是 贪心算法可行的第一个基本要素,也是贪心算法与动 态规划算法的主要区别。
4-2贪心-贪心选择性质
![4-2贪心-贪心选择性质](https://img.taocdn.com/s3/m/8cf1dc100812a21614791711cc7931b765ce7b92.png)
贪心选择性质。
贪心算法的基本要素是:指所求问题的整体最优解可以通过一系列局部最优解的选择,即贪心选择来达到。
贪心选择性质每次选取当前最优解,因此它依赖以往的选择,而不依赖于将来的选择。
贪心选择通常以自顶向下的方式进行,每次贪心选择就将原问题转化为规模更小的子问题。
贪心算法1、首先证明存在问题的一个整体最优解必定包含了第一个贪心选择。
2、然后证明在做了贪心选择后,原问题简化为规模较小的类似子问题,即可继续使用贪心选择。
3、于是用数学归纳法可证明,经过一系列贪心选择可以得到整体最优解。
证明贪心选择将导致整体的最优解142653687916181411121234设G = (V , E)是一个无向连通带权图,即一个网络。
E 的每条边(v, w)的权c[v][w]。
如果G 的一个子图G ,是一棵包含G 的所有顶点的树,则称G’为G 的生成树。
生成树的各边的权的总和称为该生成树的耗费。
在G 的所有生成树中,耗费最小的生成树称为G 的最小(优)生成树。
1234设G = (V , E)是一个无向连通带权图,即一个网络。
E 的每条边(v, w)的权c[v][w]。
如果G 的一个子图G ,是一棵包含G 的所有顶点的树,则称G’为G 的生成树。
生成树的各边的权的总和称为该生成树的耗费。
在G 的所有生成树中,耗费最小的生成树称为G 的最小(优)生成树。
令G 中权最小的边为e 1。
首先必定有图G 的一棵最小生成树包含了e 1。
若G 的任何最小生成树都不包含e 1。
设T为G 的最小生成树,e 1 T 。
于是T+e 1是一个有回路的图且该回路中包含e 1。
该回路中必有条不是e 的边e i 。
令T’={T+e 1}–e i 。
T’也是G 的生成树。
又c(T’) = c(T) + c(e 1)–c(e 1),c(e 1) ≤ c(e i ),从而c(T’)≤c(T),T’是G 的最小生成树且含有边e 1。
矛盾。
故必定有图G 的最小生成树包含了e 1。
计算机算法设计与分析 王晓东第 版
![计算机算法设计与分析 王晓东第 版](https://img.taocdn.com/s3/m/114d9d43d5bbfd0a7856730e.png)
School of Computer and Communication Engineer
19
Fun Time
考虑如下活动集合 S:
i 1 2 3 4 5 6 7 8 9 10 11 si 1 3 0 5 3 5 6 8 8 2 12 fi 4 5 6 7 9 9 10 11 12 14 16
• 子集 {a3, a9, a11} 为一相容活动集合 • 计算最大相容活动集合?
最优解.
School of Computer and Communication Engineer
14
0/1 背包问题动态规划求解
• 贪心选择无法保证最终能将背包装满, 部分闲置的背 包空间使物品单位重量的价值发生变化
• 应比较选择该物品和不选择该物品所导致的最终方 案, 然后再作出最好选择(重叠子问题)
为了选择最多的相容活动, 每次选择 fi 最小的相容活 动, 即, 使以后可选更多的活动—“贪心(Greedy)”.
School of Computer and Communication Engineer
26
活动选择问题贪心算法
考虑如下活动集合 S: i 1 2 3 4 5 6 7 8 9 10 11 si 1 3 0 5 3 5 6 8 8 2 12 fi 4 5 6 7 9 9 10 11 12 14 16
• 贪心算法: 每一步做出一个选择, 该选择不依赖于子 问题的解
* 一个问题是否具有贪心选择性需要证明
School of Computer and Communication Engineer
7
最优子结构
定义 2. 若一个优化问题的最优解包括它的子问题的最 优解, 则称其具有最优子结构. • 动态规划: 最优子结构, 子问题重叠性 • 贪心算法: 最优子结构, 贪心选择性
(算法分析与设计)2.贪心算法
![(算法分析与设计)2.贪心算法](https://img.taocdn.com/s3/m/0fad800b960590c69fc37633.png)
n
wixi
vixi
28.2
31
31.5
...
i1
[算法思路]1).将各物体按单位价值由高到低排序.
2).取价值最高者放入背包.
3).计算背包剩余空间.
4).在剩余物体中取价值最高者放入背包.
若背包剩余容量=0或物体全部装入背包为止
算法设计与分析 > 贪心算法
背包问题的贪心算法
print tour, cost }
*该算法不能求得最优解. 算法的最坏时间复杂性为O(n2)
该问题为NP难问题.
算法设计与分析 > 贪心算法
4.7 多机调度问题
问题:设有n个独立的作业{1, 2, …, n}, 由m台相同的机器进行加工 处理. 作业i所需时间为t i. 约定:任何作业可以在任何一台机器上 加工处理, 但未完工前不允许中断处理,任何作业不能拆分成更小 的子作业。要求给出一种作业调度方案,使所给的n 个作业在尽 可能短的时间内 由m台机器加工处理完成。 该问题为NP完全问题.
A complete tree is filled from the left: • all the leaves are on • the same level or • two adjacent ones and • all nodes at the lowest level are as far to the left as possible.
最大相容活动子集(1, 4, 8, 11), 也可表示为等长n元数组:(1, 0, 0, 1, 0, 0, 0, 1, 0, 0, 1)
算法设计与分析 > 贪心算法
活动安排问题贪心算法
template< class Type > void GreedySelector(int n, Type s[ ], Type f[ ], bool A[] ) { A[ 1 ] = true;
贪心算法概述及研讨
![贪心算法概述及研讨](https://img.taocdn.com/s3/m/884b24ef5ef7ba0d4a733bdc.png)
对贪心算法的概述和研讨福州第一中学高一(8)班汪涛指导老师:陈颖算法总览当一个问题具有“最优子结构”时,我们可以采用动态规划法解决该问题。
但是有的时候,贪心算法可以更好的处理该类问题。
总体上看,贪心算法是一种高效的、不稳定的算法;但是它在解决问题时有很多独特的优良性质,掌握贪心算法有时可以非常迅速的获得最优解或近似最优解。
关键字:贪心算法(贪婪算法),贪心算法的应用举例,Object Pascal,快速算法,不稳定算法,信息学奥赛。
何时采用何时能,又何时应该采用贪心算法呢?一般认为,凡是经过数学归纳法证明可以采用贪心算法的情况,都应该采用它。
因为它的效率是很高的。
贪心算法的弱点在于它的不稳定性,即有时它不总能返回最优解。
那么能采用贪心算法的问题具有怎样的性质呢?(何时采用贪心算法)1、它具有和动态规划问题相似的性质,即分治法中的“最优子结构”性质,即每个子问题的最优解的集合就是整体最优解。
这是必须的性质,因为贪心算法解决的问题流程就需要依序研究每个子问题,然后综合之得出最后结果。
不能采用分治法解决的问题,是理论上是不能使用贪心算法的。
而且,必须拥有最优子结构性质,才能保证贪心算法返回最优解。
2、它必须具有一种特殊的“贪心选择性”。
这种性质类同于“最优子结构”性质,但又有一些小的差别。
我们知道,在动态规划中,每一个父问题结果的得出需要它的子问题作为条件;但是“贪心选择性”则不需要;贪心选择性所做的是一个非线性的子问题处理过程,即一个子问题并不依赖于另一个子问题,但是子问题间有严格的顺序性。
要证明一个问题具有“贪心选择性”,就必须证明每一步所做的贪心选择最终导致一个问题的整体最优解。
这也是必须的性质。
如果一个问题具有上述两个性质,理论上就应该采用贪心算法。
处理流程经由贪心算法处理的问题需要经过排序。
即把“最贪心”的子结果排在序列的最前面,一直到“最不贪心的”。
这是处理问题的第一步。
然后依序解决问题而得出最终结果。
贪心算法总结
![贪心算法总结](https://img.taocdn.com/s3/m/b381f40c17fc700abb68a98271fe910ef12dae9b.png)
贪⼼算法总结简介贪⼼算法(英⽂:greedy algorithm),是⽤计算机来模拟⼀个“贪⼼”的⼈做出决策的过程。
这个⼈⼗分贪婪,每⼀步⾏动总是按某种指标选取最优的操作。
⽽且他⽬光短浅,总是只看眼前,并不考虑以后可能造成的影响。
可想⽽知,并不是所有的时候贪⼼法都能获得最优解,所以⼀般使⽤贪⼼法的时候,都要确保⾃⼰能证明其正确性。
本⽂主要介绍,在解决诸多贪⼼算法的问题之后的⼼得。
常⽤场景最常见的贪⼼算法分为两种。
「我们将 XXX 按照某某顺序排序,然后按某种顺序(例如从⼩到⼤)选择。
」。
「我们每次都取 XXX 中最⼤/⼩的东西,并更新 XXX。
」(有时「XXX 中最⼤/⼩的东西」可以优化,⽐如⽤优先队列维护)第⼀种是离线的,先处理后选择,第⼆种是在线的,边处理边选择。
常见的出题背景为:确定某种最优组合(硬币问题)区间问题(合理安排区间)字典序问题最值问题A最优组合硬币问题是贪⼼算法⾮常经典的题⽬,关于最优组合问题,我认为主要分为两种类型:简单 -- 直接排序之后按照某种策略选取即可复杂 -- 除了按照贪⼼策略外,还需要进⾏某些处理或者模拟硬币问题硬币问题有1元、5元、10元、50元、100元、500元的硬币各C1、C5、C10、C50、C100、C500枚。
现在要⽤这些硬币来⽀付A元,最少需要多少枚硬币?假设本题⾄少存在⼀种⽀付⽅法。
0≤C1、C5、C10、C50、C100、C500≤1090≤A≤109本题是上述说的简单类型的题⽬,简⽽⾔之要使得硬币最少,则优先使⽤⼤⾯额的硬币。
因此本题的解法便⾮常清晰了,只需要从后往前遍历⼀遍即可(默认为硬币已经按⾯额⼤⼩进⾏排序)const int V[6] = {1, 5, 10, 50, 100, 500};int A, C[6]; // inputvoid solve(){int ans(0);for (int i = 5; i >= 0; -- i){int t = min(A / V[i], C[i]);A -= t * V[i];ans += t;}cout << ans << '\n';}零花钱问题POJ3040 AllowanceDescriptionAs a reward for record milk production, Farmer John has decided to start paying Bessie the cow a small weekly allowance. FJ has a set of coins in N (1 <= N <= 20) different denominations, where each denomination of coin evenly divides the next-larger denomination (e.g., 1 cent coins, 5 cent coins, 10 cent coins, and 50 cent coins).Using the given set of coins, he would like topay Bessie at least some given amount of money C (1 <= C <= 100,000,000) every week.Please help him ompute the maximum number of weeks he can pay Bessie.Input* Line 1: Two space-separated integers: N and C* Lines 2..N+1: Each line corresponds to a denomination of coin and contains two integers: the value V (1 <= V <= 100,000,000) of the denomination, and the number of coins B (1 <= B <= 1,000,000) of this denomation in Farmer John's possession.Output* Line 1: A single integer that is the number of weeks Farmer John can pay Bessie at least C allowanceSample Input3 610 11 1005 120Sample Output111这题的题⽬⼤意是:农场主每天都要给贝西⾄少为C的津贴。
【精选】贪心算法
![【精选】贪心算法](https://img.taocdn.com/s3/m/e04ae51142323968011ca300a6c30c225901f08c.png)
【精选】贪心算法贪心算法近年来的信息学竞赛中,经常需要求一个问题的可行解和最优解,这就是所谓的最优化问题。
贪心法是求解这类问题的一种常用算法。
在众多的算法中,贪心法可以算的上是最接近人们日常思维的一种算法,他在各级各类信息学竞赛、尤其在一些数据规模很大的问题求解中发挥着越来越重要的作用。
一、什么是贪心法贪心法是从问题的某一个初始状态出发,通过逐步构造最优解的方法向给定的目标前进,并期望通过这种方法产生出一个全局最优解的方法。
做出贪心决策的依据称为贪心准则(策略),但要注意决策一旦做出,就不可再更改。
贪心与递推不同的是,推进的每一步不是依据某一固定的递推式,而是做一个当时看似最佳的贪心选择,不断的将问题实例归纳为更小的相似子问题。
所以,在有些最优化问题中,采用贪心法求解不能保证一定得到最优解,这时我们可以选择其他解决最优化问题的算法,如动态规划等。
归纳、分析、选择贪心准则是正确解决贪心问题的关键。
二、贪心法的特点及其优缺点贪心法主要有以下两个特点:贪心选择性质:算法中每一步选择都是当前看似最佳的选择,这种选择依赖于已做出的选择,但不依赖于未作出的选择。
最优子结构性质:算法中每一次都取得了最优解(即局部最优解),要保证最后的结果最优,则必须满足全局最优解包含局部最优解。
利用贪心法解题的一般步骤是:1、产生问题的一个初始解;2、循环操作,当可以向给定的目标前进时,就根据局部最优策略,向目标前进一步;3、得到问题的最优解(或较优解)。
贪心法的优缺点主要表现在:优点:一个正确的贪心算法拥有很多优点,比如思维复杂度低、代码量小、运行效率高、空间复杂度低等,是信息学竞赛中的一个有力武器,受到广大同学们的青睐。
缺点:贪心法的缺点集中表现在他的“非完美性”。
通常我们很难找到一个简单可行并且保证正确的贪心思路,即使我们找到一个看上去很正确的贪心思路,也需要严格的正确性证明。
这往往给我们直接使用贪心算法带来了巨大的困难。
贪心算法的基本思路
![贪心算法的基本思路](https://img.taocdn.com/s3/m/e8fe8233f56527d3240c844769eae009581ba208.png)
贪心算法的基本思路
以下是贪心算法的基本思路:
1. 定义问题:明确要解决的问题和可用的操作。
2. 选择最优解:在每一步中,选择当前看起来最优的解决方案。
这个选择通常基于问题的局部信息和贪心准则。
3. 局部最优:根据贪心准则做出的选择应该在当前步骤是最优的,即能够获得最大或最小的效益。
4. 构建解决方案:通过一系列的局部最优选择,逐步构建出整个问题的解决方案。
5. 检查可行性:在每一步之后,检查所做出的选择是否满足问题的约束条件和限制。
6. 重复步骤:重复上述步骤,直到达到问题的终止条件或无法进一步做出改进。
贪心算法通常在每一步都做出局部最优选择,希望通过一系列局部最优选择来达到全局最优解。
然而,贪心算法并不保证一定能得到全局最优解,尤其是在复杂的问题中。
贪心算法的优势在于其简单性和效率。
它通常在每一步只需要考虑少量的因素,因此计算复杂度较低。
贪心算法在一些情况下可以提供较好的近似解,并且在实际应用中经常被使用。
需要注意的是,贪心算法的正确性和有效性取决于问题的特性和贪心准则的选择。
在使用贪心算法时,需要仔细分析问题,选择合适的贪心准则,并通过实例验证算法的正确性。
《计算机算法设计与分析》PPT第四章贪心算法资料
![《计算机算法设计与分析》PPT第四章贪心算法资料](https://img.taocdn.com/s3/m/9c487ddbba1aa8114531d970.png)
假设活动已按结束时间的单调非递减顺序排序 f0≤f1≤f2≤… ≤fn<fn+1
则,当i≥j时, Sij=φ。
假设存在一活动ak∈Sij,其中i≥j,则在已排的序列中 ai在aj后面。
因fi≤sk<fk≤sj<fj ,与在已排的序列中ai在aj后面的 假设相矛盾。
所以,设活动按结束时间的单调非递减顺序排序,子 问题空间被用来从sij中选择最大相容活动子集,其中 0≤i<j≤n+1,而且所有其它的sij是空的。
14
步骤2:递归地定义最优解的值 设c[i, j]为Sij中最大相容子集中的活动数。当 Sij=φ时,c[i, j] = 0。对于一个非空子集Sij, 如果ak在Sij的最大相容子集中被使用,则子问 题Sik和Skj的最大相容子集也被使用。从而:
c[i, j] = c[i, k] + c[k, j] + 1
活动安排问题:要在所给的活动集合中选出最大 的相容活动子集合。
10
用动态规划方法求解
步骤1:分析最优解的结构特征 构造子问题空间 Sij={ ak∈S: fi≤sk<fk≤sj} Sij是S中活动的子集,其中每个活动都在活动ai 结束之后开始,且在活动aj开始之前结束。 Sij包含了所有与ai和aj相容的活动,并且与不迟 于ai结束和不早于aj开始的活动相容。此外, 虚构活动a0和an+1,其中f0=0, Sn+1=∞。原 问题即为寻找S0,n+1中最大相容活动子集。
(5)约束函数constraint:检查解集合中加入一 个候选对象是否满足约束条件。例如,在找零钱 问题中,约束函数是每一步选择的货币和已付出 的货币相加不超过应找零钱。
7
贪心算法的一般框架
马丙鹏_计算机算法设计与分析_第四章_1
![马丙鹏_计算机算法设计与分析_第四章_1](https://img.taocdn.com/s3/m/000908c8d15abe23482f4d9f.png)
17
4.2 背包问题
1. 问题的描述
– 问题的形式描述 可行解: 满足上述约束条件的任一集合(x1,x2,…,xn) 都是 问题的一个可行解——可行解可能为多个。 (x1,x2,…,xn)称为问题的一个解向量。 最优解: 能够使目标函数取最大值的可行解是问题的最 优解——最优解也可能为多个。
20
20
4.2 背包问题
2. 贪心策略求解
– (1) 以目标函数作为度量标准 如:若ΔM=2,背包外还剩两件物品i,j,且有(pi= 4,wi=4) 和(pj=3,wj=2),则下一步应选择j而非i 放入背包:pi/2 = 2 < pj= 3 实例分析(例4.1) (p1,p2,p3) = (25,24,15), (w1,w2,w3) = (18,15,10) ∵ p1>p2> p3 ∴ 首先将物品1放入背包,此时x1=1,背包获得p1=25的效 益增量,同时背包容量减少w1=18个单位,剩余空间ΔM=2。 其次考虑物品2和3。就ΔM=2而言有,只能选择物品2或3 的一部分装入背包。
3. 贪心方法的一般策略
– 贪心方法
A(1) A(2) … A(n)
量度标准1
A1(1) … A1(n)
量度标准2
A2(1) … A2(n)
……
量度标准k
Ak(1) … Ak(n)
可行解1 次优解
可行解2 最优解
可行解k 次优解
12
12
4.1 一般方法
按照度量标准,从A中选择一个输 procedure GREEDY(A,n) 入,其值赋予x,并将之从A中删除 //A(1:n)包含n个输入// solution←Φ //将解向量solution初始化为空// for i←1 to n do 判断x是否可以包含在解向量中 x←SELECT(A) if FEASIBLE(solution, x) then solution←UNION(solution, x) endif repeat return (solution) 将x和当前的解向量合并成新 end GREEDY 的解向量,并修改目标函数
贪心算法
![贪心算法](https://img.taocdn.com/s3/m/b4c185ffe009581b6bd9eb99.png)
6.贪心方法模型
a.工程计划模型 b.部分背包与每步最优 c.构造贪心算法
a.工程计划模型
我们常常碰到这样的问题:完成一个工程需
要若干个步骤,每个步骤都有若干种方法, 图示—— 步骤a 步骤b 步骤c ... 步骤n 方法b1 方法c1 方法a1 方法b2 方法c2 方法n1 方法a2 方法b3 方法c3 方法c4
种树问题:一条街道分为n个区域(按1-n编号), 每个都可种一棵树。有m户居民,每户会要求在区 域i-j区间内种至少一棵树。现求一个能满足所有要 求且种树最少的方案。 算法构造: 1.对于要求,以区间右端(升序)为首要关键字, 左端(升序)为次要关键字排序。 2.按排好的序依次考察这些要求,若未满足,则在 其最右端的区域种树,这时可能会满足多个要求。 证明思路:解法并不唯一,关键是证明没有比该解 法更好的解法。按步骤1排序之后,会发现对于每 个要求,在最右边的区域内种树所得的结果总不会 差于在其他区域种树。至于为什么这样排序,留给 你——读者们思考吧。
每个方法有一个权值(如效率、质量),其大小往 往和其他步骤中选取的方法有关。有些时候权值无 意义,表示方法不可选择。要求给出一个方法组合, 是权值和最大。 在这里,暂且把它称作“工程计划”。很多实际问 题都可以归纳为这个模型。 对于不同形式的工程计划,我们有不同的解法。 若权值与整个过程或前后步骤的方法选择都有关, 我们使用搜索算法——时间复杂度高得吓人。 若每个权值只与上(或下)一步或少数几步的方法 选择都有关,我们使用动态规划——有比较高的效 率,在下一章会讲到。 若每个权值与其他步骤的方法选择都没有关系,我 们使用贪心方法。
算法分析:设a[i]为第I堆纸牌的张数(0<=I<=n), v为均分后每堆纸牌的张数,s为最小移动次数。 我们用贪心算法,按照从左到右的顺序移动纸牌。 如第I堆的纸牌数不等于平均值,则移动一次(即s 加1),分两种情况移动: 1.若a[i]>v,则将a[i]-v张从第I堆移动到第I+1堆; 2.若a[i]<v,则将v-a[i]张从第I+1堆移动到第I堆。 为了设计的方便,我们把这两种情况统一看作是将 a[i]-v从第I堆移动到第I+1堆,移动后有a[i]=v; a[I+1]=a[I+1]+a[i]-v. 在从第I+1堆取出纸牌补充第I堆的过程中可能回出 现第I+1堆的纸牌小于零的情况。
计算机算法设计与分析(王晓东第4版)第4章
![计算机算法设计与分析(王晓东第4版)第4章](https://img.taocdn.com/s3/m/2f9c9de0941ea76e58fa0478.png)
23
最优解代价公式
c[i, j ]: Sij 最优解的大小 c[i, j ] = 0 if Sij = φ maxak ∈Sij {c[i, k ] + c[k, j ] + 1} if Sij = φ
School of Computer and Communication Engineer
24
活动选择问题动态规划方法
schoolcommunicationengineer一步一步构建问题的最优解决方案其中每一步只考虑眼前的最佳选择对解空间进行搜索时在局部范围内进行择优选取决定下一步搜索方向不是为了找到全部解而只是找出一种可行解在一定的情况下贪心算法找出的可行解将是最优解schoolcommunicationengineer42贪贪贪心心心算算算法法法基基基本本本要要要素素素算法包含一系列步骤每一步都有一组选择做出在当前看来最好的选择一个贪心算法是否产生最优解需要严格证明schoolcommunicationengineer最优子结构schoolcommunicationengineer贪贪贪心心心选选选择择择性性性质质质定定定义义义若若若一个优化问题的全局最优解可以通过局部最优选择得到则该问题称为具有贪贪贪心心心选选选择择择性性性
School of Computer and Communication Engineer 4
4.2 贪 心 算 法 基 本 要 素
• 算法包含一系列步骤, 每一步都有一组选择, 做出在 当前看来最好的选择 • 希望通过作出局部最优选择达到全局最优选择 • 一个贪心算法是否产生最优解, 需要严格证明
School of Computer and Communication Engineer
列举用贪心算法求解的经典问题
![列举用贪心算法求解的经典问题](https://img.taocdn.com/s3/m/caf0babf8662caaedd3383c4bb4cf7ec4afeb6e3.png)
列举用贪心算法求解的经典问题贪心算法是一种基于贪心策略的算法,它在每一步选择中采取最优的选择,从而达到全局最优的结果。
贪心算法通常求解的是最优化问题,例如最小生成树、最短路经、任务分配等问题,但并不是所有的最优化问题都可以用贪心算法解决,需要根据实际问题进行分析。
下面列举几个经典问题及其贪心算法的解法:1. 钞票找零问题这是一个典型的贪心算法问题,即如何用最少的钞票找零。
贪心算法的思路是,在每一步中选择面值最大的钞票,直到找完为止。
参考资料:- 《算法导论》第16章- 《算法竞赛入门经典》第2章2. 活动选择问题给定n个活动的起止时间,要求安排这些活动,使得尽可能多的活动能够不冲突地进行。
贪心算法的思路是,在每一次选择中选择结束时间最早的活动,因为这样可以给后面的活动留更多的时间。
参考资料:- 《算法竞赛入门经典》第3章- 《算法导论》第16章3. 背包问题将若干个物品放入一个容量为W的背包中,每个物品有自己的重量和价值。
要求在不超过容量的情况下,选择一些物品放入背包中,使得总价值最大。
贪心算法的思路是,选择价值比重量大的物品放入背包中,这样可以使得总价值最大。
参考资料:- 《算法竞赛入门经典》第4章- 《算法导论》第16章4. 最小生成树问题给定一个无向连通图,要求找到一棵生成树,使得边的权值和最小。
贪心算法的思路是,每次选择权值最小的边,加入生成树中,直到生成树包含了所有的节点。
参考资料:- 《算法竞赛入门经典》第7章- 《算法导论》第23章5. 最短路径问题给定一个有向图,求出一个节点到另一个节点的最短路径。
贪心算法的思路是,每次选择最短的路径,从起始节点开始,依次加入路径中的节点,直到到达目标节点。
参考资料:- 《算法竞赛入门经典》第8章- 《算法导论》第24章以上就是贪心算法常用的几个经典问题及其解法。
需要注意的是,贪心算法并不是对所有最优化问题都适用,需要根据具体情况进行分析和判断。
贪心算法
![贪心算法](https://img.taocdn.com/s3/m/d2301aa5dd3383c4bb4cd25b.png)
max vi xi
i 1
n
于是,背包问题归结为寻找一个满足约束条 件式,并使目标函数式达到最大的解向量X=(x1, x2, …, xn)。
至少有三种看似合理的贪心策略: (1)选择价值最大的物品,因为这可以尽可能快 地增加背包的总价值。但是,虽然每一步选择获得 了背包价值的极大增长,但背包容量却可能消耗得 太快,使得装入背包的物品个数减少,从而不能保 证目标函数达到最大。 (2)选择重量最轻的物品,因为这可以装入尽可 能多的物品,从而增加背包的总价值。但是,虽然 每一步选择使背包的容量消耗得慢了,但背包的价 值却没能保证迅速增长,从而不能保证目标函数达 到最大。 (3)选择单位重量价值最大的物品,在背包价值 增长和背包容量消耗两者之间寻找平衡。
算法
main( ) { int i,j,n,GZ,A; int B[8]={0,100,50,20,10,5,2,1},S[8]; input(n); for(i=1;i<=n;i++) { input(GZ); for(j=1,j<=7;j++) { A=GZ/B[j]; S[j]=S[j]+A; GZ=GZ-A*B[j];} } for(i=1;i<=7;i++) print(B[i], “----”, S[i]); }
∞ b 4 0 a 8 h ∞ 4 b 4 0 a 8 h 8 11 7 11 7
8 ∞ i 6 1 2
∞ c
7
∞ d 14 9 e ∞ 10
4 g ∞
2
f ∞
(a)
8 ∞ i 6 1 g ∞ 2 4 f ∞ ∞ c 7 ∞ d 14 9 e ∞ 10 2
贪心法求解活动安排问题的关键是如何选择贪心策略,使 得按照一定的顺序选择相容活动,并能安排尽量多的活动。至 少有两种看似合理的贪心策略: (1)最早开始时间:这样可以增大资源的利用率。 (2)最早结束时间:这样可以使下一个活动尽早开始。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
找硬币
假设有四种硬币,面值分别为
二角五分
一角
五分
一分
现在要找给某顾客六角三分钱,哪种找钱方法拿出 的硬币个数最少呢?
首先选出一个面值不超过六角三分的最大硬 币二,角五即分二二角角五五分分;一然角后从六一分角三分一中分 减去一二分角五 分,剩下三角八分;再选出一个面值不超过三角 八分的最大硬币,即又一个二角五分,如此一直 做下去。这种方法实际上就是贪心算法。
2020/11/17
计算机算法设计与分析
3
再找硬币
若硬币的面值改为一分、五分和一角一分3 种,而要找给顾客的是一角五分钱。
还用贪心算法,将找个顾客1个一角一分的 硬币和4个一分的硬币。
然而,3个五分的硬币显然才是最好的找法。
2020/11/17
计算机算法设计与分析
4
贪心算法的适用情形
设待求解问题有N个输入,根据必须满 足的条件和目标函数,希望从问题的所 有允许解中求出最优值。
D 60
A 300
50 E 90
2020年11月17日
B 70
A 300
C 50 80
D
E
B 70 C
D
13
最小生成树的贪心选择性质
令G中权最小的边为e1。首先必定有图G的一棵 最小生成树包含了e1。
若选G定的第任一何条最边小e1生以成后树,都该不如包何含选e择1。第设二T条为边G的呢? 最P依r小i据m生算各成法条树的边,做的e法权1:重T在。,保于依证是次连T选+通出e1是的权一前重个提较有下轻回依的路次n –的选1
2020/11/17
计算机算法设计与分析
7
煤气管道的铺设
某新建小区着手铺设煤气管道,已知每一 幢楼的接入位置和距离,请求出最短的铺 设方案。
2020年11月17日
8
最优布线问题
学校有n台计算机,为了方便数据传输, 现要将它们用数据线连接起来。两台计算 机被连接是指它们之间有数据线连接。由 于计算机所处的位置不同,因此不同的两 台计算机的连接费用往往是不同的。
2020/11/17
计算机算法设计与分析15PFra bibliotekim算法的示例
给定一个连通带权图如下:
1
6
5
2
1 55
4
3
36 4 2
56 6
初始时S={1},T= Φ; 第一二三四五次选择:
∵(13625, 3642)权最小 ∴ S={1, 3}, 6}, ,4}, ,2}, ,5},
T= {(1, 3)}, (;3, 6)}, (;6, 4)}, ; (3(2, 2, )3)(}2,;5)} ;
这种局部最优选择并不总能获得整体最优解, 但通常能获得近似最优解。
2020/11/17
计算机算法设计与分析
6
贪心算法的一般框架
GreedyAlgorithm(parameters){ 初始化; 重复执行以下的操作: 选择当前可以选择的(相容)最优解; 将所选择的当前解加入到问题的解中; 直至满足问题求解的结束条件。 }
如果G的一个子图G’是一棵包含G的所有顶点 的树,则称G’为G的生成树。
生成树的各边的权的总和称为该生成树的耗费。 在G的所有生成树中,耗费最小的生成树称为
G的最小(优)生成树。
2020/11/17
计算机算法设计与分析
11
树的基本性质
连通无回路的图G称为树。 树是点比边多一的连通图,G连通且q=p–1 。 树是点比边多一的无回路图:G无回路且q=p–1 树若添条边就有回路:G无回路,但对任意的u,
2020/11/17
计算机算法设计与分析
5
贪心算法的特点
贪心算法总是作出在当前来看是最好的选择。
就是说,贪心算法并不从整体最优上来考虑, 所作出的选择只是某种意义上的局部最优选择。
贪心法在解决问题的策略上目光短浅,只根据 当前已有的信息就做出选择,而且一旦做出了 选择,不管将来有什么结果,这个选择都不会 改变。
2020/11/17
计算机算法设计与分析
14
Prim算法
基本思想:在保证连通的前提下依次选出权重 较小的n – 1条边。
G=(V, E)为无向连通带权图,令V={1, 2, …, n}。 设置一个集合S ,初始化S = {1},T = Φ。 贪心策略:如果V–S中的顶点j与S中的某个点i
连接且(i, j) 的权重最小,于是就选择j(将j加入 S),并将(i, j) 加入T中 。 重复执行贪心策略,直至V–S为空。
第四章
贪心算法
2020/11/17
计算机算法设计与分析
1
学习要点
• 理解贪心算法的概念。 • 掌握贪心算法的基本要素 :
(1)最优子结构性质(2)贪心选择性质 • 理解贪心算法的一般理论 • 通过应用范例学习贪心设计策略。
(1)最小生成树; (2)单源最短路径; (3)旅行商问题; (4)活动安排问题; (5)最优装载问题;
2020年11月17日
9
最优通信网
若要在n个城市之间建设通信网络,只需 要架设n-1条线路即可。如何以最低的经 济代价建设这个通信网,是一个网的最 小生成树问题。
2020年11月17日
10
最小生成树
设G = (V, E)是一个无向连通带权图,即一个网 络。E的每条边(v, w)的权为c[v][w]。
v∈V(G),若uvE(G),则G+uv中恰有一条回路 树若减条边就不连通:G连通,但对e∈E(G),
G–e不连通。 n个顶点的连通图的生成树含有n – 1条边。
2020/11/17
计算机算法设计与分析
12
实例
A 300
50 80 200
E 90
B 70
A
75
C 50 80
D 60
E
B 70 C
图出条且权边该重。回较这路小n –中的1包n条–含边1e条必1。边定该(包回在括路实了中现G必的中有n体个条现顶不为点是n。个e1这 的顶样边点就e的得i。选到令择了T)G’=的{。T一+e棵1}最–e小i。生T’成也树是。G的生成树。
又c矛K次不 要 是这(Trc盾选行 保 连u’样()sT。≤k择! 证 通’做ca)故(l权因 这 的=算T是)必c重为 或n,法(否T–定较不者T的)1’可有+小能是条是做c图以的保无边G(法e的G1n证回构呢:)的–最–这路成在?1最c小条的n(树保e小生–i边。,证),生1成。必条无c成树(须边回e树1且使)构路包≤含这成的c含有(n树前e了i边–)?提,e1e1条下从1。。边依而