数据结构第15讲赫夫曼树及其应用
赫夫曼树的应用

赫夫曼树的应用摘要:随着计算机的普遍应用与日益发展,其应用早已不局限于简单的数值运算,而涉及到问题的分析、数据结构框架的设计以及设计最短路线等复杂的非数值处理和操作。
算法与数据结构的学习就是为以后利用计算机资源高效地开发非数值处理的计算机程序打下坚实的理论、方法和技术基础。
而数据的压缩在数据结构应用中占有很重要的地位。
本文就主要以赫夫曼压缩算法来分析数据的压缩存储。
在运用赫夫曼算法中,首先对字符串进行编码,然后对已编码的密文进行解码。
在该设计中把数据压缩过程称为编码,解压缩的过程称为译码。
此程序中建立了赫夫曼树,并利用建好的赫夫曼树对文件中的正文进行编码,对文件中的代码进行译码,显示输出等功能。
关键字:数据结构赫夫曼树赫夫曼编码译码一.引言赫夫曼编码是一种编码方式,赫夫曼编码是可变字长编码的一种。
赫夫曼压缩是个无损的压缩算法,一般用来压缩文本和程序文件。
赫夫曼压缩属于可变代码长度算法一族。
意思是个体符号(例如,文本文件中的字符)用一个特定长度的位序列替代。
因此,在文件中出现频率高的符号,使用短的位序列,而那些很少出现的符号,则用较长的位序列。
赫夫曼编码的应用很广泛,利用赫夫曼树求地的二进制编码称为赫夫曼编码。
赫夫曼树中从根到每个叶子都有一条路径,对路径上的各分支约定:指向左子树的分支表示“0”码,指向右子树的分支表示“1”码,取每条路径上的“0”或“1”的序列作为对应的编码,这就是赫夫曼编码。
我们在对一些问题进行求解时,会发现有些问题很难找到规律,或者根本无规律可寻。
对于这样的问题,可以利用计算机运算速度快的特点,先搜索查找所有可能出现的情况,再根据题目条件从所有可能的情况中,删除那些不符合条件的解。
由赫夫曼算法的定义可知,初始森林中共有n棵只含有根结点的二叉树。
算法的的第二步是:算法的的第二步是:将当前森林中的两棵根结点权值最小的二叉树,合并成一棵新的二叉树,每合并一次,森林中就减少一棵树,产生一个新结点。
哈夫曼树.ppt

n
w i pi
最小,其中
i 1
Wi是第i个字符的使用频度,而Pi是第i个字符的编码长度, 这正是度量报文的平均长度的式子。
2020/3/5
21
例2:要传输的电文是{CAS;CAT;SAT;AT}
要传输的字符集是 D={C,A,S,T, ;}
每个字符出现的频率是W={ 2,4, 2,3, 3 }
PL=0+1+1+2+2=6
2020/3/5
9
问题2:什么样的带权树路径长度最小?
例如:给定一个权值序列{2,3,4,7},可构造的多种 二叉树的形态。
2
3
4
7
2 34 7
(a) WPL=2×2+2×3+2×4+2×7=32 (b) WPL=1×2+2×3+3×4+3×7=41
2020/3/5
7
4
3
2
(c) WPL=1×7+2×4+3×3+3×2=30
10
哈夫曼树的构造
例:给定权值{7,5,2,4},构造哈夫曼树。
6
方法: 75 2 4
75
(1)a 初始b化:由c 原始d数据生成森林a ; b c
d
(次2小)的找二最叉小(树a树) 作:为在左森右林子中树选构取造两一棵棵根新结的点二权叉值树最(,小b)其的根和
A)先序遍历
B)中序遍历
C)后序遍历
D)从根开始进行层次遍历
2、某二叉树的先序序列和后序序列正好相反,则该二叉
树一定是( B )的二叉树。
A)空或只有一个结点
B)高度等于其结点数
C)任一结点无左孩子
D)任一结点无右孩子
哈夫曼树的实际应用

