简单的贪心算法ppt
合集下载
程序设计方法——贪心算法PPT教学课件
2020/12/12
12
输入数据保证最后可以达到每堆石子的个 数相等
2020/12/12
9
解题思路
本题模型与均分纸牌很相似
均分纸牌:一条直线 石子移动:环
参考上一题的方法,尝试从任何一堆纸牌 出发,求得当前的最小移动的石子数
从不同的石子堆出发最小移动石子数一样么? 如何得到全局最优解
枚举每个出发点,从中找一个移动石子数目最小的。
2020/12/12
7
解题思路
确定最终每堆纸牌上的纸牌数目 从一个端点出发沿着一个方向移动纸牌,
每次移动后确保当前这堆纸牌上的数目是 最终每堆纸牌数目
注意:可以移动负数
最优方案,证明?
代码略
2020//12
8
问题3:石子移动
有N堆石子排成一个圈,第i堆石子有ai个石 子。每堆石子均可被移动到相邻的堆,请 问要使得所有堆石子的个数均相等,最少 需要移动多少个石子。
《程序设计实践》
程序设计方法之 贪心法
2020/12/12
1
贪心法
概念:贪心法( Greedy algorithm),又 称贪心算法,是一种在每一步选择中都采 取在当前状态下最好或最优(即最有利) 的选择,从而希望导致结果是最好或最优 的算法
每一步上都要保证能获得局部最优解,但由此 产生的全局解有时不一定是最优的
int main() {
int n, heap[MAXHEAP], tmpHeap[MAXHEAP]; // minMoves表示最小移动的牌数,初始化为最大整数 int nTotal = 0, nAverage = 0, minMoves = 0x7FFFFFFF, nMoves; int i, j;
贪心算法精品PPT课件
– 从全局看来,运用贪心策略解决的问题在 程序的运行过程中无回溯过程
教学进度
背包问题
计算机科学与工程系
• 给定n种物品和一个背包。物品i的重量是 Wi,其价值为Vi,背包的容量为C。在选 择物品i装入背包时,可以选择物品i的一部 分,而不一定要全部装入背包,1≤i≤n。 应如何选择装入背包的物品,使得装入背包 中物品的总价值最大?
教学进度
计算机科学与工程系
• 贪心算法并不总能求得问题的整体最优 解。但对于活动安排问题,贪心算法 GreedySelector却总能求得的整体最 优解,即它最终所确定的相容活动集合 A的规模最大。
教学进度
贪心算法的基本要素
• 最优子结构性质 • 贪心选择性质
计算机科学与工程系
教学进度
最优子结构性质
教学进度
计算机科学与工程系
• 怎样对这n个活动进行安排才能 令最多的活动可以使用资源?
教学进度
计算机科学与工程系
• 活动安排问题也就是要在所给 的活动集合中选出最大的相容 活动子集合
教学进度
计算机科学与工程系
教学进度
计算机科学与工程系
• 思路:按照结束时间递增序列将活动排 序,使得f1<=f2<=…<=fn
• void GreedySelector(int n, Type s[], Type f[], bool A[])
•{
•
A[1]=true;
•
int j=1;
•
for (int i=2;i<=n;i++) {
各活动的起始时间和结 束时间存储于数组s和f 中且按结束时间的非减 序排列
•
if (s[i]>=f[j]) { A[i]=true; j=i; }
教学进度
背包问题
计算机科学与工程系
• 给定n种物品和一个背包。物品i的重量是 Wi,其价值为Vi,背包的容量为C。在选 择物品i装入背包时,可以选择物品i的一部 分,而不一定要全部装入背包,1≤i≤n。 应如何选择装入背包的物品,使得装入背包 中物品的总价值最大?
教学进度
计算机科学与工程系
• 贪心算法并不总能求得问题的整体最优 解。但对于活动安排问题,贪心算法 GreedySelector却总能求得的整体最 优解,即它最终所确定的相容活动集合 A的规模最大。
教学进度
贪心算法的基本要素
• 最优子结构性质 • 贪心选择性质
计算机科学与工程系
教学进度
最优子结构性质
教学进度
计算机科学与工程系
• 怎样对这n个活动进行安排才能 令最多的活动可以使用资源?
教学进度
计算机科学与工程系
• 活动安排问题也就是要在所给 的活动集合中选出最大的相容 活动子集合
教学进度
计算机科学与工程系
教学进度
计算机科学与工程系
• 思路:按照结束时间递增序列将活动排 序,使得f1<=f2<=…<=fn
• void GreedySelector(int n, Type s[], Type f[], bool A[])
•{
•
A[1]=true;
•
int j=1;
•
for (int i=2;i<=n;i++) {
各活动的起始时间和结 束时间存储于数组s和f 中且按结束时间的非减 序排列
•
if (s[i]>=f[j]) { A[i]=true; j=i; }
[数学]152 贪心算法ppt课件
S { 0,1,2,3,4,5}
35 53
Prim算法实现 int s[N]表示集合S,1表示曾经参与,否那么0
,初始S[0] = 1; lowcost[N]记录每一个顶点到集合s的最短边长
度,初始lowcost[0, ..., N-1] = c[0][0, ..., N-1] lowcost[N] ={0,4,INT_MAX, 5, INT_MAX,
就根据部分最优战略,得到一个部分解,减少 问题的范围或规模 选择最早终了的事件; 将一切的部分解综合列;
13 53
二:区间覆盖问题
问题的描画
用整数i来表示x轴上坐标为[i - 1, i]的区间(长度 为1)。给出M(1 <= M <= 200)个不同的整数, 表示M个这样的区间。
2 53
背包问题: 给定n种物品和一个背包,设Wi为物体i的分量
,Vi为期价值,C为背包的承分量。要求在背 包的承分量的限制下,进能够使背包中物品 的价值最大。 贪婪战略一:每次选择价值最大的物品。 贪婪战略二:每次选择分量最小的物品。 贪婪战略三:每次选择Vi/Wi最大的物品
3 53
什么是贪婪法? “鼠目寸光〞的方法?每次选择面值最大的硬币
10 53
#include <iostream> using namespace std; const int N = 12; void OutputResult(int select[], int N) //输出结果函数 {
for(int i = 0; i < N; i++) {
if(select[i] == 1) //当标志为1时该事件被选中 cout << i << endl; } }
35 53
Prim算法实现 int s[N]表示集合S,1表示曾经参与,否那么0
,初始S[0] = 1; lowcost[N]记录每一个顶点到集合s的最短边长
度,初始lowcost[0, ..., N-1] = c[0][0, ..., N-1] lowcost[N] ={0,4,INT_MAX, 5, INT_MAX,
就根据部分最优战略,得到一个部分解,减少 问题的范围或规模 选择最早终了的事件; 将一切的部分解综合列;
13 53
二:区间覆盖问题
问题的描画
用整数i来表示x轴上坐标为[i - 1, i]的区间(长度 为1)。给出M(1 <= M <= 200)个不同的整数, 表示M个这样的区间。
2 53
背包问题: 给定n种物品和一个背包,设Wi为物体i的分量
,Vi为期价值,C为背包的承分量。要求在背 包的承分量的限制下,进能够使背包中物品 的价值最大。 贪婪战略一:每次选择价值最大的物品。 贪婪战略二:每次选择分量最小的物品。 贪婪战略三:每次选择Vi/Wi最大的物品
3 53
什么是贪婪法? “鼠目寸光〞的方法?每次选择面值最大的硬币
10 53
#include <iostream> using namespace std; const int N = 12; void OutputResult(int select[], int N) //输出结果函数 {
for(int i = 0; i < N; i++) {
if(select[i] == 1) //当标志为1时该事件被选中 cout << i << endl; } }
贪心算法PPT学习课件
5
例8.2 一个买糖的孩子用1元钱买了不到1元钱的糖,售货 员找硬币时希望用最少个数的硬币。 售货员每增加一个硬币,使用的贪心规则是: 每次希望增加尽可能多的币值,又不能超出总数。 例如要找66c(分)。
● 假设硬币面值分别为:25c, 10c, 5c, 1c。
● 假设硬币面值分别为:20c, 16c, 10c, 1c。
3. MAKESET({v})
4. End for
5. T={}
6. While |T|<n-1
7. 令(x,y)为E中的下一条边
8. If FIND(x)≠FIND(y) then
heyichao@
26
9.
将(x,y)加入T
10.
UNION(x,y)
11. End if
12. End while
● 函数H-1(w)返回w在H中的位置 (注意堆由一个 数组H(1…n)来实现)。
heyichao@
18
● 运行时间主要取决于堆运算,这里共有n-1 个DELETEMIN运算,n-1个INSERT运算,最 多m-n+1个SIFTUP运算,每个堆运算用O(logn) 时间,得到总共需要O(mlogn)时间。
1. 对G的边以非降序权重排列。
2. 对于排序表中的每条边,如果现在把它放入T 不会形成回路的话,则把它加入到生成树T中;否 则将它丢弃。
见例8.3
heyichao@
24
Kruskal算法的实现
为有效地实现此算法,我们需要某种机制来检 测加入边后是否构成回路。为此需要确定一种数 据结构,让它在算法的每个时刻来表示森林,并 且在向T中添加边时动态检测是否有回路生成。
7
● 假设V={1,2,…,n}并且s=1。这个问题可以用一 种称为Dijkstra算法的贪心技术来解决。初始时, 将顶点分为两个集合X={1}和Y={2,3,…,n}。X包 含的顶点集合:从源点到这些顶点的距离已经确 定。
简单的贪心算法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
贪心算法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课件
• Begin
•
S:=S+P[I]; M:=M-W[I];
• End
• Else {否则取一部分}
• Begin
•
S:=S+M*(P[I]/W[I]); Break;
• End;
• End;
11
• Procedure Out; {输出} • Begin • Assign(Output,Fout); Rewrite(Output); • Writeln(S:0:0); • Close(Output); • End; • Begin {主程序} • Init; • Work; • Out; • End.
23
• 分析:需要考虑如下问题: • (1)出发前汽车的油箱是空的,故汽车必须在起
点(1号站)处加油。加多少油? • (2)汽车行程到第几站开始加油,加多少油? • 可以看出,原问题需要解决的是在哪些油站加油
• (2) 原问题的最优解包含子问题的最优解,即问题具有最优 子结构的性质。在背包问题中,第一次选择单位质量最大的货 物,它是第一个子问题的最优解,第二次选择剩下的货物中单 位重量价值最大的货物,同样是第二个子问题的最优解,依次 类推。
• 其次,如何选择一个贪心标准?正确的贪心标准可以得到问 题的最优解,在确定采用贪心策略解决问题时,不能随意的判 断贪心标准是否正确,尤其不要被表面上看似正确的贪心标准 所迷惑。在得出贪心标准之后应给予严格的数学证明。
二
请在这里输入您的主要 叙述内容
三 请在这里输入您的主要叙述内容
2
一、引入:
• 若在求解一个问题时,能根据每次所得 到的局部最优解,推导出全局最优或最优 目标。那么,我们可以根据这个策略,每 次得到局部最优解答,逐步而推导出问题, 这种策略称为贪心法。
贪心算法 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
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
2021/3/10
12
有八种字符:a b c d e f g h ,其在通信联络中出现的概率分别为: 0.05 0.29 0.07 0.08 0.14 0.23 0.03 0.11 ,试设计哈夫曼编码。
设权 w = ( 5 , 29 , 7 ,8 , 14 , 23 ,3 , 11) n = 8
构造过程:
2021/3/10
5
ﻻ算法过程
顾名思义,贪心算法总是作出在当前看来最 好的选择。也就是说贪心算法并不从整体最优考 虑,它所作出的选择只是在某种意义上的局部最 优选择。
【标准转化】 贪心猜想(贪心策略)
找硬币的时候:
找的硬币总数最少→使剩余金额最少
2021/3/10
原
现
6
ﻻ算法过程
[贪心算法步骤]
2021/3/10
15
综述
贪心算法是一种分级处理方法,它得到某种度量意义下
一个问题的最优解,所做的每一次选择都是当前状态下的贪 心选择,通过一系列的选择来得到最终解。这种策略是一种 很简洁的方法,适用于许多问题,但并不能依赖于它,因为 它还有一下不足:
从问题的某一初始解出发; while 能朝给定总目标前进一 步 do 求出可行解的一个解元素; 由所有解元素组合成问题的一个 可行解;
真正意义要求解原问题
将原问题变成更小 子问题的步骤
理解
2021/3/10
7
ﻻ算法过程
【贪心算法一般步骤】
1、设计数据找规律 2、进行贪心猜想 3、正确性证明(严格证明和一般证明)
或右下方向走。求走到底层后它所经 过
的数的最大值。
826
解:如果用贪心法,每次向最大的方向 走,
得到结果为1+6+8+2+3=20。可是明明还 2 1 6 5 有另一条路,1+3+6+6+7=23。
问题出在哪?每次的选择对后面的步骤会有 3 2 4 7 6 影响!第三级选了8,就选不到第四、五 级较大的数了。
2021/3பைடு நூலகம்10
3
ﻻ算法思想
在现实生活中,我们经常为下意 识的做贪心的选择,例如在购买商品 时候总是寻求物美价廉的物品,在质 量相同情况下,价格低的首选。
贪心——抱歉我找不到更好的词去形 容——是个好东西。贪心是对的,贪 心是奏效的。
——电影《华尔街》
2021/3/10
4
ﻻ算法思想
将问题的求解过程看作是一系列选择,每 次选择一个输入,每次选择都是当前状态下的 最好选择(局部最优解)。每作一次选择后,所 求问题会简化为一个规模更小的子问题。从而 通过每一步的最优解逐步达到整体的最优解。
【常见应用】会议安排问题,哈夫曼编码问题, 等等
【算法优点】求解速度快,时间复杂性有较低的阶.
【算法缺点】需证明是最优解.
2021/3/10
9
ﻻ常见应用
1、会议安排问题
【问题陈述】设有n个会议E={1,2,…,n}要使用同一资源,同一时间内 只允许一个会议使用该资源. 设会议i的起止时间区间[si, fi) ,如果选
5
29
7
8
14 23
3
11
0 100 1
42
0
1
58 1
0
a: 0000 c: 1000 e: 101
b :11 d: 1001 f :01
19
23
29 29 g: 0001 23h:001
29 1 29
14
23
0
1
0
8 0
11 1
209
15 7 1
14 298
14 14
2233 11 11
5
3
7
8
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; } }
2021/3/10
11
• ﻻ常见应用
2、哈夫曼编码
【问题陈述】哈夫曼编码是广泛地用于数据文件压缩的十分有效的 编码方法。其压缩率通常在20%~90%之间。哈夫曼编码算法用字 符在文件中出现的频率表来建立一个用0,1串表示各字符的最优表 示方式。 【算法思路】 (1)以n个字母为结点构成n棵仅含一个点的二叉树集合,字母的 频率即为结点的权。 (2)每次从二叉树集合中找出两个权最小者合并为一棵二叉树: 增加一个根结点将这两棵树作为左右子树。新树的权为两棵子树的 权之和。 (3)反复进行步骤(2)直到只剩一棵树为止。
·严格证明:数学归纳和反证法 ·一般证明:列举反例 4、程序实现
2021/3/10
8
ﻻ算法分析
【适用问题】 具备贪心选择和最优子结构性质的最优化
问题
整体的最优解可通过一系列 局部最优解达到. 每次的选择 可以依赖以前作出的选择, 但 不能依赖于后面的选择
问题的整体最优解 中包含着它子问题 的最优解
谈谈自己的 想法——
2021/3/10
14
选择需慎重
贪心算法在对问题求解时,总是作出在当前看
来是最好的选择。也就是说,不从整体上加以考虑,
它所作出的仅仅是在某种意义上的局部最优解。
eg:数字三角形问题:有一个数字三角形 1
(如右图)。现有一只蚂蚁从顶层开始
向下走,每走下一级时,可向左下方向 6 3
事件编号 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
2021/3/10
10
ﻻ常见应用
会议安排问题贪心算法: void GreedySelector(int n, Type s[], Type f[], bool A[]) {
择了会议i,则它在时间区间[si, fi)内占用该资源;若[si, fi)与[sj, fj)不
相交 , 则称会议 i 与 j 是 相容 的 . 求解目标是在所给的会议集合中 选出最大相容会议子集. 【算法思路】将n个会议按结束时间非减序排列,依次考虑会议i, 若i 与已选择的会议相容,则添加此会议到相容会议子集. 【例】设待安排的11个会议起止时间按结束时间的非减序排列
贪心算法简谈与应用举例
组员: 学院:通信与信息工程
2021/3/10
1
※简谈: 算法思想 算法过程 算法分析
※应用举例:
常见应用
2021/3/10
2
ﻻ算法思想
引例——找零钱
找钱的方法: 25+25+10+5+1+1
我们有种直觉的倾向:
在找零钱时,直觉 告诉我们使用面值大的硬 币,剩余的金额就越少, 这样找的硬币数目最少。