第4章 贪心算法PPT课件
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
31.10.2020
算法设计与分析
2
贪心算法应用举例——找硬币
• 假设有四种硬币,它们的面值分别为二角五分、
一角、五分和一分。现找顾客六角三分钱,请
给出硬币个数最少的找钱方案。
二角 五分
一角
五分
一分
硬币个数 最少的找 钱方案
六角三分
31.10.2020
算法设计与分析
3
分析
• 找硬币问题本身具有最优子结构性质,它可以 用动态规划算法来解。但显然贪心算法更简单, 更直接且解题效率更高。
第4章 贪心算法
31.10.2020
算法设计与分析
1
第4章 贪心算法
学习要点 • 理解贪心算法的概念。 • 掌握贪心算法的基本要素:
– 最优子结构性质、贪心选择性质。 • 理解贪心算法与动态规划算法的差异。 • 理解贪心算法的一般理论。 • 通过应用范例学习动态规划算法设计策略:
– 活动安排问题;背包问题;哈夫曼编码问题。
• 该算法利用了问题本身的一些特性,例如硬币 面值的特性。
• 再例:如果有一分、五分和一角一分三种不同 的硬币,要找给顾客一角五分钱。
31.10.2020
算法设计与分析
4
结论
• 顾名思义,贪心算法总是作出在当前看来最好的选择。 也就是说贪心算法并不从整体最优考虑,它所作出的 选择只是在某种意义上的局部最优选择。
} 31.10.2020
算法设计与分析
9
算法分析
• 设集合a包含已被选择的活动, 初始时为空。所有待选择 的活动按结束时间的非递减顺序排列:
f1f2fn
• 变量j指出最近加入a的活动序号。由于按结束时间非递减 顺序来考虑各项活动的,所以fj总是a中所有活动的最大结 束时间,即:
fj m kAa{xfk}
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的位置。
//且按结束时间的非递减排序: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
算法设计与分析
8
活动安排问题的贪心算法
template<class Type>
void GreedySelector(int n, Type s[], Type f[], bool A[])
{ //各活动的起始时间和结束时间存储在数组s和f中
☆否则不选择该活动。
由于输入活动是以完成时间的非递减排列,所选择的下一个
活动总是可被合法调度的活动中具有最早结束时间的那个,
所以算法是一个“贪心的”选择,即使得使剩余的可安排时
间3段1.1极0.20大20 化,以便安排尽可算法能设多计与的分析相容活动。
11
结论
• 算法GreedySelector的效率极高。当输入的活 动已按结束时间的非减序排列,算法只需O(n) 的时间就可安排n个活动,使最多的活动能相 容地使用公共资源。
• 从问题的某一个初始解出发逐步逼近给定的目标,以 尽可能快地求得更好的解。当达到某算法中的某一步 不能再继续前进时,算法停止。
• 实现该算法的过程该:算法存在的问题: 从问题的某一初始1. 解不出能发保;证求得的最后解是最佳的; while 能朝给定2总. 不目能标用前来进求一最步大d或o 最小解问题; 求出可行解3的. 只一能个求解满元足素某;些约束条件的可行解的 范围。 由所有解元素组合成问题的一个可行解。
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
贪心法的基本思路
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相容,
• 如果所给出的活动未按非减序排列,可以用 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
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
时间
补充说明
• 贪心算法并不总能求得问题的整体最优解。 • 但对于活动安排问题,贪心算法