算法设计与分析_第4章_贪心算法2
第4章贪心算法习题(免费阅读)

算法实现题4-5 程序存储问题
数据输入:
第一行是2 个正整数,分别表示文件个数n和磁带的长 度L。接下来的1 行中,有n个正整数,表示程序存放在磁 带上的长度。
结果输出: 最多可以存储的程序数。
输入示例
6 50
2 3 13 8 80 20 输出示例
5
i 012345
x 2 3 13 8 80 20 7
3
算法实现题4-5 程序存储问题
问题描述: 设有n 个程序{1,2,…, n }要存放在长度为L的磁带上。
程序i存放在磁带上的长度是 li,1 ≤ i ≤ n。 程序存储问题要求确定这n 个程序在磁带上的一个
存储方案,使得能够在磁带上存储尽可能多的程序。 编程任务:
对于给定的n个程序存放在磁带上的长度,编程计 算磁带上最多可以存储的程序数。
532.00
10
算法实现题4-6 最优服务次序问题
double greedy( vector<int> x) {
int i,n=x.size(); sort(x.begin(),x.end()); for(i=1;i<n;++i)
x[i] += x[i-1]; double t=0; for(i=0;i<n;++i) t+=x[i]; t /= n;
算法实现题4-5 程序存储问题
int greedy( vector<int> x, int m){
int i=0, sum=0, n=x.size();
sort(x.begin(),x.end());
while(i
if(sum <= m) i++;
算法设计与分析_第4章_贪心算法

1算法设计与分析第4章贪心算法2学习要点理解贪心算法的概念掌握贪心算法的基本要素(1)最优子结构性质(2)贪心选择性质理解贪心算法与动态规划算法的差异 理解贪心算法的一般理论3学习要点通过应用范例学习贪心设计策略(1)活动安排问题;(2)最优装载问题;(3)哈夫曼编码;(4)单源最短路径;(5)最小生成树;44背景Similar to dynamic programming. Used for optimization problems .Optimization problems typically go through a sequence of steps, with a set of choices at each step.For many optimization problems, usingdynamic programming to determine the best choices is overkill (过度的杀伤威力). 贪心算法: Simpler, more efficient5背景应用找钱四种硬币:1分,5分,1角,2角5分找六角3分,怎么给?排队时出现拥挤情况,如何做才能节省时间?6背景研究程卫芳,廖湘科,沈昌祥.有向传感器网络最大覆盖调度算法.软件学报,2009,20(4):975-984崔鹏,刘红静.测试集问题的集合覆盖贪心算法的深入近似.软件学报,2006,17(7):1494-1500刘勇,高宏,李建中.基于联合意义度量的Top-K 图模式挖掘.计算机学报,2010,2期:215-230 张海英,温玄,张田文.低信噪比多目标检测的贪心算法.计算机学报,2008,1期:142-1507贪心算法的基本要素贪心(Greedy)算法总是作出在当前看来最好的选择。
贪心算法并不从整体最优考虑,它所作出的选择只是在某种意义上的局部最优选择。
希望贪心算法得到的最终结果也是整体最优的。
第4章 贪心算法 计算机算法设计与分析(第3版)教学PPT课件

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章 贪心法

& 7
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
3 1 0 1 Pa2ge 263 4
4 4
7 6
• +HJ-solution
– D5+>&S?F#6+
• '9J-select
– G CAKG !E – 30':4$F#+ – ")28J-
• +HJ-feasible
– D5+>& ':? K,+>& I;?.7=@%
贪心法的一般过程
7 (*)906 42:
– 6 "#3 – -,!*);&'4"# – !. ;&6 +/ ( –
/ (#
8 "# ( 5%( ()
– (#$1 (#
4.1.4 贪心法的求解过程
三个步骤
3
•
建立模型(问题抽象化)
ō 冇㩀㩂⇗
%
! &"'" = )
(1. 3)
"#$
0 ≤ '" ≤ 1, 1 ≤ . ≤ /
ō 䧏㫨ⓞ㡑
%
max ! 8"'"
(1. 9)
"#$
ō 厭◦棏歹㈳冴ℛ⻜㕟⃡ℋ䇂悔冇㩀㩂⇗ㇰ猾ㅗ≠䧏㫨ⓞ
㡑ㇰ抟┑㧡Ⰸ䥥峄⛲撰 : = ('1, '2, … , '/)
QPNX:E
算法设计与分析讲义贪心法

贪心算法在每一步选择时都采取在当前状态下最好或最优( 即最有利)的选择,而不考虑可能出现的后果。
贪心算法与动态规划
贪心算法是一种局部最优策略,即每一步选择在当前状态下 是最优的,但不一定能够得到全局最优解。
动态规划是一种全局最优策略,通过将问题分解为子问题, 逐步求解得到全局最优解。
贪心算法的历史与发展
选择适当的贪心策略
选择适当的贪心策略可以最大程度 地减少计算时间。
空间优化
通过优化算法的空间复杂度,减少 算法的空间占用,以提高算法的效 率。
并行计算
利用并行计算技术,将算法并行化 ,以提高算法的运行速度。
数据结构优化
使用合适的数据结构可以加快算法 的执行速度,如哈希表、堆等。
06
贪心算法的应用扩展
贪心算法的优化策略
总结词
记忆化搜索、动态规划优化、全局状态决策
详细描述
贪心算法虽然能够得到问题的近似解,但在某些情况 下可能无法得到最优解。为了提高贪心算法的性能, 可以采用一些优化策略,例如记忆化搜索,将已经计 算过的状态存储下来,避免重复计算;动态规划优化 ,将问题分解为子问题,通过解决子问题来解决原问 题;全局状态决策,将问题的所有状态作为一个整体 来考虑,利用问题的整体性质来得到更好的解。
在资源分配问题中,贪心算法可以用于求解具有单位资源的最大权值
组合问题、分数背包问题等。
05
贪心算法的实现技巧
贪心算法的编程实现
确定贪心策略
根据问题特性确定贪心策略,通常选择最优解或近似最优解。
编码实现
将贪心策略转化为代码实现,通常使用循环和条件语句实现算 法。
测试样例
设计测试样例,覆盖各种情况,提高算法的健壮性和正确性。
计算机算法设计与分析 王晓东第 版

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.贪心算法

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;
算法设计与分析耿国华第四章

Chapter
4
4.1.5 贪心算法的例子 ——算法分析
1)贪心选择性质
证明:设背包按其单位价值量pi/wi由高到低排序,(x1,x2,…,xn) 是背包问题的一个最优解。又设 k m in i x 0 易知,如果给定问题有解,则 1 k n 。 当k=1, (x1,x2,…,xn)是以贪心算法开始的最优解。 当k>1, 设有一个集合(y1,y2,…,yn),其中y1=pk/p1*xk, yk=0, yi=xi ,2 i n . 则 w y w x w x w * p / p *x
Chapter
4
4.2 汽车加油问题
本节内容 1.问题分析 2.算法分析 3.设计与实现
Chapter
4
4.2 汽车加油问题
• 问题描述
一辆汽车加满油后可以行驶N千米。旅途中有若干个加 油站,如图4-1所示。指出若要使沿途的加油次数最少,设 计一个有效的算法,指出应在那些加油站停靠加油(前提: 行驶前车里加满油)。
Chapter
4
4.2 汽车加油问题 ——算法分析
2)最优子结构性质
•
当一个大问题的最优解包含着它的子问题的最优解时,称 该问题具有最优子结构性质。 (b[1],b[2],……b[n]) 整体最优解 b[1]=1,(b[2],b[3],……b[n]) 局部最优解 每一次加油后与起点具有相同的条件,每个过程都是相 同且独立。
•
Chapter
4
4.1.5 贪心算法的例子
•
(3)选利润/重量为量度,使每一次装入的物品应使它占用的每一 单位容量获得当前最大的单位效益。 按物品的pi/wi重量从大到小排序:1,2,0; 解为: (x0,x1,x2)=(0, 1, 1/2) 收益: 24+15/2=31.5 此方法解为最优解。可见,可以把pi/wi 作为背包问题 的最优量度标准。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
基本思想
哈夫曼编码
构造哈夫曼编码
哈夫曼提出构造最优前缀码的贪心算法,由 此产生的编码方案称为哈夫曼编码。 频率最高?
分析
排序 哈夫曼树
最短编码?
6
哈夫曼编码
可变长码的问题?
译码歧义:编码后的消息可能有多种译码方 式 对每一个字符规定一个0,1串作为其编码,并 且任一字符的编码都不是其它字符的编码的 前缀。这种编码称为具有前缀性质(或者前 缀码)。
18
哈夫曼编码
分析
初始化优先队列需要O(n)计算时间 最小堆的DeleteMin和Insert运算均需O(logn) 时间 n-1次的合并总共需要O(nlogn)计算时间。
哈夫曼算法的计算时间为O(nlogn) 。
19
哈夫曼编码
哈夫曼算法的正确性 证明哈夫曼算法的正确性,只要证明最 优前缀码问题具有如下两个性质: (1)贪心选择性质 (2)最优子结构性质。
11
哈夫曼编码
1. 初始: 2. 第1步:
3. 第2步:
12
哈夫曼编码
1. 初始: 2. 第2步:
3. 第3步:
13
哈夫曼编码
1. 初始: 2. 第3步:
3. 第4步:
14
哈夫曼编码
1. 初始: 2. 第4步:
3. 第5步:
选取最小 频率子树
15
哈夫曼编码 - 过程
贪什么
频率最小的两个字符
8
哈夫曼编码
(编码方案)平均码长定义为: 最优前缀码
使平均码长达到最小的前缀码编码方案称为 给定编码字符集C的最优前缀码。
哈夫曼树
表示最优前缀码的二叉树 总是一棵完全二叉树,即树中任一结点都有 2个儿子结点。
9
哈夫曼编码
C:编码字符集, C中任一字符以频率f(c)在 数据文件中出现.前缀编码方案对应于二 叉树T,字符c在T中的深度为dT(c) 最优编码树问题
构造哈夫曼编码树,并计算压缩后的编 码位数?
26
使用贪心策略的典型步骤
1)将原问题表述为一个 做出一个选择 然后剩下唯一一个子问题的形式 2)证明在所有的最优选择里面总有一个 是贪心选择 3)证明贪心选择加上对剩下子问题的最 优解就是原问题的最优解
27
分治、动态规划和贪心的比较
标准分治 适用类型 子问题结构 通用问题 每个子问题不同 动态规划 优化问题 很多子问题重复 贪心 优化问题 只有一个子问题
17
哈夫曼编码
n个字符的集合 频度f(c1),f(c2),…,f(cn)
Huffman(C,F) (使用堆操作实现) nC; O(n) QC; /* 用BUILD-HEAP 建立堆 */ for i1 to n-1{ //终止条件:n-1个节点全部生成 n-1 zAllocate-Node( ); xleft[z]Extract-MIN(Q); /* 堆操作*/ O(logn) yright[z]Extract-MIN(Q); /* 堆操作*/ O(logn) f(z)f(x)+f(y); insert(Q,z); } /* 堆操作*/ Return Extract-MIN(Q).
4
减少约 25%
变长码
频率越高,其编码越短,频率越低,编码越长
哈夫曼编码
哈夫曼编码
广泛地用于数据文件压缩的十分有效的编码 方法。压缩率通常在20%~90%之间。 用字符在文件中出现的频率表来建立一个用 0,1串表示各字符的最优表示方式。
将字符按照出现频率从高到低排序 给出现频率高的字符较短的编码,出现频率 较低的字符以较长的编码,以大大缩短总码 长。
证: 先证 B(T)=B(T’)+f(x)+f(y) vC-{x,y}, dT(v)=dT’(v)。于是f(v)dT(v)=f(v)dT’(v)。 由于dT(x)=dT(y)=dT’(z)+1, f(x)dT(x)+f(y)dT(y)=(f(x)+f(y))(dT’(z)+1)=(f(x)+f(y))dT’(z)+(f(x)+f(y)) 由于f(x)+f(y)=f(z), f(x)dT(x)+f(y)dT(y)=f(z)dT’(z)+(f(x)+f(y)).
3
哈夫曼编码
a 频率(千次) 45 定长码 000 变长码 0
b 13 001 101
c 12 010 100
d 16 011 111
e 9 100 1101
f 5 101 1100
定长码
45×3+13×3+12×3+16×3+9×3+5×3=300 45×1+13×3+12×3+16×3+9×4+5×4=224
输入:字母表C={c1,c2,....,cn} 频率表F={f(c1),f(c2),...,f(cn)} 输出:具有最小平均码长B(T)的C的前缀编 码树,即哈夫曼树。
10
哈夫曼编码
哈夫曼树
哈夫曼算法以自底向上的方式构造表示 最优前缀码的二叉树T。
算法以|C|个叶结点开始,执行|C|-1次的“ 合并”运算后产生最终所要求的树T
最优子结构
解决子问题数 子问题依赖性 求解顺序
不要求
全部子问题都要 解决 先选择后解决子 问题 递归与递推都可
必须满足
全部子问题都要 解决 先解决子问题后 选择 从底往上
必须满足
只要解决一个子 问题 先选择后解决子 问题 从顶往下
28
小结
重点
贪心算法的证明过程 方法
构造法,反证法,反证+构造法,数学归纳法
T x
T’ b
T” b
y
b c
y
x c
c
x y 21
哈夫曼编码-贪心性质证明
T y b x c y x
T’b c c xT”b yT是最优前缀树. 证: B(T)-B(T)= cCf(c)dT(c)-cCf(c)dT’(c)
= f(x)dT(x)+f(b)dT(b)-f(x)dT’(x)- f(b)dT’(b) = f(x)dT(x)+f(b)dT(b)-f(x)dT(b)- f(b)dT(x) = (f(b)-f(x))(dT(b)-dT(x)) ∵f(b)f(x),dT(b)dT(x) (因为b 的深度最大) ∴B(T)-B(T’)0, B(T)B(T’) 同理可证B(T’)B(T’’). 于是B(T)B(T’’). 由于T 是最优化的,所以B(T)B(T’’). 于是,B(T)=B(T’’),所以T’’是C 的最优化前缀编码树. 在T’’中, x 和y 具有相同长度编码, 而且仅最后一位不同。
22
哈夫曼编码 -最优子结构性质证明
引理2(最优子结构).设T 是字母表C 的最优前缀树,cC, f(c)是c 在文件中出现的频率。设x、y 是T 中任意两 个相邻叶结点,z 是它们的父结点,则z 看作为频率为 f(z)=f(x)+f(y)的字符,T’=T-{x,y}表示了字母表C’=C{x,y}∪{z}的最优前缀编码树。
001011101分解为0,0,101,1101,aabe
7
前缀码
例如
哈夫曼编码
通常用二叉树来作为前 缀编码的数据结构 编码树
叶结点:用字符及其出现 频率标记。 内结点(包括根结点):其 子树的叶子的频率和。 边标记: 一个结点的左侧边标记0, 右侧边标记1。
前缀码
从树根到树叶的一条路径
20
哈夫曼编码-贪心性质证明
引理1(贪心选择性). 设C 是字母表,cC,c具有频率 f(c), x、y 是C 中具有最少频率的两个字符,则存在 一个C 的最优前缀树,x 与y 的编码具有相同长度,且 仅在最末一位不同。
证: 设T 是一个C 的最优前缀树,且b 和c 是具有最大深度且为兄弟的 两个字符 不失一般性,设f(b)f(c),f(x)f(y). 因x 与y 是具有最低频率的字符, f(b)f(x),f(c)f(y)。 从T构造T,交换T’ 的y 和c; 从T 构造T,交换T 的b 和x;
于是 B(T)=B(T’)+f(x)+f(y)
若T’是C’的非最优前缀编码树, 则必存在T’’,使B(T’’)<B(T’).
23
哈夫曼编码 -最优子结构性质证明
证: 1)因为z 在C’中是一个字符,它必是T’’中 的叶子。把结点x 与y 加入T’’,作为z 的 子结点,则得到C 的一个如下的前缀编 码树T’’’ 2) T’’’代价为: B(T’’’)= ……+ (f(x)+f(y))(dT’’(z)+1) = ……+ f(z)dT’’(z)+(f(x)+f(y)) = B(T’’)+f(x)+f(y) < B(T’ )+f(x)+f(y) = B(T) 3) 与T是最优的相矛盾,故T’是最优的
ki k 2 i ki k2i 1 ki k 2 i ki k2i 1 (i 1,2,..., n / 2)
最小堆在构造优 先队列时使用
含义:
完全二叉树中所有非终端结点的值不大于(或不 小于)其左右孩子结点的值. 堆顶元素必为序列中n个元素的最小值(或最大值)