贪心算法PPT课件
合集下载
贪心PPT课件
![贪心PPT课件](https://img.taocdn.com/s3/m/1c35b85131126edb6f1a10a5.png)
方法如下:先将单位块收益按从大到小进行排列,然后 用循环从单位块收益最大的取起,直到不能取为止便得到了 最优解。
【问题2】0/1背包问题
给定一个最大载重量为M的卡车和N种动物。已知第i种动 物的重量为Wi,其最大价值为Vi,设定M,Wi,Vi均为整 数,编程确定一个装货方案,使得装入卡车中的所有动物 总价值最大。
给定一个最大载重量为M的卡车和N种食品,有食盐,白 糖,大米等。已知第i种食品的最多拥有Wi公斤,其商品 价值为Vi元/公斤,编程确定一个装货方案,使得装入卡车 中的所有物品总价值最大。
【分析】因为每一个物品都可以分割成单位块,单位块的利 益越大,显然总收益越大,所以它局部最优满足全局最优, 可以用贪心法解答。
6 5 3 7 1 9 10 【样例输出】 90
【思路点拨】假设取水的人按照1...n的顺序排列的,那么问题就转 化为求以下公式的最小值:
Total=T1+(T1+T2)+(T1+T2+T3)+...+(T1+T2+...+Tn),对公式换个 写法:
Total=nT1+(n-1)T2+(n-2)T3...+2Tn-1+Tn 现在你是否发现一点什么呢?
【分析】按贪心法:每次选价格最大的装载。很明显有反例: 设N=3,卡车最大载重量是100,三种动物A、B、C的重量分别 是40,50,70,其对应的总价值分别是80、100、150。
三、贪心策略与其他算法的区别
1.贪心与递推:与递推不同的是,贪心法中推进的每一步 不是依据某一固定的递推式,而是当前看似最佳的贪心决 策,不断的将问题归纳为更加小的相似的子问题。所以归 纳、分析、选择正确合适的贪心策略,是正确解决贪心问 题的关键。
【问题2】0/1背包问题
给定一个最大载重量为M的卡车和N种动物。已知第i种动 物的重量为Wi,其最大价值为Vi,设定M,Wi,Vi均为整 数,编程确定一个装货方案,使得装入卡车中的所有动物 总价值最大。
给定一个最大载重量为M的卡车和N种食品,有食盐,白 糖,大米等。已知第i种食品的最多拥有Wi公斤,其商品 价值为Vi元/公斤,编程确定一个装货方案,使得装入卡车 中的所有物品总价值最大。
【分析】因为每一个物品都可以分割成单位块,单位块的利 益越大,显然总收益越大,所以它局部最优满足全局最优, 可以用贪心法解答。
6 5 3 7 1 9 10 【样例输出】 90
【思路点拨】假设取水的人按照1...n的顺序排列的,那么问题就转 化为求以下公式的最小值:
Total=T1+(T1+T2)+(T1+T2+T3)+...+(T1+T2+...+Tn),对公式换个 写法:
Total=nT1+(n-1)T2+(n-2)T3...+2Tn-1+Tn 现在你是否发现一点什么呢?
【分析】按贪心法:每次选价格最大的装载。很明显有反例: 设N=3,卡车最大载重量是100,三种动物A、B、C的重量分别 是40,50,70,其对应的总价值分别是80、100、150。
三、贪心策略与其他算法的区别
1.贪心与递推:与递推不同的是,贪心法中推进的每一步 不是依据某一固定的递推式,而是当前看似最佳的贪心决 策,不断的将问题归纳为更加小的相似的子问题。所以归 纳、分析、选择正确合适的贪心策略,是正确解决贪心问 题的关键。
数据结构与算法 贪婪法PPT课件
![数据结构与算法 贪婪法PPT课件](https://img.taocdn.com/s3/m/6ac94f89a98271fe900ef9a0.png)
算法步骤 1. 边 E 排序:权重递增排序,带权图 G = <V, E, W> 2. 初始化边集 ET 为空(初始子图) 3. 从 E 中取下一条边 e = {u, v}(贪婪), E ← E - {e} 4. 若 Find(u)≠Find(v) , 执行 Union(u,v):ET ← ET∪{e} 5. 若 |ET| ≤n-1,转3;否则,算法结束 Find(u) 找 u 所在树的根。Union(u,v) 合并u、v 所在的树:e 加入 ET Find(u)≠Find(v):u、v 所在树的根不同, u、v 不属于同一棵树, e 加入 ET 后不会形成回路! 思考:最小生成树有多少条边?(n 个节点)
4
5
6
453
2
2
6
把5子树的根与6子树的根用一条有向边相连成为一棵树,即完成两个 集合的合并,理解为原无向边 {1,3} 加入5子树。
西华大学数学与计算机学院 黄襄念
Union 操作规则: 考虑Find操作,如果树高越大,则Find操作的键比较次数就会增加。 上例Union操作没考虑这点,明显的缺点是Union后树高可能会变得 很大(想想:为什么?),最坏情况下树变成线性表(链表),Find 操作成为线性效率Ω(n)而非对数级。例如:集合{1}, {2}, {3}, {4}, {5} 的一种合并过程如图,最后得到一条线性链。需避免此种情况出现。
西华大学数学与计算机学院 黄襄念
3. 算法停止:全部顶点都包含于树中。 每次只扩展一个顶点,扩展次数 = |V|-1 = n-1
PrimMST (G) // 输入图 G = <V, E>,生成树 T = <VT, ET>
VT {v0 }
// 任选顶点v0 作为初始生成树
4
5
6
453
2
2
6
把5子树的根与6子树的根用一条有向边相连成为一棵树,即完成两个 集合的合并,理解为原无向边 {1,3} 加入5子树。
西华大学数学与计算机学院 黄襄念
Union 操作规则: 考虑Find操作,如果树高越大,则Find操作的键比较次数就会增加。 上例Union操作没考虑这点,明显的缺点是Union后树高可能会变得 很大(想想:为什么?),最坏情况下树变成线性表(链表),Find 操作成为线性效率Ω(n)而非对数级。例如:集合{1}, {2}, {3}, {4}, {5} 的一种合并过程如图,最后得到一条线性链。需避免此种情况出现。
西华大学数学与计算机学院 黄襄念
3. 算法停止:全部顶点都包含于树中。 每次只扩展一个顶点,扩展次数 = |V|-1 = n-1
PrimMST (G) // 输入图 G = <V, E>,生成树 T = <VT, ET>
VT {v0 }
// 任选顶点v0 作为初始生成树
贪婪法PPT课件
![贪婪法PPT课件](https://img.taocdn.com/s3/m/c01e17b46c85ec3a87c2c5ec.png)
❖例如,如果一套钱币设计合理,则最 小兑现问题就满足贪婪选择性质
2.2 最优子结构性质
❖最优子结构是指:一个问题的最优解 中包含它的子问题的最优解
❖例如,用合理的一套钱币实现最小兑 现问题,就满足最优子结构性质
❖当钱币面值是10、5、1时,要兑现26, 则可以用{10、10、5、1}实现。第一步 实现(取10)后,剩余问题的最优解是 {10、5、1},是整个问题最优解的子集, 满足最优子结构性质
2. 贪婪法要满足的性质
用贪婪法解决问题时,并不能保证它能找到最 优解。但是,当问题满足下面两个性质时,贪 婪法可以找到问题的最优解。
2.1 贪婪选择性质 2.2 最优子结构性质
2.1 贪婪选择性质
❖贪婪选择性质是指:所求问题的全局 最优解,可以通过一系列的局部最优的 选择来达到
❖每进行一次选择,就得到一个局部的 解,并把所求解的问题简化为一个规模 更小的类似子问题
对任务3,找到当前花费最小的人员b∊{b, d}; -- 10
对任务4,找到当前花费最小的人员d∊{d}; -- 14
贪婪法解决任务分配问题的时间复杂度是O(n2)
4. 贪婪法完全成功解决的例子
4.1 连续背包问题 4.2 单源最短路径问题 4.3 Kruskal算法求解最小生成树 4.4 Prim算法求解最小生成树 4.5 钓鱼问题
❖三个贪心算法的复杂度都是O(nlogn),都不能确保 求得最优解
3.4 任务分配问题
任务1 9 6 5 7
任务2 2 4 8 6
任务3 7 3 1 9
任务4 8 7 8 4
人员a 人员b 人员c 人员d
对任务1,找到当前花费最小的人员c∊{a, b, c, d};--5
对任务2,找到当前花费最小的人员a∊{a, b, d}; -- 7
2.2 最优子结构性质
❖最优子结构是指:一个问题的最优解 中包含它的子问题的最优解
❖例如,用合理的一套钱币实现最小兑 现问题,就满足最优子结构性质
❖当钱币面值是10、5、1时,要兑现26, 则可以用{10、10、5、1}实现。第一步 实现(取10)后,剩余问题的最优解是 {10、5、1},是整个问题最优解的子集, 满足最优子结构性质
2. 贪婪法要满足的性质
用贪婪法解决问题时,并不能保证它能找到最 优解。但是,当问题满足下面两个性质时,贪 婪法可以找到问题的最优解。
2.1 贪婪选择性质 2.2 最优子结构性质
2.1 贪婪选择性质
❖贪婪选择性质是指:所求问题的全局 最优解,可以通过一系列的局部最优的 选择来达到
❖每进行一次选择,就得到一个局部的 解,并把所求解的问题简化为一个规模 更小的类似子问题
对任务3,找到当前花费最小的人员b∊{b, d}; -- 10
对任务4,找到当前花费最小的人员d∊{d}; -- 14
贪婪法解决任务分配问题的时间复杂度是O(n2)
4. 贪婪法完全成功解决的例子
4.1 连续背包问题 4.2 单源最短路径问题 4.3 Kruskal算法求解最小生成树 4.4 Prim算法求解最小生成树 4.5 钓鱼问题
❖三个贪心算法的复杂度都是O(nlogn),都不能确保 求得最优解
3.4 任务分配问题
任务1 9 6 5 7
任务2 2 4 8 6
任务3 7 3 1 9
任务4 8 7 8 4
人员a 人员b 人员c 人员d
对任务1,找到当前花费最小的人员c∊{a, b, c, d};--5
对任务2,找到当前花费最小的人员a∊{a, b, d}; -- 7
第5章 贪心法
![第5章 贪心法](https://img.taocdn.com/s3/m/ea72357702768e9951e73886.png)
5.1 引言
三、背包问题
1.背包问题 给定一个承重量为C的背包,n个重量分别为 w1,w2,…,wn的物品。已知物品i放入背包能产生vi的价 值(放入单位重量的物品i,产生的价值为vi/wi), i=1,2,…,n。如何装包才能获得最大价值? 实际上,就是要求找到一组非负且不超过1的实数
x1,x2,…,xn满足∑xiwi≤C,且使得∑xivi达到最大值。
三、背包问题
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;
5.1 引言
算法knapsack的 主要计算时间在于将 各种物品依其单位重 量的价值从大到小排 序。因此,算法的计 算时间上界为 O(nlogn)。 为了证明算法的正确 性,还必须证明背包 问题具有贪心选择性 质。
5.1 引言
三、背包问题
3.求解思想 贪心准则2——根据物品的重量由小到大来放。
从剩下的物品中选择可装入背包的重量最小的物品。 虽然这种规则对于前面的例子能产生最优解,但在一般 情况下则不一定能得到最优解。 (由上面实例可知,它不是最优贪心准则)
5.1 引言
三、背包问题
3.求解思想 贪心准则3——根据价值/重量(即单位价值)由大 到小来放。 每一项计算yi=vi/Wi,即该项值和大小的比,再按 比值的降序来排序,从第一项开始装背包,然后是第二 项,依次类推。尽可能的多放,直到装满背包。 (可以证明它是最优贪心准则)
5.2单源最短路问题
五、Dijkstra算法
算法中图使用邻接表表示,其示意图如下。
五大常用算法ppt课件
![五大常用算法ppt课件](https://img.taocdn.com/s3/m/6adbe04b854769eae009581b6bd97f192279bf01.png)
桥了。
A B→ 2 A←1
AC → 5 A←1
AD → 8
一共就是2+1+5+1+8=17分钟。
Your company slogan
贪心算法
但其实有更快的办法: AB→2 A←1 CD→8 B←2 AB→2
一共是2+1+8+2+2=15分钟。这个办法的聪明之处在于让两个走得最慢的人同时过桥, 这样花去的时间只是走得最慢的那个人花的时间,而走得次慢的那位就不用另花时间过 桥了。可以把所有可能的方案都列举一遍,就会发现这是最快的方案了。
Your company slogan
贪心算法
2015年周得水等人提出一种基于Dijkstra的贪心算法来实现模糊连接度的快速计算。 基于模糊连接度的图像分割过程如下: (1)由用户在图像中选取种子点; (2)计算图像中各点相对于种子点的模糊连接度,同时得到各点到种子点的最优路径; (3)对得到的最优路径进行各点相对于种子点的属性相似度计算,同时得到图像中各点新 的隶属度; (4)用户通过选取阈值来分割图像。
1. if |P|≤n0
2. then return(ADHOC(P)) 3. 将P分解为较小的子问题 P1 ,P2 ,...,Pk
4. for i←1 to k 5. do yi ← Divide-and-Conquer(Pi) △ 递归解决Pi 6. T ← MERGE(y1,y2,...,yk) △ 合并子问题
后将各子问题的解合并得到原问题的解。(分治与递归)
适用情况: 1) 该问题的规模缩小到一定的程度就可以容易地解决; 2) 该问题可以分解为若干个规模较小的相同问题,即该问题具有最优子结构性质; 3) 利用该问题分解出的子问题的解可以合并为该问题的解; 4) 该问题所分解出的各个子问题是相互独立的,即子问题之间不包含公共的子子问题。
贪心算法(陈鹏)
![贪心算法(陈鹏)](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、动态规划 第二种解决此类问题的方法是动态规划。当然,使用 动态规划必须要满足一些条件,如无后效性和最优子结构 等等。
背包问题的贪心算法20页PPT文档
![背包问题的贪心算法20页PPT文档](https://img.taocdn.com/s3/m/0bdb315b8bd63186bcebbcb9.png)
,
则用j比i好,∵装入A, V i 2 ;而装入B,Vi=3
对例。4.3的数据使用按效益值的非增次序的选择策略.
V 125,X 11 ,W 118 背包剩:C-18=2;物品2有次大效益值
(V2=24 )但w2=15,背包装不下物品2。使用 x2=2/15,刚好装满背
包
6
,且物品2的24/15 = v2/w2 较物品3的15/10= v3/w3效益值高。按 此选择策略,得②即(1, 2/15, 0),∑vixi=28.2 .此解是一个次优解。 显然,按物品效益值的非增次序装包不能得最优解。
背包问题:
与0-1背包问题类似,所不同的是在选择物品i装入背包时 ,可以选择物品i的一部分,而不一定要全部装入背包, 1≤i≤n。
这2类问题都具有最优子结构性质,极为相似,但背 包问题可以用贪心算法求解,而0-1背包问题却不能用 贪心算法求解。
2
例4.3 贪心算法不能求得0-1背包问题得最优解。
考虑背包问题: n=3,c=50kg,(v1,v2,v3)=(60,100,120), (w1,w2,w3)=(10,20,30). vi/wi=(6,5,4).贪心算法解是(1,1,0), ∑vixi=60+100 , ∑wixi=30;最优解是(0,1,1), ∑vixi=100+120, ∑wixi=50,
实际上,动态规划算法的确可以有效地解0-1背包问题。
3
4.2 背包问题
已知有n种物品和一个可容纳c重量的背包,每种物品i的
重量为wi。假定物品i的一部分放入背包会得到vixi的效益。其
中0≤xi≤1,vi>0 . 采用怎样的装包方法才会使装入背包物品的总
效益最大呢?即求解 n
则用j比i好,∵装入A, V i 2 ;而装入B,Vi=3
对例。4.3的数据使用按效益值的非增次序的选择策略.
V 125,X 11 ,W 118 背包剩:C-18=2;物品2有次大效益值
(V2=24 )但w2=15,背包装不下物品2。使用 x2=2/15,刚好装满背
包
6
,且物品2的24/15 = v2/w2 较物品3的15/10= v3/w3效益值高。按 此选择策略,得②即(1, 2/15, 0),∑vixi=28.2 .此解是一个次优解。 显然,按物品效益值的非增次序装包不能得最优解。
背包问题:
与0-1背包问题类似,所不同的是在选择物品i装入背包时 ,可以选择物品i的一部分,而不一定要全部装入背包, 1≤i≤n。
这2类问题都具有最优子结构性质,极为相似,但背 包问题可以用贪心算法求解,而0-1背包问题却不能用 贪心算法求解。
2
例4.3 贪心算法不能求得0-1背包问题得最优解。
考虑背包问题: n=3,c=50kg,(v1,v2,v3)=(60,100,120), (w1,w2,w3)=(10,20,30). vi/wi=(6,5,4).贪心算法解是(1,1,0), ∑vixi=60+100 , ∑wixi=30;最优解是(0,1,1), ∑vixi=100+120, ∑wixi=50,
实际上,动态规划算法的确可以有效地解0-1背包问题。
3
4.2 背包问题
已知有n种物品和一个可容纳c重量的背包,每种物品i的
重量为wi。假定物品i的一部分放入背包会得到vixi的效益。其
中0≤xi≤1,vi>0 . 采用怎样的装包方法才会使装入背包物品的总
效益最大呢?即求解 n
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
中科院陈玉福算法课件ch4ppt
![中科院陈玉福算法课件ch4ppt](https://img.taocdn.com/s3/m/d49c4bdb80eb6294dd886c93.png)
第四章 贪心算法
算法基本思想 调度问题 最小生成树问题 单点源最小路径问题 Huffman编码
贪心算法的基本思想
找零钱:给孩子找回87分硬币,现有硬币规格50分、10分、 5分、2分、1分。 50+3*10+5+2=87 一般方法:尽量找面值大的硬币。 装箱问题:有物品n件,重量分别是 w1,…,wn ; 有箱子m个: B1,…,Bm,每个的容量都是C(C≥wi)。设计装箱方法,使得 所用箱子最少。 1. NF(Next Fit)方法:前面的箱子不能再装了,才开始装下一 个箱子。 2. FF(First Fit)方法:每个物品都选择装进第一个可装的箱子 贪心算法的基本思想: 在每一步决策中总是作出在当前看来是最好的选择 贪心准则,局部最优。
=1≤iΒιβλιοθήκη ≤n∑ pyi i
贪心算法抽象控制流程
proc Greedy(A, n) // A[1:n]代表输入 solution={}; //解初始化为空集 for i to n do x:=Select(A); if Feasible(solution, x) then solution:=Union(solution, x); end{if} end{for} return(solution); end{Greedy} Select(A)是按照贪心 准则选取A中的输入 项; Feasible(solution, x)是 判断已知的解的部分 solution与新选取的x 的结合是否是可行 解。 Union(solution, x)x与 已经选到的部分 solution结合成解的更 大部分
GreedyJob获得最优解
假设贪心算法所选择的作业集J不是最优解,则一定有相容作 业集I,其产生更大的效益值。假定I是具有最大效益值的相容作 业集中使得|I∩J|最大者,往证 I=J。 反证法:若I=J 不成立,则这两个作业集合之间没有包含关 系。这是因为算法GreedyJob的特性和假定I 产生的效益值比J的 效益值更大。假设a是J\I中具有最大效益的作业,即J中比a具有 更大效益的作业(如果有的话)都应该在 I 中。如果作业 b∈I\J 且 pb>pa,那么由算法中对J中作业的选取办法(相容性要求),J中 至少有 fb个效益值≥pb的作业,其期限值≤ fb。这些作业一定在 I 中,因而 I 中至少有个fb+1作业,其期限值≤ fb ,这与 I 的相容性 矛盾。所以,I\J中事件的效益值均不超过pa。 称区间[k-1,k]为时间片k,相容作业集 I 的一个调度表就是指定 I 中各个作业的加工时间片。如果 I 有一个调度表 S 将时刻 fa前 的时间片均安排给I∩J中的作业,且I\J中最早被安排的是作业b, 在时间片k上,则k>fa。
算法基本思想 调度问题 最小生成树问题 单点源最小路径问题 Huffman编码
贪心算法的基本思想
找零钱:给孩子找回87分硬币,现有硬币规格50分、10分、 5分、2分、1分。 50+3*10+5+2=87 一般方法:尽量找面值大的硬币。 装箱问题:有物品n件,重量分别是 w1,…,wn ; 有箱子m个: B1,…,Bm,每个的容量都是C(C≥wi)。设计装箱方法,使得 所用箱子最少。 1. NF(Next Fit)方法:前面的箱子不能再装了,才开始装下一 个箱子。 2. FF(First Fit)方法:每个物品都选择装进第一个可装的箱子 贪心算法的基本思想: 在每一步决策中总是作出在当前看来是最好的选择 贪心准则,局部最优。
=1≤iΒιβλιοθήκη ≤n∑ pyi i
贪心算法抽象控制流程
proc Greedy(A, n) // A[1:n]代表输入 solution={}; //解初始化为空集 for i to n do x:=Select(A); if Feasible(solution, x) then solution:=Union(solution, x); end{if} end{for} return(solution); end{Greedy} Select(A)是按照贪心 准则选取A中的输入 项; Feasible(solution, x)是 判断已知的解的部分 solution与新选取的x 的结合是否是可行 解。 Union(solution, x)x与 已经选到的部分 solution结合成解的更 大部分
GreedyJob获得最优解
假设贪心算法所选择的作业集J不是最优解,则一定有相容作 业集I,其产生更大的效益值。假定I是具有最大效益值的相容作 业集中使得|I∩J|最大者,往证 I=J。 反证法:若I=J 不成立,则这两个作业集合之间没有包含关 系。这是因为算法GreedyJob的特性和假定I 产生的效益值比J的 效益值更大。假设a是J\I中具有最大效益的作业,即J中比a具有 更大效益的作业(如果有的话)都应该在 I 中。如果作业 b∈I\J 且 pb>pa,那么由算法中对J中作业的选取办法(相容性要求),J中 至少有 fb个效益值≥pb的作业,其期限值≤ fb。这些作业一定在 I 中,因而 I 中至少有个fb+1作业,其期限值≤ fb ,这与 I 的相容性 矛盾。所以,I\J中事件的效益值均不超过pa。 称区间[k-1,k]为时间片k,相容作业集 I 的一个调度表就是指定 I 中各个作业的加工时间片。如果 I 有一个调度表 S 将时刻 fa前 的时间片均安排给I∩J中的作业,且I\J中最早被安排的是作业b, 在时间片k上,则k>fa。
全国信息技术优质课课件—利用贪心算法解决最短路径问题
![全国信息技术优质课课件—利用贪心算法解决最短路径问题](https://img.taocdn.com/s3/m/e175238b89eb172ded63b7a9.png)
每次优先选取离出发点 距离最近的点,然后在以该 点为基础,更改出发点到其 它各顶点的距离,通过比较, 逐步找到从出发点到终点的 最短路径。
介绍算法,布置任务,建模推导
✓ 设计意图:布置任务,利用贪心算法模拟物流机器人如何自主找到从公司到客户家的 最短路径?
请你利用贪心算法模拟 物流机器人 如 何 自 主 找到 从公司到客户 家 的最短路 径?
xx
20 1 9
目录
1 说教材 2 说学情 3 说教学目标 4 说教学重难点 5 说教法学法 6 说教学过程
01
➢ 教材版本:上海科技教育出版社高中信息技术 选修《算法与程序设计》第一章第二节《算法 的作用》
➢ 主要内容:运用算法解决问题
➢ 地位与联系:承上启下
02
高二 学生
1 初步了解了算法和程序的知识 2 具备一定的抽象思维和逻辑推理能力 3 缺少利用算法解决实际问题的经验
01 这么多条路啊? 02 选那一条? 03 选最短的吧,省时间
最
从起点到达终点,
短 所有路径中边值总和最
路 径
小的路径。
导入新课
✓ 设计意图:紧接着向学生展示最短路径在人工智能、网络通信、物流快递等领域的应用, 介绍研究最短路径问题的意义,激发学生学习的热情。
01 节省时间
02 节省成本
03 提高效率
最短 路径
利用贪心
算法解决 最短路径
作业:有哪些解决最短路径的算法?各自的优缺点?
算法名称
原理
优点 缺点
贪心 算法
板书设计
利用贪心算法解决最短路径问题
1、最短路径定义。 2、贪心算法的概念。 3、利用贪心算法解决最短路径问题的
步骤。 4、总结。
计算机语言程序设计教学课件第6章 贪心算法
![计算机语言程序设计教学课件第6章 贪心算法](https://img.taocdn.com/s3/m/cc8c2f4b3c1ec5da50e270a6.png)
因此,利用贪心策略解题,需要解决两个问题: 首先,确定问题是否能用贪心策略求解;一般来说,适用于贪心策略 求解的问题具有以下特点: ①可通过局部的贪心选择来达到问题的全局最优解。运用贪心策略解 题,一般来说需要一步步的进行多次的贪心选择。在经过一次贪心选择之 后,原问题将变成一个相似的,但规模更小的问题,而后的每一步都是当 前看似最佳的选择,且每一个选择都仅做一次。 ②原问题的最优解包含子问题的最优解,即问题具有最优子结构的性 质。在背包问题中,第一次选择单位重量价值最大的货物,它是第一个子 问题的最优解,第二次选择剩下的货物中单位重量价值最大的货物,同样 是第二个子问题的最优解,依次类推。 ③其次,如何选择一个贪心标准?正确的贪心标准可以得到问题的最 优解,在确定采用贪心策略解决问题时,不能随意的判断贪心标准是否正 确,尤其不要被表面上看似正确的贪心标准所迷惑。在得出贪心标准之后 应给予严格的数学证明。
【例2】部分背包问题 给定一个最大载重量为M的卡车和N种食品,有食盐,白糖,大米等。已知 第i种食品的最多拥有Wi公斤,其商品价值为Vi元/公斤,编程确定一个装货方案, 使得装入卡车中的所有物品总价值最大。 【算法分析】
因为每一个物品都可以分割成单位块,单位块的利益越大显然总收益越大,所以它 局部最优满足全局最优,可以用贪心法解答,方法如下:先将单位块收益按从大到小进 行排列,然后用循环从单位块收益最大的取起,直到不能取为止便得到了最优解。 因此我们非常容易设计出如下算法:
下面来看看0-1背包问题。 给定一个最大载重量为M的卡车和N种动物。已知第i种动物的重量为Wi, 其最大价值为Vi,设定M,Wi,Vi均为整数,编程确定一个装货方案,使得装 入卡车中的所有动物总价值最大。 【分析】对于n种动物,要么被装,要么不装,也就是说在满足卡车载重的 条件下,如何选择动物,使得动物价值最大的问题。 即确定一组x1,x2,…,xn, xi∈{0,1} f(x)=max(∑xi*vi) 其中,∑(xi*wi)≦w 从直观上来看,我们可以按照上例一样选择那些价值大,而重量轻的动物。 也就是可以按价值质量比(vi/wi)的大小来进行选择。可以看出,每做一次选 择,都是从剩下的动物中选择那些vi/wi最大的,这种局部最优的选择是否能满 足全局最优呢?我们来看看一个简单的例子: 设n=3,卡车最大载重量是100,三种动物a、b、c的重量分别是40,50, 70,其对应的总价值分别是80、100、150。 情况a:按照上述思路,三种动物的vi/wi分别为2,2,2.14。显然,我们首先 选择动物c,得到价值150,然后任意选择a或b,由于卡车最大载重为100,因 此卡车不能装载其他动物。 情况b:不按上述约束条件,直接选择a和b。可以得到价值80+100=180, 卡车装载的重量为40+50=90。没有超过卡车的实际载重,因此也是一种可行 解,显然,这种解比上一种解要优化。
贪心算法
![贪心算法](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)。
且有||B’-{k}||>||B-{1}||,这与假设2°矛盾。 ▌
安排方案
f1
B
安排方案
fk
B’
…… 共j个活动
可能 相同 不存在
……
可能
如果 B’包 含这 个活, 则B 一定 包含
9
(2) 时间复杂度分析: 因为排序过程可以在O(nlogn)时间内完成,而求最优活动子 集的过程只需O(n)次比较,因此这个算法的时间复杂度为 O(nlogn)。 (3) 贪心策略设计算法的一般特点
·选Si最小的,这样可以增大场地的利用率; ·选fi最小的,使得下一个活动可以更早开始。
由于活动的占用时间长度没有限制,因此后一选择更合理。
6
为了在每一次选择时取当前可以安排的活动中最早结束的活动,应首先把 n项活动按结束时间的先后进行升序排序。即,使f1≤f2≤…≤fn,然后在Si值 不小于当前时刻的活动中取fi值最小者。 算法:
·算法的设计比较简单; ·算法一般比较快速; ·算法的正确性一般不明显,需要论证;如果正确性不能保 证,那么它往往可以得到近似最优解。
10
5.2 背包(Knapsack)问题
1. 问题描述
已知:n个(应为n种)物体{1,2,…,n}与一个背包。物体i的重量 (或体积)为Wi>0,价值为Pi>0(i=1,2,…,n),背包容量为 M>0。
计算机算法 ——设计与分析导论
刘璟
1
Chapter 5. 贪心(Greedy)技术
❖ 5.1 贪心策略的思想 ❖ 5.2 背包(Knapsack)问题 ❖ 5.3 Huffman编码 ❖ 5.4 多机调度问题的近似解法 ❖ 5.5 单源最短路径的Dijkstra算法
2
5.1 贪心策略的思想
❖5.1.1 付款问题
>>>>>(图着色等问题)
❖5.1.3 贪心算法的基本思想
贪心算法把一个整体最优问题分解为一系列的最优选择问题, 但结果一般为近似最优。另一方面,贪心算法一般都比较简 单,计算量小。它具有两种性质:贪心选择性质和最优子结 构性质 。
4
1. 贪心选择(Greedy-choice)性质 整体最优解可以通过一系列局部最优的选择来完成(即贪心选 择过程)。 2. 最优子结构(Optimal substructure)性质 整体最优解中包含子问题的最优解 或:问题解的整体最优性依赖于其局部子问题解的最优性。
(1) 对活动集A中的活动按fi值排序(胜序), 得到数组S[1..n],f[1..n],其中f[1]≤f[2]≤…≤f[n];
(2) 集合B={1};j=1;i=2;//活动1肯定被选 (3) if(S[i]>=f[j]){ B+={i};j=i;} (4) i++;if(i<=n) goto (3); (5) end。 实例:设n=11,经过对结束时间按升序排序之后,S[1..n]和f[1..n]的值为:
8
2°设||A||<n时,算法正确;(由此可知,B-{1}是A’的最优活动子集) 3°用反证法证明算法对||A||=n时正确:(要证明B’中开始的活动不为1,且B’中所含的 活动次要多于B中的活动数) 设:又存在最优活动子集B’={k,…}(k>1)且||B’||>||B||。因为f(1)≤f(k),故B’-{k}也 是A’的相容活动子集,
i
1 2 3 4 5 6 7 8 9 10 11
S[i]
1 3 0 5 3 5 6 8 8 2 13
f[i]
4 5 6 7 8 9 10 11 12 13 14
经计算,被选的活动集合B={1,4,8,11}。
7
4. 讨论 (1) 正确性:上述算法可转为下面的递推过程:
为证明算法的正确性,只需说明活动1肯定包含在最优活动子 集B中即可,可以用归纳法证明。 f1最小 1°n=1时,A={1},B={1},算法正确;
求:n元向量(X1,X2,…Xn),0≤Xi≤1(i=1,2,…,n),(Xi为第i种物 体被装包的比例)使得
n
n
WiXi M 且
P i X i 达到最大。
i1
i1
2. 解题思路
假定n种物体的总重量大于M。因此,算法的任务是要从n种 物体中选择一部分放入背包,以达到总价值最大的目标。 11
一个简单实例: 设:n=3,M=50,W=(W1,W2,W3)=(20,30,10), P=(P1,P2,P3)=(100,120,60),其不同装法的总重量如Fig.5.2。
5
求解:安排尽量多项活动在该场地进行,即求A的最大相容子 集。这里的相容(mutually compatible)指活动的时间不相重 叠。即活动i,j相容,当且仅当时间区间 [Si,fi]与[Sj,fj]不相交, 即必须有Si≥fj或Sj≥fi成立。 思路:如果希望安排尽量多的活动,显然这里的贪心选择可 以有两种不同的处理:
3. 活动安排(Activity Selection)问题 问题:有n种活动(例如报告、会议)的集合A={1,2,…n},都需 要占用某场地(报告厅或会议室),该场地同一时间只能安 排一项活动。(也是一种调度问题,尽可能接多个定单) 已知:活动i需要在时间段[Si,fi]占用该场地,其中Si与fi是活动 i占用的起始时间和结束时间,且Si<fi(i=1,2,…n)。
已知:现有的钞票面额和付款额
int m[ ]={ 5000, 2000, 1000, 500, 200, 100, 50, 20, 10, 5, 2, 1}; int V; (可以由操作者输入) 输出:各种币值的钞票数int n[12];
12
12
使得 n[i]m[i] V 且 n [ i题的贪心算法Pay
(实际应用中,只是尽可能最少,但不一定最少)
最小。
3
❖5.1.2 铺砖问题
有若干不同规格的砖,要铺满一块平台,总是希望用较少的 砖。例如,有三种规格的砖:2×2、0.8×0.8、0.1×0.1,要 铺满2.5×2.5(m2)的平面。 采用贪心策略,需一块2×2的大砖及25×5+20×5=225块 0.1×0.1小砖。显然这不是最优解,用9块0.8×0.8的中砖加上 49块0.1×0.1的小砖就可以了,需58块,小于贪心法的结果 226块。
安排方案
f1
B
安排方案
fk
B’
…… 共j个活动
可能 相同 不存在
……
可能
如果 B’包 含这 个活, 则B 一定 包含
9
(2) 时间复杂度分析: 因为排序过程可以在O(nlogn)时间内完成,而求最优活动子 集的过程只需O(n)次比较,因此这个算法的时间复杂度为 O(nlogn)。 (3) 贪心策略设计算法的一般特点
·选Si最小的,这样可以增大场地的利用率; ·选fi最小的,使得下一个活动可以更早开始。
由于活动的占用时间长度没有限制,因此后一选择更合理。
6
为了在每一次选择时取当前可以安排的活动中最早结束的活动,应首先把 n项活动按结束时间的先后进行升序排序。即,使f1≤f2≤…≤fn,然后在Si值 不小于当前时刻的活动中取fi值最小者。 算法:
·算法的设计比较简单; ·算法一般比较快速; ·算法的正确性一般不明显,需要论证;如果正确性不能保 证,那么它往往可以得到近似最优解。
10
5.2 背包(Knapsack)问题
1. 问题描述
已知:n个(应为n种)物体{1,2,…,n}与一个背包。物体i的重量 (或体积)为Wi>0,价值为Pi>0(i=1,2,…,n),背包容量为 M>0。
计算机算法 ——设计与分析导论
刘璟
1
Chapter 5. 贪心(Greedy)技术
❖ 5.1 贪心策略的思想 ❖ 5.2 背包(Knapsack)问题 ❖ 5.3 Huffman编码 ❖ 5.4 多机调度问题的近似解法 ❖ 5.5 单源最短路径的Dijkstra算法
2
5.1 贪心策略的思想
❖5.1.1 付款问题
>>>>>(图着色等问题)
❖5.1.3 贪心算法的基本思想
贪心算法把一个整体最优问题分解为一系列的最优选择问题, 但结果一般为近似最优。另一方面,贪心算法一般都比较简 单,计算量小。它具有两种性质:贪心选择性质和最优子结 构性质 。
4
1. 贪心选择(Greedy-choice)性质 整体最优解可以通过一系列局部最优的选择来完成(即贪心选 择过程)。 2. 最优子结构(Optimal substructure)性质 整体最优解中包含子问题的最优解 或:问题解的整体最优性依赖于其局部子问题解的最优性。
(1) 对活动集A中的活动按fi值排序(胜序), 得到数组S[1..n],f[1..n],其中f[1]≤f[2]≤…≤f[n];
(2) 集合B={1};j=1;i=2;//活动1肯定被选 (3) if(S[i]>=f[j]){ B+={i};j=i;} (4) i++;if(i<=n) goto (3); (5) end。 实例:设n=11,经过对结束时间按升序排序之后,S[1..n]和f[1..n]的值为:
8
2°设||A||<n时,算法正确;(由此可知,B-{1}是A’的最优活动子集) 3°用反证法证明算法对||A||=n时正确:(要证明B’中开始的活动不为1,且B’中所含的 活动次要多于B中的活动数) 设:又存在最优活动子集B’={k,…}(k>1)且||B’||>||B||。因为f(1)≤f(k),故B’-{k}也 是A’的相容活动子集,
i
1 2 3 4 5 6 7 8 9 10 11
S[i]
1 3 0 5 3 5 6 8 8 2 13
f[i]
4 5 6 7 8 9 10 11 12 13 14
经计算,被选的活动集合B={1,4,8,11}。
7
4. 讨论 (1) 正确性:上述算法可转为下面的递推过程:
为证明算法的正确性,只需说明活动1肯定包含在最优活动子 集B中即可,可以用归纳法证明。 f1最小 1°n=1时,A={1},B={1},算法正确;
求:n元向量(X1,X2,…Xn),0≤Xi≤1(i=1,2,…,n),(Xi为第i种物 体被装包的比例)使得
n
n
WiXi M 且
P i X i 达到最大。
i1
i1
2. 解题思路
假定n种物体的总重量大于M。因此,算法的任务是要从n种 物体中选择一部分放入背包,以达到总价值最大的目标。 11
一个简单实例: 设:n=3,M=50,W=(W1,W2,W3)=(20,30,10), P=(P1,P2,P3)=(100,120,60),其不同装法的总重量如Fig.5.2。
5
求解:安排尽量多项活动在该场地进行,即求A的最大相容子 集。这里的相容(mutually compatible)指活动的时间不相重 叠。即活动i,j相容,当且仅当时间区间 [Si,fi]与[Sj,fj]不相交, 即必须有Si≥fj或Sj≥fi成立。 思路:如果希望安排尽量多的活动,显然这里的贪心选择可 以有两种不同的处理:
3. 活动安排(Activity Selection)问题 问题:有n种活动(例如报告、会议)的集合A={1,2,…n},都需 要占用某场地(报告厅或会议室),该场地同一时间只能安 排一项活动。(也是一种调度问题,尽可能接多个定单) 已知:活动i需要在时间段[Si,fi]占用该场地,其中Si与fi是活动 i占用的起始时间和结束时间,且Si<fi(i=1,2,…n)。
已知:现有的钞票面额和付款额
int m[ ]={ 5000, 2000, 1000, 500, 200, 100, 50, 20, 10, 5, 2, 1}; int V; (可以由操作者输入) 输出:各种币值的钞票数int n[12];
12
12
使得 n[i]m[i] V 且 n [ i题的贪心算法Pay
(实际应用中,只是尽可能最少,但不一定最少)
最小。
3
❖5.1.2 铺砖问题
有若干不同规格的砖,要铺满一块平台,总是希望用较少的 砖。例如,有三种规格的砖:2×2、0.8×0.8、0.1×0.1,要 铺满2.5×2.5(m2)的平面。 采用贪心策略,需一块2×2的大砖及25×5+20×5=225块 0.1×0.1小砖。显然这不是最优解,用9块0.8×0.8的中砖加上 49块0.1×0.1的小砖就可以了,需58块,小于贪心法的结果 226块。