一、实验目的和要求
利用哈夫曼树编码写出一个解压缩软件。
二、实验环境
VisualStudio,qt
三、实验内容
(1)压缩对象为外存任意格式任意位置的文件。
(2)运行时,压缩原文件的规模应不小于5K。运行后,外存上保留压缩后的文件。
(3)提供解压文件与原文件的相同性对比功能。
(4)建议,形成带交互界面功能的系统。
- 实验过程
4.1 任务定义和问题分析
①图形交互:Qt编程
②建立哈夫曼树
③利用文件流进行文件操作。
4.2 数据结构的选择和概要设计
建立哈夫曼树
4.3 详细设计
问题拆解为以下几个子问题:
- 读取传入文件,进行字符权重统计
2.将出现的字符放入哈夫曼树结点,构建哈夫曼树,获取哈夫曼编码
3.将编码相关信息写入压缩后的文件,再将传入文件的每个字符按照哈夫曼编码转换,每8个二进制位作为一个字节传入压缩后的文件
4.解压部分:将传入的已压缩文件进行文件流读取,获取编码信息进行还原
根据以上问题寻找解题方案:
①读取传入文件,需要用到文件流。
②哈夫曼结点的构造,和二叉树没有什么区别,只是在封装的struct里面加了unsigned char 型的字符,int型的权重,string型的哈夫曼编码,和是否是叶子结点的bool型标记(哈夫曼树叶子结点才是我们需要的编码)。将前面我们获取到的字符和权重加进去。
③传入哈夫曼编码阶段:遍历先前在读取文件时获取的字符串,将字符串的每一位转化为哈夫曼编码,用另一个字符串储存。这里不妨称这个字符串为二进制字符串,这个二进制字符串按8分割到最后可能会有不足8位的部分,对其进行补0操作。最后再传入一个字节,记录补0数。
④压缩函数和解压函数。
五、测试及结果分析
对各种数据运行程序和算法的结果记录和分析,并对错误所作的修改和结果。
5.1 实验数据
压缩前
压缩后
解压中
解压后
六、实验收获
实验过程中遇到了越压缩越大,以及对部分类型的文件压缩效果一般的问题,磕磕绊绊的心理历程。对压缩与解压缩有了更好的认知。
七、参考文献
百度