第4章 贪心算法PPT课件
合集下载
第4章 贪心算法 计算机算法设计与分析(第3版)教学PPT课件

11
4.2 贪心算法的基本要素 --贪心选择性质
贪心选择性质:指所求问题的整体最优解可以通过 一系列局部最优的选择,即贪心选择来达到。
与动态规划算法的区别: (1)是否依赖子问题 的解;(2)求解过程(自下向上还是自上向下)
判断问题是否所具此性质:对于一个具体问题, 要确定它是否具有贪心选择性质,必须证明每一步所作 的贪心选择最终导致问题的整体最优解。
12
4.2 贪心算法的基本要素 --最优子结构性质
当一个问题的最优解包含其子问题 的最优解时,称此问题具有最优子结构 性质。
13
4.2 贪心算法的基本要素
贪心算法与动态规划算法的差异
相同点:最优子结构性质 不同点:通过组合优化问题实例说明二者
差别。
14
4.2 贪心算法的基本要素
0-1背包问题:
第4章 贪心算法
1
• 学习要点 • 理解贪心算法的概念。 • 掌握贪心算法的基本要素 • (1)最优子结构性质 • (2)贪心选择性质 • 理解贪心算法与动态规划算法的差异 • 通过应用范例学习贪心设计策略。 • (1)活动安排问题; • (2)最优装载问题; • (3)单源最短路径; • (4)多机调度问题。
问题:要在所给的活动集合中选出最大的相容活动 子集合。
5
4.1 活动安排问题
下面给出解活动安排问题的贪心算法:
template<class Type>
void GreedySelector(int n, Type s[], Type f[], bool A[])
{ A[1]=true;
各活动的起始时间和结 束时间存储于数组s和f
问题描述
给定n种物品和一个背包。物品i的重量是Wi,其价值 为Vi,背包的容量为C。应如何选择装入背包的物品,使 得装入背包中物品的总价值最大?
4.2 贪心算法的基本要素 --贪心选择性质
贪心选择性质:指所求问题的整体最优解可以通过 一系列局部最优的选择,即贪心选择来达到。
与动态规划算法的区别: (1)是否依赖子问题 的解;(2)求解过程(自下向上还是自上向下)
判断问题是否所具此性质:对于一个具体问题, 要确定它是否具有贪心选择性质,必须证明每一步所作 的贪心选择最终导致问题的整体最优解。
12
4.2 贪心算法的基本要素 --最优子结构性质
当一个问题的最优解包含其子问题 的最优解时,称此问题具有最优子结构 性质。
13
4.2 贪心算法的基本要素
贪心算法与动态规划算法的差异
相同点:最优子结构性质 不同点:通过组合优化问题实例说明二者
差别。
14
4.2 贪心算法的基本要素
0-1背包问题:
第4章 贪心算法
1
• 学习要点 • 理解贪心算法的概念。 • 掌握贪心算法的基本要素 • (1)最优子结构性质 • (2)贪心选择性质 • 理解贪心算法与动态规划算法的差异 • 通过应用范例学习贪心设计策略。 • (1)活动安排问题; • (2)最优装载问题; • (3)单源最短路径; • (4)多机调度问题。
问题:要在所给的活动集合中选出最大的相容活动 子集合。
5
4.1 活动安排问题
下面给出解活动安排问题的贪心算法:
template<class Type>
void GreedySelector(int n, Type s[], Type f[], bool A[])
{ A[1]=true;
各活动的起始时间和结 束时间存储于数组s和f
问题描述
给定n种物品和一个背包。物品i的重量是Wi,其价值 为Vi,背包的容量为C。应如何选择装入背包的物品,使 得装入背包中物品的总价值最大?
简单的贪心算法pptPPT课件

问题的整体最优解 中包含着它子问题 的最优解
【常见应用】背包问题,最小生成树,最短路径,作业调度等等 【算法优点】求解速度快,时间复杂性有较低的阶. 【算法缺点】需证明是最优解.
02.08.2021
编辑版pppt
9
ﻻ常见应用
1、活动安排问题
【问题陈述】设有n个活动E={1,2,…,n}要使用同一资源,同一时间内 只允许一个活动使用该资源. 设活动i的起止时间区间[si, fi) ,如果选
02.08.2021
编辑版pppt
10
ﻻ常见应用
活动安排问题贪心算法: 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; } }
02.08.2021
编辑版pppt
11
ﻻ常见应用
2、多机调度问题
多机调度问题要求给出一种作业调度方案,使所给的n 个作业在尽可能短的时间内由m台机器加工处理完成。
约定,每个作业均可在任何一台机器上加工处理,但未完 工前不允许中断处理。作业不能拆分成更小的子作业。
体上考虑并不一定是最优解;
(2)贪心算法只能用来求某些最大或最小解的 问题;
(3)贪心算法只能确定某些问题的可行性范围
。
因此,贪心算法具有局限性,并不是总能得到最优
解。 02.08.2021
编辑版pppt
16
谢谢观 看!!!
02.08.2021
中科院陈玉福算法课件ch4ppt

