数据结构-哈夫曼树及其应用

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

15
40 a
30 b
5
c
10 d
15 e
二、哈夫曼树及其应用
2.哈夫曼树的求解过程 ③实例:已知有5个叶子结点的权值分别为:5 , 15 , 40 , 30 , 10 ;试画出一棵相应的哈夫曼树。
30
40 a
30 b
15
15 e
5
c
10 d
二、哈夫曼树及其应用
2.哈夫曼树的求解过程 ③实例:已知有5个叶子结点的权值分别为:5 , 15 , 40 , 30 , 10 ;试画出一棵相应的哈夫曼树。
WPL=∑wi*li最小的二叉树称为“最优
i=1 n
二叉树”或称为“哈夫曼树”。
二、哈夫曼树及其应用
2.哈夫曼树的值为{w1,w2,...wn},构 造一棵最优二叉树。
二、哈夫曼树及其应用
2.哈夫曼树的求解过程 ②方法:
步骤1:构造一个具有n棵二叉树的森林F={T1,T2,......,Tn}, 其中Ti是只有一个根结点且根结点的权值为wi的二叉树。 步骤2:在F中选取两棵其根结点的权值最小的二叉树,从F 中删除这两棵树,并以这两棵二叉树为左右子树构造一棵 新的二叉树添加到F中,该新的二叉树的根结点的权值为 其左右孩子二叉树的根结点的权值之和。 步骤3:判断F中是否只有唯一的一棵二叉树。若是,则求 解过程结束;否则,转步骤2。
二、哈夫曼树及其应用
3.哈夫曼编码 ②压缩编码:
例如:对于刚才的4个字符的编码问题,可以按如 下不等长编码方案进行编码: A: 0 B: 00 C: 1 D: 01 则对于电文“ABACCDA”的二进制电码为: 000011010 总长为9位 问题:译码时可能出现多意性,即译码不唯一:
二、哈夫曼树及其应用
三、实例
已知某通信用电文仅由A、B、C、D这4个字符构成, 其出现的频率分别为:8、4、6、2,请给出它们的哈夫 曼编码,要求写出相应的哈夫曼树。
解:根据哈夫曼算法,求得哈夫曼树如下:
20
0 A8
6
1
12
从根开始到叶子得各字 符的哈夫曼编码如下:
1
6
0 0
C
A :0 B:100
C:11 D:101
译码时,两位一分进行译码,可唯一得到电文: ABACCDA 。
二、哈夫曼树及其应用
3.哈夫曼编码 ②压缩编码: 即采用不等长的编码方案,将“高频字符”的 编码设计得尽可能短一些,把最长的编码留给“低 频字符”。 例如:对于刚才的4个字符的编码问题,可以按如 下不等长编码方案进行编码: A: 0 B: 00 C: 1 D: 01 则对于电文“ABACCDA”的二进制电码为: 000011010 总长为9位 问题:译码时可能出现多意性,即译码不唯一:
a<80 no a<90 yes 打印 “good" no 打印"excellent" 10%的学生 40%的学生 15%的学生 30%的学生
打印"general"
二、哈夫曼树及其应用
1.哈夫曼树的有关概念
①结点的路径长度: 从根结点沿某条路径到某结点途中所经历的弧的条数 称为该结点的路径长度。
② 树的路径长度: 从根结点到每一个叶子结点的路径长度之和。
n
作业:
1.假设用于通信的电文仅由6个字母 {A,B,C,D,E,F} 组成,这6个字母在电文中出现的频率高低依次为: 3,4,5,8,9,4,试为这6个字母设计哈夫曼编码。 2.证明:若哈夫曼树中有n个叶子结点,则该哈夫曼树 中共有2n-1个结点。(提示:哈夫曼树中无度数为 1的结点,则利用教材第124页二叉树的性质3即可得 证)
哈夫曼树 及其应用
一、问题的提出
设有10000个学生某门课程的考试成绩的分布如 下表所示:
学生成绩数据分布情况表
分数 学生比例数 0~59 0.05 60~69 70~79 80~89 90~100 0.15 0.40 0.30 0.10
*问题:现在要编写程序依次根据每个学生的成绩 打印出该学生的成绩等级。
③结点的带权路径长度: 某结点的路径长度与该结点上的权值的乘积称为该结 点的带权路径长度。 ④ 树的带权路径长度(WPL): 树中所有叶子结点的带权路径长度之和称为树的带权 路径长度。
二、哈夫曼树及其应用 树的带权路径长度为:
树的带权路径长度为: 1.哈夫曼树的有关概念 树的带权路径长度为: WPL=2*4+3*7+3*5+1*2=46 WPL=1*7+2*5+3*2+3*4=35 WPL=2*7+2*5+2*2+2*4=36 实例:已知某二叉树的四个叶子结点 a,b,c,d
分别带权7,5,2,4,则可构造出有如下几 种不同形式的二叉树:
2 7
c
4 7 5 2 4
a
5
d d
7 5
b a b
a
b
c
2
4
c
d
二、哈夫曼树及其应用
1.哈夫曼树的有关概念
⑤哈夫曼树的定义:
设有n个叶子结点的二叉树,其第i个 叶子结点的权值为wi(i=1,2,3,...n),且第i个 叶子结点的路径长度为li ,则使
a<80 no a<90 yes 打印 “good" no 打印"excellent" 10%的学生 40%的学生 15%的学生 30%的学生
打印"general"
思考:如何找到一棵最优的判断树使得编写 出来的程序的运行时间是最高效的?
读取一个学生成绩→a
方法2:
循环一万次
a<70 yes a<60 yes 打印"bad" 5%的学生 no 打印"pass" no yes
End
二、哈夫曼树及其应用
3.哈夫曼编码 ①等长编码:
设这4个不同的字符为A,B,C,D,则可进行 等长编码如下:
二、哈夫曼树及其应用
3.哈夫曼编码 ①等长编码: 设这4个不同的字符为A,B,C,D,则可进行 等长编码如下: A: 00 B: 01 C: 10 D: 11
则对于电文“ABACCDA”的二进制电码为: 00010010101100 总长为14位
学生成绩数据分布情况表
分数 0~59 60~69 70~79
学生比例数
0.05
0.15
0.40
共做31500 80~89 90~100 次比较
0.30 0.10
读取一个学生成绩→a
方法1:
yes 打印"bad"
a<60 no a<70 yes 打印"pass" yes 打印"general" yes 5%的学生 15%的学生 40%的学生 30%的学生 打印"good" no 打印"excellent" 10%的学生 no a<80 no a<90
60
40 a
30 b
30
15
15 e
5
c
10 d
二、哈夫曼树及其应用
2.哈夫曼树的求解过程 ③实例:已知有5个叶子结点的权值分别为:5 , 15 , 40 , 30 , 10 ;试画出一棵相应的哈夫曼树。
40 a 60 100
30 b
30
15
15 e
5
c
10 d
二、哈夫曼树及其应用
3.哈夫曼编码 ①等长编码: 以英文字符编码为例,一般英文字符编码是采 用7位二进制数编码(ASCII码)。7位二进制数可 以为27个不同的英文字符编码。 下面为讨论问题简单起见,假设被编码的字符 集中只有4个(即22个)不同字符,故只要两位二 进制数即可完成编码。 设这4个不同的字符为A,B,C,D,则可进行 等长编码如下:
二、哈夫曼树及其应用
2.哈夫曼树的求解过程 ③实例:已知有5个叶子结点的权值分别为:5 , 15 , 40 , 30 , 10 ;试画出一棵相应的哈夫曼树。
15
40 a
30 b
5
c
10 d
15 e
二、哈夫曼树及其应用
2.哈夫曼树的求解过程 ③实例:已知有5个叶子结点的权值分别为:5 , 15 , 40 , 30 , 10 ;试画出一棵相应的哈夫曼树。
1
2
B 4
D
则对于电文“ABACCDA”的二 进制电码为: 0100011111010 总长为13位
四、小结:
1.哈夫曼树的引入:程序优化问题。 2.哈夫曼树的定义:
WPL=∑wi*li最小的二叉树称为“最优二叉树”或 i=1 称
为“哈夫曼树”。 3.哈夫曼树求解的算法思想:3个步骤。 4.哈夫曼树的应用:哈夫曼编码的设计问题。
思考:如何解 3.哈夫曼编码 决这一问题? ②压缩编码: 问题的关键在于编码 例如:对于刚才的4个字符的编码问题,可以按如 是否为无前缀编码。 下不等长编码方案进行编码:
A: 0 B: 00 C: 1 D: 01 则对于电文“ABACCDA”的二进制电码为: 000011010 总长为9位 问题:译码时可能出现多意性,即译码不唯一。 如000011010中的前4个0的译码会有如下几种不 同译码: 0000→AAAA;0000→ABA;0000→BB
循环一万次
学生成绩数据分布情况表
分数 学生比例数 0~59 0.05 60~69 70~79 0.15 0.40
共做22000 80~89 次比较 90~100
0.30 0.10
读取一个学生成绩→a
方法2:
循环一万次
a<70 yes a<60 yes 打印"bad" 5%的学生 no 打印"pass" no yes
二、哈夫曼树及其应用
3.哈夫曼编码 ③无前缀压缩编码(既哈夫曼编码): *思想:利用哈夫曼树设计出来的不等长的编码方 案一定是无前缀的。 *方法:
步骤1:将各字符按照其“出现频率”的统计数字安排 一个“权值”并作为“叶子”,并求出相应的哈夫曼树;
步骤2:树中各结点到其左孩子的边上的权值设为0、到 其右孩子的边上的权值设为1(即所谓左0右1); 步骤3:从根开始到“叶子”所经历的边上的数值的序 列即为该“叶子”所对应的字符的编码。
相关文档
最新文档