哈夫曼树的实际应用
哈夫曼树(Huffman Tree)是一种重要的数据结构,它在信息编码和压缩、数据传输和存储、图像处理等领域有广泛应用。
1. 数据压缩:哈夫曼树是一种无损压缩的方法,能够有效地减小数据的存储空间。
在进行数据压缩时,可以使用哈夫曼树构建字符编码表,将出现频率较高的字符用较短的编码表示,而出现频率较低的字符用较长的编码表示,从而减小数据的存储空间。
2. 文件压缩:在文件压缩领域,哈夫曼树被广泛应用于压缩算法中。
通过构建哈夫曼树,可以根据字符出现的频率来生成不同长度的编码,从而减小文件的大小。
常见的文件压缩格式如ZIP、GZIP等都使用了哈夫曼树。
3. 图像压缩:在图像处理中,哈夫曼树被用于图像压缩算法中。
通过将图像中的像素值映射为不同长度的编码,可以减小图像的存储空间,提高图像传输和存储的效率。
常见的图像压缩格式如JPEG、PNG等都使用了哈夫曼树。
4. 文件传输:在数据传输中,哈夫曼树被用于数据压缩和传输。
通过对数据进行压缩,可以减小数据的传输时间和带宽占用。
在传输过程中,接收方可以通过哈夫曼树解码接收到的数据。
5. 数据加密:在数据加密中,哈夫曼树可以用于生成密钥,从而实现数据的加密和解密。
通过将字符映射为不同长度的编码,可以实
现对数据的加密和解密操作。
哈夫曼树在信息编码和压缩、数据传输和存储、图像处理等领域有广泛应用,能够有效地减小数据的存储空间、提高数据传输效率、实现数据加密等功能。
哈夫曼树

F
K
11110
111111 110
F 24
0
Z 2
1
K 7
L
U
Z
100
111110
哈夫曼编码的效率。
我们定义该编码方案的平均编码长度为: B(T)=(c1p1+ c2p2 +…+ cnpn)/pt 其中: ci和pi是字符集中第i个字符的代码长度及 其相对频率,pt是字符集的总频率。对本例计算平 均编码长度≈2.565 若采用固定长度编码,每个字母需log28=3位, 而哈夫曼编码只需2.565位,节省空间约12%。 哈夫曼编码对于典型的文本文件将比ASCII编 码节省约40%的空间。
用途:用于通信和数据传送中字符的二进制编码,可以 使文件编码总长度最短。 例字符集: C D E F K L U Z 频 率:32 42 120 24 7 42 37 2
306
0
1 186
C D E
1110 101 0
E 79 0 1 120 0 U D 37 42
1 107 1 65 0 1 L 0 33 42 C 0 1 9
哈夫曼树及其应用
1.问题的提出
在程序设计中,常用一个代码来表示一个 元素,标准ASCII码就是一个例子。它用log2128 即7位提供了128个不同的代码来表示ASCII表中 的128个字符。假设所有代码都等长,则表示n 个不同的代码需要log2n位,称为固定长度编码 (如ASCII码)。如果每个字符的使用频率相等, 则固定长度编码的空间效率最高。但事实上,每 个字符的使用频率并非一样。
if (socre<60) printf(“bad”); else if (socre<70) printf(“pass”); else if (score<80) printf(“general”); else if (score<90) printf(“good”); esle printf(“very good”);
赫夫曼树的作用及应用