第四章 贪心算法
算法基本思想 调度问题 最小生成树问题 单点源最小路径问题 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。
算法设计与分析第04章 贪心算法PPT课件

9
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.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章-贪心法讲解

8
算法正确性证明(续)
归纳步骤:假设命题对 k 为真, 证明对 k+1 也为真. 算法执行到第 k 步, 选择了活动 i1=1, i2, …, ik, 根据归纳假设 存在最优解 A 包含 i1= 1, i2, … , ik , A中剩下的活动选自集合 S’={ i | iS, si fk}, 且
定了算法的成败. (4)贪心法必须进行正确性证明 贪心法的优势: 算法简单,时间和空间复杂性低
10
4.2 贪心法的正确性证明
数学归纳法
1. 叙述一个描述算法正确性的命题P(n),n为算法步数或者
问题规模
2. 归纳基础:P(1) 或 P(n0)为真, n0为某个自然数
3. 归纳步骤:P(k) P(k+1)
第一数学归纳法
k(k<n)P(k) P(n) 第二数学归纳法
交换论证 1. 分析算法的解的结构特征 2. 从一个最优解逐步进行结构变换(替换成分、交换次序等)
得到一个新的解(结构上与贪心算法的解更接近) 3. 证明:上述变换最终得到算法的解,且变换在有限步结
束,每步变换都保持解的最优性不降低.
3
4.1贪心法的设计思想
活动选择问题
输入:S ={1, 2, … , n}为n 项活动的集合,si, fi 分别为活动 i 的开始和结束时间,活动 i 与 j 相容 si fj 或 sj fi . 求:最大的两两相容的活动集 A
实例
i 1 2 3 4 5 6 7 8 9 10 si 1 3 2 5 4 5 6 8 8 2 fi 4 5 6 7 9 9 10 11 12 13
4. for i2 to n do
5. if si fj //判断相容性 6. then A A{i}
算法正确性证明(续)
归纳步骤:假设命题对 k 为真, 证明对 k+1 也为真. 算法执行到第 k 步, 选择了活动 i1=1, i2, …, ik, 根据归纳假设 存在最优解 A 包含 i1= 1, i2, … , ik , A中剩下的活动选自集合 S’={ i | iS, si fk}, 且
定了算法的成败. (4)贪心法必须进行正确性证明 贪心法的优势: 算法简单,时间和空间复杂性低
10
4.2 贪心法的正确性证明
数学归纳法
1. 叙述一个描述算法正确性的命题P(n),n为算法步数或者
问题规模
2. 归纳基础:P(1) 或 P(n0)为真, n0为某个自然数
3. 归纳步骤:P(k) P(k+1)
第一数学归纳法
k(k<n)P(k) P(n) 第二数学归纳法
交换论证 1. 分析算法的解的结构特征 2. 从一个最优解逐步进行结构变换(替换成分、交换次序等)
得到一个新的解(结构上与贪心算法的解更接近) 3. 证明:上述变换最终得到算法的解,且变换在有限步结
束,每步变换都保持解的最优性不降低.
3
4.1贪心法的设计思想
活动选择问题
输入:S ={1, 2, … , n}为n 项活动的集合,si, fi 分别为活动 i 的开始和结束时间,活动 i 与 j 相容 si fj 或 sj fi . 求:最大的两两相容的活动集 A
实例
i 1 2 3 4 5 6 7 8 9 10 si 1 3 2 5 4 5 6 8 8 2 fi 4 5 6 7 9 9 10 11 12 13
4. for i2 to n do
5. if si fj //判断相容性 6. then A A{i}
贪心算法讲义

