基于哈夫曼编码实现文件压缩
是在学习数据结构(严蔚敏版)书中哈夫曼树及其应用后对书中伪代码的实现和完善,采用哈夫曼静态编码的方式,通过对数据进行两遍扫描,第一次统计出现的字符频次,进而构造哈夫曼树,第二遍扫描数据根据得到的哈夫曼树对数据进行编码。
对于其中的加密编码只是简单的将用户输入的密码用特殊的标识位拼接成字符串加入需要统计的数据,可以在拥有哈夫曼编码表以及加密后的文本情况下进行解密
哈夫曼树
给定n个权值作为n个叶子结点,构造一棵二叉树,若带权路径长度达到最小,称这样的二叉树为最优二叉树,也称为哈夫曼树(Huffman Tree)。哈夫曼树是带权路径长度最短的树,权值较大的结点离根较近。
哈夫曼树的构造过程
假设有n个权值,则构造出的哈夫曼树有n个叶子结点。 n个权值分别设为 w1、w2、…、wn,则哈夫曼树的构造规则为: (1)
将w1、w2、…,wn看成是有n 棵树的森林(每棵树仅有一个结点); (2)
在森林中选出两个根结点的权值最小的树合并,作为一棵新树的左、右子树,且新树的根结点权值为其左、右子树根结点权值之和;
(3)从森林中删除选取的两棵树,并将新树加入森林; (4)重复(2)、(3)步,直到森林中只剩一棵树为止,该树即为所求得的哈夫曼树
在构造哈夫曼树时首先选择权小的,这样保证权大的离根较近,这种生成算法是一种典型的贪心法。
哈夫曼编码思想
为了使压缩后的数据文件尽可能短,可采用不定长编码。而为了在对压缩文件进行解码时不产生二义性,确保正确解码应该采用前缀编码的形式(即要求一个字符的编码不能是另一个字符编码的前缀)。而哈夫曼编码是最优前缀编码。
例如:有一个数据序列ABACCDAA则编码为A(0),B(10),C(110),(D111),压缩后为010011011011100。
部分实现代码
1 | //哈夫曼树存储表示 |
有兴趣可以下载源码查看https://pan.baidu.com/s/1skAP5lr
参考 数据结构:C语言版/严蔚敏,李冬梅,吴伟民编