赫夫曼树的作用及应用1.引言在计算机科学中,赫夫曼树是一种重要的数据结构,它被广泛应用于数据压缩、存储和解码等领域。
赫夫曼树以其高效的特点,成为了压缩算法中的重要组成部分。
本文将介绍赫夫曼树的作用以及它在不同应用领域中的具体应用。
2.赫夫曼树的基本概念赫夫曼树,也称为最优二叉树,是一种树形结构。
它的构建基于赫夫曼编码算法,该算法通过将频率较高的字符编码为较短的二进制码,从而实现数据的高效压缩。
3.赫夫曼树的构建赫夫曼树的构建过程包括以下几个步骤:1.统计字符频率:遍历待压缩的数据,统计各个字符出现的频率。
2.构建叶子节点:将每个字符及其频率作为叶子节点,构成初始的二叉树。
3.合并节点:选择两个频率最低的节点合并,并将合并后的节点作为新的节点插入二叉树中。
4.重复合并:重复执行合并节点的操作,直到只剩下一个节点,即赫夫曼树的根节点。
4.赫夫曼树的作用赫夫曼树在数据压缩和解压缩中发挥着重要作用,主要体现在以下几个方面:4.1数据压缩赫夫曼树通过赫夫曼编码将频率较高的字符编码为较短的二进制码,从而实现数据的高效压缩。
压缩后的数据体积大大减小,方便存储和传输。
4.2文件压缩赫夫曼树可用于对文件进行压缩,将文件中的字符编码为对应的二进制码,从而减小文件的大小。
在文件传输和存储中,减小文件的大小可以提高传输速度和节省存储空间。
4.3图像压缩赫夫曼树也可用于图像数据的压缩,通过对图像中的像素进行编码,减小图像的大小。
图像压缩在图像处理和存储中起到重要的作用,减小图像的大小可以提高图像的传输速度和存储效率。
4.4视频压缩赫夫曼树在视频编码中也有重要应用,通过对视频帧中的数据进行编码,实现对视频的压缩。
视频压缩可以降低视频的带宽占用率,提高视频传输的效率和稳定性。
5.赫夫曼树的应用举例除了数据压缩方面,赫夫曼树在其他领域也有广泛应用,以下列举几个常见的应用场景:5.1字符串匹配赫夫曼树可以用于字符串匹配算法中,通过构建赫夫曼树和相关数据结构,提高字符串匹配的效率和准确性。
哈夫曼树及其应用

1 0 3 4 B A
1 4 S
C
由Huffman树得Huffman编码为: T B A C S
00 01 10
110 111
出现频率越大的字符,其 Huffman编码越短。
0 3 T 0 6
14 1 0 3 4 B A
1
8
0 2
1 4
S
1 2
C
在一个字符集中,任何一个字符的编码都不是另一个 字符编码的前缀,这种编码称为前缀编码。 我们可以利用二叉树来设计二进制的前缀编码。 约定左分支表示字符‘0’,右分支便是字符‘1’,则可 以用从根结点到叶子结点的路径上的分支字符串作为 该叶子结点字符的编码。如此得到的编码比是前缀编 码。 证明: 假设某一个叶子x结点的编码是另一个叶子结点y 编码的前缀,说明从根结点到叶子结点y中间需经过结 点x,从而说明x有左或右子树,这与x是叶子结点矛盾。 那么现在求最短的二进制编码实际上就是构造哈 夫曼树的过程,由此得到的二进制编码,称哈夫曼编 码。
HuffNode[n+i].weight:= HuffNode[x1].weight+HuffNode[x2].weight; HuffNode[n+i].lchild:=x1; HuffNode[n+i].rchild:=x2; end;
end;
const Maxleaf=128; {定义最多叶结点数}
begin
for j:=HuffCode[i].start+1 to n-1 do write(HuffCode[i].bit[j]:10); writeln; end; end;
1. 掌握二叉树的结构特性,了解相应的证明方法。 2. 熟悉二叉树的各种存储结构的特点及适用范围。 3. 遍历二叉树是二叉树各种操作的基础。实现二叉树遍历的具 体算法与所采用的存储结构有关。 4. 理解二叉树线索化的实质是建立结点与其在相应序列中的前驱 或后继之间的直接联系。二叉树的线索化过程是基于对二叉树进
哈夫曼树及其应用