float p[1..n], w[1..n], x[1..n], M, rc;
integer i, n; x:= 0; // 将解向量初始化为零
//w[1..n],它们元素的排列 //顺序满p[i]/w[i]≥p[i+1]/w[i+1] //M是背包容量,x[1..n]是解向量
rc:= M; // 背包的剩余容量初始化为M
作业调度问题
单机作业调度问题的贪心算法
将上述算法找到的作业集按作业期限升序排列,就产生一 个作业调度。
算法的复杂度分析
J {i}的相容性判断最坏|J|次,|J|最大i-1。所以 T(n)=1+2+…+n-1=O(n2)
例子: 设n=7,
(p1, p2,… ,pn)=(35,30,25,20,15,10,5), (d1, d2,… ,dn)=(4,2,4,3,4,8,3) 算法GreedyJob的执行过程 : 作业 1 ;2, 1; 2, 1, 3; 2, 4, 1, 3; 2, 4, 1, 3 , 6; 期限 4; 2, 4; 2,4, 4; 2, 3, 4, 4; 2, 3, 4, 4, 8;
带期限的单机作业安排问题
已知n项作业 E={1, 2, … ,n}要求使用同台机器完成, 而且每项作业需要的时间都是1。第k项作业要求在时 刻2, d…k之, n前。完成, 而且完成这项作业将获得效益pk,k=1,
作业集E的子集称为相容的如果其中的作业可以被安 排由一台机器完成。
带限期单机作业安排问题就是要在所给的作业集合中 选出总效益值最大的相容子集。
许多NP难组合优化问题,目前仍未找到有效的算法, 贪心策略常用于设计这些问题的近似算法。
贪心算法的基本思想
贪心算法PPT课件

且有||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算法
安排方案
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算法
贪心算法 PPT课件

