数据结构_赫夫曼树、赫夫曼编码及其应用(数据的压缩和解压)

赫夫曼树:路径长度(WPL)最小的二叉树称为赫夫曼树。

权:树结点间的边相关的数。

路径长度:从树中的一个结点到另一个节点之间的分支构成两个结点之间的路径,路径的分支数目称为路径的长度。

树的路径长度:从树根到每一个节点的路径长度之和

带权路径长度:从该结点到树根之间的路径长度与结点上权的乘积。

树的带权路径长度:树中所有叶子节点的带权路径长度之和。如下:

数据结构_赫夫曼树、赫夫曼编码及其应用(数据的压缩和解压)_第1张图片

此树的带权路径长度WPL = 5*3 + 15*3 + 40*2 + 30*2 + 10*2 = 220


那么问题来了,怎样构造一棵最优的赫夫曼树那?具体的方法如下:

1、将有权值得叶子结点按照从大到小的顺序进行排列。(A5 E10 B15 D30 C40)

2、取前两个较小的叶子结点,最小的为左孩子,次小的为右孩子重新构造一棵二叉树,根结点为N1,算出根结点权值,替换有序排列中的两个叶子结点,重新排列(注意按照权值大小进行从大到小排列

3、排列生成的树也是权值小的为左孩子,权值大的为右孩子。


赫夫曼编码:一般的,设需要编码的字符集为{d1,d2,...,dn},各个字符在电文中出现的次数或者频率集合为{w1,w2,...,wn},以d1,d2,...dn作为叶子结点,以w1,w2,...,wn作为相应叶子结点的权值来构造一棵赫夫曼树。规定赫夫曼树的左支代表0,右支代表1,则从根结点到叶子结点所经过的路径分支组成的0和1的序列便为该结点对应字符的编码,这就是赫夫曼编码。

利用赫夫曼编码实现数据的压缩和解压:

原理: 利用哈夫曼树对文件中的字符进行重新编码,也就是根据文件中出现的所有字符的频率来创建哈夫曼树,然后生成哈夫曼编码来对文件中的所有字符进行重新编码,使文件中出现频率高的字符的编码变短,从而实现文件的压缩存储。相应的,解压过程也就是对文件按照哈夫曼编码的译码过程。

实现数据压缩和解压代码实现:

MyZipApplication.cpp:



你可能感兴趣的:(#,数据结构)