A
B
C
DE
FG
40% 30% 10%
HI
5% 15%
n
WPL= wi*li i=1
n为叶子结 点的数目
wi和li分别表示叶结点ki的权 值和根到ki的路径长6度
哈夫曼树概念
哈夫曼树(最优二叉树) 在权为w1,w2,……,wn的n个叶结点的所有二叉
树中,WPL最小的二叉树称为最优二叉树或哈夫曼树。 例:给定4个叶结点a,b,c,d,分别带权7,5,2,4,我们来构造3棵二叉树:
17
哈夫曼树构造
哈夫曼树的构造算法实现
Void CreateHT (hufmtree Tree)
{
int i,p1,p2;
InitHT(Tree);
// 初始化
InputW(Tree);
// 输入权值
for (i = n;i<2n-1;i++){ // n-1次合并 SelectMin(Tree,i-1,&p1,&p2);
Tree[p1].parent=Tree[p2].parent=i; Tree[i].lchild = p1; Tree[i].rchild = p2; Tree[i].weight = Tree[p1].weight +Tree[p2].weight; } }
18
哈夫曼编码
哈夫曼树的应用—哈夫曼编码
N
中等
A<90
Y
N
良好
优秀
70-79 中等 40%
80-89 良好 30%
90-100 优秀 10%
A<80
Y
N
A<70
Y A<60
数据结构-哈夫曼树及其应用

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位 问题:译码时可能出现多意性,即译码不唯一:
二、哈夫曼树及其应用
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
2021/3/1
18
利用二叉树设计二进制的前缀编码
假设有一棵如左图所示的二叉树,
0
1
四个叶结点分别表示A、B、C、D四
a
个字符,且约定左分支表示字符‘0’,
0
1
右分支表示字符‘1’,则可以从根结
c
0
1 点到叶子结点的路径上以分支字符
组成的字符串作为该叶子结点的编
bd
码。可以证明,如此得到的必为二
例:有四个叶子结点a,b,c,d,分别带权为9、4、5、 2,由它们构成三棵不同的二叉树。
2021/3/1
5
a bc 9 45
a
4b
9a
d
2d
5c
2
5c a9
4b d2
b
c
a) WPL=9×2 +4×2+5×2+2×2=40 b) WPL=4×1+2×2+5×3+9×3=50 c) WPL=9×1+5×2+4×3+2×3=37
字符:A B A C C D A
A B C D的编码分别为:0、00、1、01
电文:
000011010
?
电文总长度为:9
2021/3/1
无法译码!为此引 入前缀编码的概念
17
2)前缀编码
若对某一字符集进行不等长编码,则要求字符 集中任一字符的编码都不能是其他字符编码的前 缀。符合此要求的编码叫做前缀编码。
开关键
传统机械按键设计要点:
1.合理的选择按键的类型,尽量选择 平头类的按键,以防按键下陷。
2.开关按键和塑胶按键设计间隙建议 留0.05~0.1mm,以防按键死键。
3.要考虑成型工艺,合理计算累积公 差,以防按键手感不良。
若采用不等长编码,让出现频率高的字符具有 较短的编码,让出现频率低的字符具有较长的编 码,这样有可能缩短传送电文的总长度。
进制前缀编码。
如何得到电文总长最短的二进制前缀编码呢?
2021/3/1
19
3)赫夫曼编码
设计电文总长最短的二进制前缀编码即: 以 n种字符出现的频率作权,设计一棵赫夫曼 树的问题,由此得到的二进制前缀编码称赫夫曼 编码。
2021/3/1
20
例:设通信用的电文由字符集{a,b,c,d,e,f,g,h}中的 字母构成,这8个字母在电文中出现的概率分别为 { 0.07, 0.19, 0.02, 0.06, 0.32, 0.03, 0.21, 0.10 },试 为这8个字母设计哈夫曼编码。
电文:00010010101100 电文总长度为:14
2021/3/1
14
如何能缩短传送电文的 总长度,从而节省传送 时间呢?
2021/3/1
15
1.什么是传统机械按键设计?
传统的机械按键设计是需要手动按压按键触动PCBA上的开关按键来实现功 能的一种设计方式。
传统机械按键结构层图:
按键
PCBA
在解决某些判定问题时,利用赫夫曼树可以得到 最佳判定算法。
例:编制一将学生百分成绩按分数段分级的程序。
若学生成绩分布是 均匀的,可用图(a) 二叉树结构来实现。
Y a<60 N
不及格
a<70
Y
N
及格
Y a<80 N
中等 Y a<90 N
(a)
良好
优秀
2021/3/1
9
学生成绩分布不是均匀的情况:
分数 0—59 60—69 70—79 80—89 90—99
3) 从F中删去这两棵树,同时加入刚生成的新树;
4) 重复(2)和(3)两步,直至F中只含一棵树为止。
2021/3/1
7
第一步: 9 a 4 b 5 c 2 d
第二步: 9 a 5 c
6
第三步:
4b
d2
9a 5c
11 6
第四步:
9a
4b 20
11
d2
5c
6
2021/3/1
4b
d2
8
3.判定树 (赫夫曼树的应用之一)
2021/3/1
2
2)结点的权和带权路径长度 在许多应用中,常常将树中的结点赋上一个有
着某种意义的实数,称其为该结点的权。 结点的带权路径长度(WPL)规定为从树根到该
结点之间的路径长度与该结点上权的乘积。
例:结点c的路径长度为2,其WPL=2*9=18
a bc
d
2021/3/1
3 79
8
3
3)树的带权路径长度
树中所有叶子结点的带权路径长度之和。通常记
为:
n
WPL wili i 1
其中 n 表示叶子结点的数目,wi 和 li分别表示叶 子结点ki的权值和根到ki之间的路径长度。
a bc
d
3 79
8
2021/3/1
4
4)赫夫曼(Huffman)树
又称最优二叉树。它是 n 个带权叶子结点构成 的所有二叉树中,带权路径长度WPL最小的二叉 树。
比例 0.05 0.15
0.4
0.3
0.1
输入10000个 数据,则需 进行31500次
比较。
Y a<60 N
不及格
a<70
Y
N
及格
Y a<80 N
中等 Y a<90 N
(a)
良好
优秀
2021/3/1
10
有没有一种更好 的办法来减少比
较次数呢?
2021/3/1
11
分数 0—59 60—69 70—79 80—89 90—99
第6章 树和二叉树
6.1 树的定义和基本术语 6.2 二叉树 6.3 遍历二叉树和线索二叉树 6.4 树和森林 6.6 赫夫曼树及其应用
2021/3/1
1
6.6 赫夫曼树及其应用
A
1.基本术语
1)路径和路径长度
BLeabharlann CD EFG
若一棵树中存在一个结点序列k1,k2,…,kj,使得ki 是kj的双亲(0<i<j),则称此结点序列是从ki~ kj 的路径。从k1~kj所经过的分支数称为这两点之间 的路径长度,它等于路径上的结点数减1。
比例 0.05 0.15
0.4
0.3
0.1
以比例数为权构造一棵哈夫 曼树,如(b)判断树所示。
再将每一比较框的两次比较改 为一次,可得到(c)判定树。
输入10000个 数据,仅需进 行22000次比
较。
(c)
70≤a<80 80≤a<90 60≤a<70 a<60
(b)
2021/3/1
12
4.赫夫曼编码(赫夫曼树的应用之二)
2021/3/1
6
2.构造最优树
赫夫曼算法:
1)根据给定的n个权值{w1, w2, …, wn},构造 n棵二叉树 的集合 F = {T1, T2, …,Tn},其中每棵二叉树中均只含一个带 权值为wi的根结点,其左、右子树为空树;
2) 在F中选取其根结点的权值为最小的两棵二叉树,分别 作为左、右子树构造一棵新的二叉树,并置这棵新的二叉 树根结点的权值为其左、右子树根结点的权值之和;
1)二进制编码 通信中,可以采用0、1的不同排列来表示不同
的字符,称为二进制编码。 发送端需要将电文中的字符序列转换成二进制
的0、1序列,即编码; 接受端需要把接受的0、1序列转换成对应的字
符序列,即译码。
2021/3/1
13
字符:A B A C C D A A B C D的编码分别为:00、01、10、11