第4章 贪心算法
1
学习要点
理解贪心算法的概念。 掌握贪心算法的基本要素 (1)最优子结构性质
(2)贪心选择性质
理解贪心算法与动态规划算法的差异 理解贪心算法的一般理论 通过应用范例学习贪心设计策略。 (1)活动安排问题; (2)最优装载问题; (3)哈夫曼编码; (4)单源最短路径; (5)最小生成树; (6)多机调度问题。
15
4.2 贪心算法的基本要素
1、贪心选择性质
所谓贪心选择性质是指所求问题的整体最优解可以 通过一系列局部最优的选择,即贪心选择来达到。这是 贪心算法可行的第一个基本要素,也是贪心算法与动态 规划算法的主要区别。 动态规划算法通常以自底向上的方式解各子问题, 而贪心算法则通常以自顶向下的方式进行,以迭代的方 式作出相继的贪心选择,每作一次贪心选择就将所求问 题简化为规模更小的子问题。
7
4.1 活动安排问题
活动安排问题就是要在所给的活动集合 中选出最大的相容活动子集合,是可以用 贪心算法有效求解的很好例子。该问题要求 高效地安排一系列争用某一公共资源的活动。 贪心算法提供了一个简单、漂亮的方法使得 尽可能多的活动能兼容地使用公共资源。
8
4.1 活动安排问题
设有n个活动的集合E={1,2,…,n},其中每个活 动都要求使用同一资源,而在同一时间内只有一个活 动能使用这一资源。每个活动i都有一个要求使用该 资源的起始时间si和一个结束时间fi,且si <fi 。如 果选择了活动i,则它在半开时间区间[si, fi)内占 用资源。
{ A[1]=true; int j=1; for (int i=2;i<=n;i++) {
1
学习要点
理解贪心算法的概念。 掌握贪心算法的基本要素 (1)最优子结构性质
(2)贪心选择性质
理解贪心算法与动态规划算法的差异 理解贪心算法的一般理论 通过应用范例学习贪心设计策略。 (1)活动安排问题; (2)最优装载问题; (3)哈夫曼编码; (4)单源最短路径; (5)最小生成树; (6)多机调度问题。
15
4.2 贪心算法的基本要素
1、贪心选择性质
所谓贪心选择性质是指所求问题的整体最优解可以 通过一系列局部最优的选择,即贪心选择来达到。这是 贪心算法可行的第一个基本要素,也是贪心算法与动态 规划算法的主要区别。 动态规划算法通常以自底向上的方式解各子问题, 而贪心算法则通常以自顶向下的方式进行,以迭代的方 式作出相继的贪心选择,每作一次贪心选择就将所求问 题简化为规模更小的子问题。
7
4.1 活动安排问题
活动安排问题就是要在所给的活动集合 中选出最大的相容活动子集合,是可以用 贪心算法有效求解的很好例子。该问题要求 高效地安排一系列争用某一公共资源的活动。 贪心算法提供了一个简单、漂亮的方法使得 尽可能多的活动能兼容地使用公共资源。
8
4.1 活动安排问题
设有n个活动的集合E={1,2,…,n},其中每个活 动都要求使用同一资源,而在同一时间内只有一个活 动能使用这一资源。每个活动i都有一个要求使用该 资源的起始时间si和一个结束时间fi,且si <fi 。如 果选择了活动i,则它在半开时间区间[si, fi)内占 用资源。
{ A[1]=true; int j=1; for (int i=2;i<=n;i++) {
算法-第4章贪心法-PPT课件

f i A
i , j A , i j , f ( i ) t f ( j ) or f ( j ) t f ( i ) i j
12
实例
A={1, 2, 3, 4, 5}, T=<5, 8, 4, 10, 3>, D=<10, 12, 15, 11, 20> 调度1: f1(1)=0, f1(2)=5, f1(3)=13, f1(4)=17, f1(5)=27 各任务延迟:0, 1, 2, 16, 10; 最大延迟:16 5 1 2 13 3 17 4 27 5 30
18
i j
f2(j)=s f2(i)=s+tj
delay(f’,i)=s+tj+ti- di <delya(f,j)r delay(f, j)=s+ti+tj-dj
4.3 得不到最优解的处理方法
讨论对于哪些输入贪心法能得到最优解:输入条件 讨论贪心法的解最坏情况下与最优解的误差(见第8章)
例4.4 找零钱问题 设有 n 种零钱, 重量分别为w1, w2, ... , wn, 价值分别为 v1=1, v2, ... , vn. 需要付的总钱数是 Y .不妨设币值和钱数都为 正整数. 问:如何付钱使得所付钱的总重最轻?
设计思想:按完成时间从早到晚安排任务,没有空闲
15
交换论证:正确性证明
算法的解的性质: (1) 没有空闲时间, 没有逆序. (2) 逆序 (i, j): f(i) < f(j) 且 di > dj 引理4.1 所有没有逆序、没有空闲时间的调度具有相同的 最大延迟. 证: 设 f 没有逆序,在 f 中具有相同完成时间的客户i1, i2, … , ik 必被连续安排. 在这k个客户中最大延迟是最后一个客 户,被延迟的时间是 k
i , j A , i j , f ( i ) t f ( j ) or f ( j ) t f ( i ) i j
12
实例
A={1, 2, 3, 4, 5}, T=<5, 8, 4, 10, 3>, D=<10, 12, 15, 11, 20> 调度1: f1(1)=0, f1(2)=5, f1(3)=13, f1(4)=17, f1(5)=27 各任务延迟:0, 1, 2, 16, 10; 最大延迟:16 5 1 2 13 3 17 4 27 5 30
18
i j
f2(j)=s f2(i)=s+tj
delay(f’,i)=s+tj+ti- di <delya(f,j)r delay(f, j)=s+ti+tj-dj
4.3 得不到最优解的处理方法
讨论对于哪些输入贪心法能得到最优解:输入条件 讨论贪心法的解最坏情况下与最优解的误差(见第8章)
例4.4 找零钱问题 设有 n 种零钱, 重量分别为w1, w2, ... , wn, 价值分别为 v1=1, v2, ... , vn. 需要付的总钱数是 Y .不妨设币值和钱数都为 正整数. 问:如何付钱使得所付钱的总重最轻?
设计思想:按完成时间从早到晚安排任务,没有空闲
15
交换论证:正确性证明
算法的解的性质: (1) 没有空闲时间, 没有逆序. (2) 逆序 (i, j): f(i) < f(j) 且 di > dj 引理4.1 所有没有逆序、没有空闲时间的调度具有相同的 最大延迟. 证: 设 f 没有逆序,在 f 中具有相同完成时间的客户i1, i2, … , ik 必被连续安排. 在这k个客户中最大延迟是最后一个客 户,被延迟的时间是 k
第4章贪心方法

其次考虑物品2和3。就Δ M=2而言有,只能选择物品2或3的一部分装入背包。 物品2: 若 x2=2/15, 则 p2 x2=16/5=3.1 物品3: 若 x3=2/10, 则 p3 x3=3 为使背包的效益有最大的增量,应选择物品2的2/15装包,即
x2=2/15 最后,背包装满, Δ M=0,故物品3将不能装入背包,x3=0 。
位,还剩余空间Δ M=5。同时,背包获得p2=24的效益增量。 其次考虑物品1和3。此时,应选择物品3,且就Δ M=5而言有,也 只能放入物品3的一部分到背包中 。即
x3=5/10=1/2 最后,背包装满Δ M=0,故物品1将不能装入背包,x1=0 。
背包最终可以获得效益值= x1 p1 +x2 p2+x3 p3 = 31.5 (最优解)
即,新的标准是:以容量作为度量标准 该度量标准下的处理规则: ● 按物品重量的非降次序将物品装入到背包; ● 如果正在考虑的物品放不进去,则只取其一部分装 满背包;
2019/12/4
实例分析(例4.1)
(pபைடு நூலகம்,p2,p3) = (25,24,15), (w1,w2,w3) = (18,15,10)
② 设j是使xi≠1的最小下标。由算法可知,
xi=1 1≤i<j,
0≤xj <1
xi=0 j<i≤n
若X不是问题的最优解,则必定存在一个可行解 Y=(y1, y2, …,
yn),使得:
piyi pixi
且应有:
wiyi M
2019/12/4
设k是使得yk≠ xk的最小下标,则有yk< xk:
分析: ① 装入背包的总重量不能超过M
② 如果所有物品的总重量不超过M,即wixi ≤M,则把所有的物
x2=2/15 最后,背包装满, Δ M=0,故物品3将不能装入背包,x3=0 。
位,还剩余空间Δ M=5。同时,背包获得p2=24的效益增量。 其次考虑物品1和3。此时,应选择物品3,且就Δ M=5而言有,也 只能放入物品3的一部分到背包中 。即
x3=5/10=1/2 最后,背包装满Δ M=0,故物品1将不能装入背包,x1=0 。
背包最终可以获得效益值= x1 p1 +x2 p2+x3 p3 = 31.5 (最优解)
即,新的标准是:以容量作为度量标准 该度量标准下的处理规则: ● 按物品重量的非降次序将物品装入到背包; ● 如果正在考虑的物品放不进去,则只取其一部分装 满背包;
2019/12/4
实例分析(例4.1)
(pபைடு நூலகம்,p2,p3) = (25,24,15), (w1,w2,w3) = (18,15,10)
② 设j是使xi≠1的最小下标。由算法可知,
xi=1 1≤i<j,
0≤xj <1
xi=0 j<i≤n
若X不是问题的最优解,则必定存在一个可行解 Y=(y1, y2, …,
yn),使得:
piyi pixi
且应有:
wiyi M
2019/12/4
设k是使得yk≠ xk的最小下标,则有yk< xk:
分析: ① 装入背包的总重量不能超过M
② 如果所有物品的总重量不超过M,即wixi ≤M,则把所有的物
人工智能算法Python语言版PPT第4章贪心法

- 任一字符的代码(0,1序列)都不是其他字符代码的前缀——完全二叉树T
- 满足前缀约束,则编码无二义性
- 平均码长: B (T ) f (c )dT (c )
cC
字符c出现的频率为f(c),
在T中的深度为dT(c)
哈夫曼编码 (2)
哈夫曼编码( Huffman encoding )算法为贪心法
应用背景和动机 (1)
背景:主播带货已成为了一种新的产品推销
手段。为响应国家脱贫攻坚和乡村振兴战略,
边远山区的地方政府也采取主播带货的方式
推广农产品。
例如:假设一批农产品要被想被大众熟知,则其影响因子需要达到1.3,
现有3类主播,其中A类主播可帮助农产品提高0.4的影响因子,B类主
播可帮助农产品提高0.3的影响因子,C类主播可帮助农产品提高0.1的
E=11
F=1011
哈夫曼编码 (3)
哈夫曼编码算法
输入——C:n个元素及其权值的集合
输出——:哈夫曼树
步骤:
←
//对集合C按照元素权值初始化最小堆优先队列
. ℎ ← 0,. ← ∅, . ℎ ← ∅ //初始化哈夫曼树
For = 1 To − 1 Do
不仅要找到答案,且要找到最佳答案
贪心算法(Greedy algorithm)
有时对优化问题能有较好的解决方案
贪心算法分阶段执行,每一个阶段:
-
当考虑做何种选择时,只考虑对当前问题最佳的选择,而不考虑其
子问题的结果
-
希望通过每一个步骤的局部最优(Local optimum)而得到全局最优
(Global optimum)
贪心算法的基本思想
- 满足前缀约束,则编码无二义性
- 平均码长: B (T ) f (c )dT (c )
cC
字符c出现的频率为f(c),
在T中的深度为dT(c)
哈夫曼编码 (2)
哈夫曼编码( Huffman encoding )算法为贪心法
应用背景和动机 (1)
背景:主播带货已成为了一种新的产品推销
手段。为响应国家脱贫攻坚和乡村振兴战略,
边远山区的地方政府也采取主播带货的方式
推广农产品。
例如:假设一批农产品要被想被大众熟知,则其影响因子需要达到1.3,
现有3类主播,其中A类主播可帮助农产品提高0.4的影响因子,B类主
播可帮助农产品提高0.3的影响因子,C类主播可帮助农产品提高0.1的
E=11
F=1011
哈夫曼编码 (3)
哈夫曼编码算法
输入——C:n个元素及其权值的集合
输出——:哈夫曼树
步骤:
←
//对集合C按照元素权值初始化最小堆优先队列
. ℎ ← 0,. ← ∅, . ℎ ← ∅ //初始化哈夫曼树
For = 1 To − 1 Do
不仅要找到答案,且要找到最佳答案
贪心算法(Greedy algorithm)
有时对优化问题能有较好的解决方案
贪心算法分阶段执行,每一个阶段:
-
当考虑做何种选择时,只考虑对当前问题最佳的选择,而不考虑其
子问题的结果
-
希望通过每一个步骤的局部最优(Local optimum)而得到全局最优
(Global optimum)
贪心算法的基本思想
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
} 31.10.2020
算法设计与分析
9
算法分析
• 设集合a包含已被选择的活动, 初始时为空。所有待选择 的活动按结束时间的非递减顺序排列:
f1f2fn
• 变量j指出最近加入a的活动序号。由于按结束时间非递减 顺序来考虑各项活动的,所以fj总是a中所有活动的最大结 束时间,即:
fj m kAa{xfk}
//且按结束时间的非递减排序:f1≤f2≤…≤fn排列。 A[1]=true; //用集合A存储所选择的活动
int j=1;
for(int i=2; i<=n; i++) {
//将与j相容的具有最早完成时间的相容活动加入集合A
if(s[i]>=f[j]) {A[i]=true; j=i; }
else A[i]=false; }
• 该算法利用了问题本身的一些特性,例如硬币 面值的特性。
• 再例:如果有一分、五分和一角一分三种不同 的硬币,要找给顾客一角五分钱。
31.10.2020
算法设计与分析
4
结论
• 顾名思义,贪心算法总是作出在当前看来最好的选择。 也就是说贪心算法并不从整体最优考虑,它所作出的 选择只是在某种意义上的局部最优选择。
• 从问题的某一个初始解出发逐步逼近给定的目标,以 尽可能快地求得更好的解。当达到某算法中的某一步 不能再继续前进时,算法停止。
• 实现该算法的过程该:算法存在的问题: 从问题的某一初始1. 解不出能发保;证求得的最后解是最佳的; while 能朝给定2总. 不目能标用前来进求一最步大d或o 最小解问题; 求出可行解3的. 只一能个求解满元足素某;些约束条件的可行解的 范围。 由所有解元素组合成问题的一个可行解。
31.10.2020
算法设计与分析
7
问题定义
• 设有n个活动的集合E={1,2,…,n},其中每个活动都要求 使用同一资源,如演讲会场等,而在同一时间内只有一 个活动能使用这一资源。(临界资源)
• 每个活动i都有一个要求使用该资源的起始时间si和一个 结束时间fi,且si<fi 。
• 如果选择了活动i,则它在半开时间区间[si, fi)内占用资 源。若区间[si, fi)与区间[sj, fj)不相交,则称活动i与活动j 是相容的。即,当si≥fj或sj≥fi时,活动i与活动j相容,
☆否则不选择该活动。
由于输入活动是以完成时间的非递减排列,所选择的下一个
活动总是可被合法调度的活动中具有最早结束时间的那个,
所以算法是一个“贪心的”选择,即使得使剩余的可安排时
间3段1.1极0.20大20 化,以便安排尽可算法能设多计与的分析相容活动。
11
结论
• 算法GreedySelector的效率极高。当输入的活 动已按结束时间的非减序排列,算法只需O(n) 的时间就可安排n个活动,使最多的活动能相 容地使用公共资源。
31.10.2020
算法设计与分析
10
A[1]=true;
首先将活动1加入集合a;
int j=1;
初始化j为1;
for(int i=2; i<=n; i++){ if(s[i]>=f[j]) { A[i]=true; j=i; } else A[i]=false; }
然后从活动2出发逐一检查:
☆ 若待选活动i与a中的所有活 动兼容,即活动i 的si不早于 最近加入a中的j活动的fj,则 活动i加入a集合,并取代活动 j的位置。
31.10.2020
算法设计与分析
13
2
1
3
1
4
1
5
1
4
6
1
4
7
1
4
8
1
4
9
1
4
8
10
1
4
8
11
1
4
8
0 311.10.220210 3 4 5 64 7 8 算9 法81设0计与11分析12 1131 14
图4-1 算法 GreedySelector
的计算过程
14
时间
补充说明
• 贪心算法并不总能求得问题的整体最优解。 • 但对于活动安排问题,贪心算法
31.10.2020
算法设计与分析
2
贪心算法应用举例——找硬币
• 假设有四种硬币,它们的面值分别为二角五分、
一角、五分和一分。现找顾客六角三分钱,请
给出硬币个数最少的找钱方案。
二角 五分
一角
五分
一分
硬币个数 最少的找 钱方案
六角三分
31.10.2020
算法设计与分析
3
分析
• 找硬币问题本身具有最优子结构性质,它可以 用动态规划算法来解。但显然贪心算法更简单, 更直接且解题效率更高。
• 问题就是选择一个由互相兼容的活动组成的最大集合。
31.10.2020
算法设计与分析
8
活动安排问题的贪心算法
template<class Type>
void GreedySelector(int n, Type s[], Type f[], bool A[])
{ //各活动的起始时间和结束时间存储在数组s和f中
• 如果所给出的活动未按非减序排列,可以用 O(nlogn)的时间重排。
31.10.2020
算法设计与分析
12
举例
• 设待安排的11个活动的开始时间和结束时间按 结束时间的非减序排列如下:
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 8 9 10 11 12 13 14
第4章 贪心算法
31.10.2020
算法设计与分析
1
第4章 贪心算法
学习要点 • 理解贪心算法的概念。 • 掌握贪心算法的基本要素:
– 最优子结构性质、贪心选择性质。 • 理解贪心算法与动态规划算法的差异。 • 理解贪心算法的一般理论。 • 通过应用范例学习动态规划算法设计策略:
– 活动安排问题;背包问题;哈夫曼编码问题。
31.10.2020
算法设计与分析
6
4.1 活动安排问题
• 活动安排问题:要求高效地安排一系列争用某一 公共资源的活动。
• 举例:
活动 序号 起始 时间 结束 时间
1 2 3 4 5 6 7 8 9 10 11 1 3 0 5 3 5 6 8 8 2 12 4 5 6 7 8 9 10 11 12 13 14
• 当然,希望贪心算法得到的最终结果也是整体最优的。 虽然贪心算法不能对所有问题都得到整体最优解,但 对许多问题它能产生整体最优解。如单源最短路经问 题,最小生成树问题等。
• 在一些情况下,即使贪心算法不能得到整体最优解, 其最终结果却是最优解的很好近似。
31.10.2020
算法设计与分析
5
贪心法的基本思路