算法设计与分析_第4章_贪心算法2

合集下载

第4章贪心算法习题(免费阅读)

第4章贪心算法习题(免费阅读)
6
算法实现题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章_贪心算法

算法设计与分析_第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章 贪心算法 计算机算法设计与分析(第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章 贪心法

算法设计与分析:第4章 贪心法
! 4 5! 1"
& 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.贪心算法

(算法分析与设计)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 作为背包问题 的最优量度标准。

《计算机算法设计与分析》PPT第四章贪心算法资料

《计算机算法设计与分析》PPT第四章贪心算法资料
11
假设活动已按结束时间的单调非递减顺序排序 f0≤f1≤f2≤… ≤fn<fn+1
则,当i≥j时, Sij=φ。
假设存在一活动ak∈Sij,其中i≥j,则在已排的序列中 ai在aj后面。
因fi≤sk<fk≤sj<fj ,与在已排的序列中ai在aj后面的 假设相矛盾。
所以,设活动按结束时间的单调非递减顺序排序,子 问题空间被用来从sij中选择最大相容活动子集,其中 0≤i<j≤n+1,而且所有其它的sij是空的。
14
步骤2:递归地定义最优解的值 设c[i, j]为Sij中最大相容子集中的活动数。当 Sij=φ时,c[i, j] = 0。对于一个非空子集Sij, 如果ak在Sij的最大相容子集中被使用,则子问 题Sik和Skj的最大相容子集也被使用。从而:
c[i, j] = c[i, k] + c[k, j] + 1
活动安排问题:要在所给的活动集合中选出最大 的相容活动子集合。
10
用动态规划方法求解
步骤1:分析最优解的结构特征 构造子问题空间 Sij={ ak∈S: fi≤sk<fk≤sj} Sij是S中活动的子集,其中每个活动都在活动ai 结束之后开始,且在活动aj开始之前结束。 Sij包含了所有与ai和aj相容的活动,并且与不迟 于ai结束和不早于aj开始的活动相容。此外, 虚构活动a0和an+1,其中f0=0, Sn+1=∞。原 问题即为寻找S0,n+1中最大相容活动子集。
(5)约束函数constraint:检查解集合中加入一 个候选对象是否满足约束条件。例如,在找零钱 问题中,约束函数是每一步选择的货币和已付出 的货币相加不超过应找零钱。
7
贪心算法的一般框架

算法设计与分析讲义贪心法

算法设计与分析讲义贪心法

贪心算法的历史与发展
01
贪心算法源于1944年数学家John von Neumann在博弈论中的“Oligopoly” 算法,用于解决多人零和博弈问题;
02
1954年,Garey和Johnson提出了贪心算法的基础概念和方法,并成功应用于 解决一些组合优化问题;
03
随着计算机科学和人工智能的快速发展,贪心算法在许多领域得到了广泛应用 和发展,例如最短路径问题、最小生成树问题、作业调度问题等。
找零问题
总结词
最优找零策略,时间复杂度为O(logn)
详细描述
在找零时,贪心算法可以帮助我们制定最优找零策略,通过计算货币单位的最小公倍数,将找零的货 币单位从小到大排序,然后依次考虑每个货币单位,直到找零的总额达到商品价格为止。
背包问题
总结词
最优解,时间复杂度为O(nW),其中n为物品数量,W为背包容量
06
总结与展望
贪心算法的优缺点
• 优点 • 简单易懂:贪心算法的思路通常比较直观,易于理解,适合初学者快速上手。 • 高效:在某些情况下,贪心算法的执行效率可以非常高,例如对于一些最优子结构的问题,时间复杂度可
以达到 O(n)。 • 适用范围广:贪心算法可以应用于许多不同类型的问题,具有较广的适用性。 • 缺点 • 正确性难以保证:对于某些问题,贪心算法可能无法得到正确的结果,因为它们不能保证全局最优。 • 不一定收敛:贪心算法在某些情况下可能不收敛,不能得到最终的解。 • 需要良好的初始化:贪心算法通常需要一个良好的初始化,否则可能会陷入局部最优解。
贪心算法未来的发展方向
• 理论研究 • 研究贪心算法的理论基础,探讨其适用范围和限制,以更好地理解其性质和行为。 • 深入研究贪心算法在不同类型问题中的应用,拓展其应用范围。 • 研究贪心算法与其他算法之间的关系和比较,以更全面地了解各种算法的优势和劣势。 • 应用研究 • 在实际应用中,研究如何更好地利用贪心算法来解决各种问题,提高其解决问题的效率和性能。 • 研究如何将贪心算法与其他算法相结合,以充分发挥各自的优势,提高解决问题的效率和正确性。 • 计算复杂性研究 • 研究贪心算法的时间复杂度和空间复杂度,以更好地了解其计算效率和资源占用情况。 • 研究如何优化贪心算法的实现,提高其计算效率和可扩展性。

算法分析与设计实验二贪心算法

算法分析与设计实验二贪心算法

算法分析与设计实验二贪心算法贪心算法(Greedy Algorithm)是一种常用的算法设计方法,其核心思想是在每一步都做出当前情况下最优选择,以期望最终得到全局最优解。

本实验主要介绍贪心算法的原理、应用和分析。

一、贪心算法的原理贪心算法的基本思路是在每一步都做出当前情况下最优选择,并且不考虑当前选择对后续选择的影响。

贪心算法通常采用贪心选择策略和最优子结构两个基本要素。

1.贪心选择策略贪心选择策略是指在每一步都选择当前情况下最优解的策略。

这种策略要求我们能够证明,通过选择当前最优解,可以使得问题的规模减小到原问题的一个子问题,并且该子问题的最优解一定包含在全局最优解中。

2.最优子结构最优子结构是指问题的最优解包含其子问题的最优解。

贪心算法求解问题的过程通常包括两个步骤,选择最优子结构和利用最优子结构得到最优解。

二、贪心算法的应用1.集合覆盖问题集合覆盖问题是指在给定的一组集合中,找出最小的子集合,使得这些子集合的并集包含所有的元素。

贪心算法可以通过每一步选择包含最多未覆盖元素的集合,直到覆盖所有元素为止。

2.挑选活动问题挑选活动问题是指在给定一组活动的起始时间和结束时间,找出最大的相容活动子集合。

贪心算法可以通过每一步选择结束时间最早的活动,之后将该活动与其他相容的活动进行比较,从而得到最大的相容活动子集合。

3.分数背包问题分数背包问题是指在给定一组物品和一个背包容量的情况下,选择部分物品放入背包,使得放入背包的物品总价值最大。

贪心算法可以通过每一步选择单位重量价值最高的物品,直到背包容量不足为止。

三、贪心算法的分析贪心算法通常具有高效性和近似最优性的特点。

由于贪心算法每一步都选择当前最优解,不进行回溯和剪枝的操作,因此贪心算法的时间复杂度较低。

然而,贪心算法并不总能得到问题的最优解,它通常只能得到近似最优解。

贪心算法的近似性证明可以分为两步。

首先,我们需要证明贪心选择策略的正确性,即每一步选择的最优解一定包含在全局最优解中。

计算机算法设计与分析(王晓东第4版)第4章

计算机算法设计与分析(王晓东第4版)第4章
School of Computer and Communication Engineer 30
23
最优解代价公式
c[i, j ]: Sij 最优解的大小 c[i, j ] = 0 if Sij = φ maxak ∈Sij {c[i, k ] + c[k, j ] + 1} if Sij = φ
School of Computer and Communication Engineer
24
活动选择问题动态规划方法
schoolcommunicationengineer一步一步构建问题的最优解决方案其中每一步只考虑眼前的最佳选择对解空间进行搜索时在局部范围内进行择优选取决定下一步搜索方向不是为了找到全部解而只是找出一种可行解在一定的情况下贪心算法找出的可行解将是最优解schoolcommunicationengineer42贪贪贪心心心算算算法法法基基基本本本要要要素素素算法包含一系列步骤每一步都有一组选择做出在当前看来最好的选择一个贪心算法是否产生最优解需要严格证明schoolcommunicationengineer最优子结构schoolcommunicationengineer贪贪贪心心心选选选择择择性性性质质质定定定义义义若若若一个优化问题的全局最优解可以通过局部最优选择得到则该问题称为具有贪贪贪心心心选选选择择择性性性
School of Computer and Communication Engineer 4
4.2 贪 心 算 法 基 本 要 素
• 算法包含一系列步骤, 每一步都有一组选择, 做出在 当前看来最好的选择 • 希望通过作出局部最优选择达到全局最优选择 • 一个贪心算法是否产生最优解, 需要严格证明
School of Computer and Communication Engineer

算法设计与分析论文(贪心算法)

算法设计与分析论文(贪心算法)
3.1 贪心选择
贪心选择是指所求问题的整体最优解可以通过一系列局部最优的选择,即贪 心选择来达到。这是贪心算法可行的第一个基本要素,也是贪心算法与动态规划 算法的主要区别。
贪心选择是采用从顶向下、以迭代的方法做出相继选择,每做一次贪心选择 就将所求问题简化为一个规模更小的子问题。对于一个具体问题,要确定它是否 具有贪心选择的性质,我们必须证明每一步所作的贪心选择最终能得到问题的最 优解。通常可以首先证明问题的一个整体最优解,是从贪心选择开始的,而且作 了贪心选择后,原问题简化为一个规模更小的类似子问题。然后,用数学归纳法 证明,通过每一步贪心选择,最终可得到问题的一个整体最优解。
物品超出背包容量为止。伪代码如下:
public static void DepWePr(double[][] a, double c, int[] ans) { // depend on
// the // weight // and price double[] w = new double[a[0].length]; // the weight of goods System.arraycopy(a[0], 0, w, 0, w.length); // copy the array
贪心算法
——不在贪心中爆发,就在贪心中灭亡 徐晓龙 武汉理工大学计算机科学与技术学院软件 ZY1101 班
摘要
本文介绍贪心算法的基本意义以及算法的使用范围,并通过具体的案例来分 析贪心算法的具体应用,从而指出其特点和存在问题。 关键字:贪心算法,贪心策略,TSP、0/1 背包
引言
我们用了 13 周的时间学完了《算法设计与分析》这本书。这本书中涵盖了 大量的常见算法,包括蛮力法、分治法、动态规划法、贪心算法等等。我最有印 象的就是贪心算法。贪心算法是一种有合理的数据组织和清晰高效的算法,它简 单有效。下面我们来详细解读一下这个算法。

算法设计与分析课件--贪心法-最小生成树问题

算法设计与分析课件--贪心法-最小生成树问题

6
4.5 最小生成树问题
◼ Prim算法思想:
❖Prim算法利用了最小生成树的上述性质。 ❖ 算法的关键是如何找出连接U和V-U所有边中的权值 最小的边(u, v),并将v加入到U中。循环执行上述操作, 直至U=V为止。
7
4.5 最小生成树问题
◼ Prim算法设计:
❖ 设G=(V,E)是具有n个结点的无向连通带权图;设最 小生成树T=(U,TE),算法结束时U=V,TE包含于E
点的无向连通带权图,U是
V的一个非空子集。最小生
成树的一个很重要的性质:
✓ (u, v)是一条具有最小权 值 的 边 , 其 中 u∈U , v∈V-U,则必存在一棵包
假设最小生成树T不包括(u,v)。 将(u,v)添加到T上产生回路, 将回路中另外一条边(u’,v’)去 掉得到另外一个树T’
含 边 (u , v) 的 最 小 生 成 树 。
◼ Prim算法的求解示例:
18
4.5 最小生成树问题
◼ Prim算法的求解示例:
19
4.5 最小生成树问题
◼ Prim算法的求解示例:
20
4.5 最小生成树问题
◼ Prim算法的求解示例:
21
4.5 最小生成树问题
◼ Prim算法的求解示例:
22
4.5 最小生成树问题
◼ Prim算法的求解示例:
◼ Prim算法空间复杂性:
❖定义了辅助变量Q,其占用空间为|V|,从而空间复 杂度为O(|V|)。
27
4.5 最小生成树问题
◼ Prim算法的正确性证明:
❖最优子结构性质:假设最小生成树为T,从V-U集合中 添加到集合U中的结点顺序为< u0, …, ui, …, un-1, un>, 需要证明: 顺序< u0, …, ui, …, un-1>亦为图G’=(V\{un}, E\{e})最小生成树T’ ,其中e={原图G中与结点un相连 的边}。
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
5

基本思想

哈夫曼编码

构造哈夫曼编码

哈夫曼提出构造最优前缀码的贪心算法,由 此产生的编码方案称为哈夫曼编码。 频率最高?


分析

排序 哈夫曼树

最短编码?

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个元素的最小值(或最大值)
相关文档
最新文档