一个编程小白成功的完成了哈夫曼树的文件压缩,过程可以说是很艰辛了。好啦~废话就不多说了,下面开始正式的讲解,过程+代码。
工具:Dev-c++
语言:C++
刚开始我拿到这个题目,真心是蒙啊,因为我连什么是哈夫曼都不知道(可以看出我是小白了吧)。
先说一下整个过程:
1.从文件中读取叶子个数,及权值(即相同字母的个数)。比如说文件中内容是abcdabcaba,叶子个数为4,分别是a,b,c,d,权值依次为4,3,2,1.
2.构造哈夫曼树
3.得到哈夫曼编码
4.压缩
(1)将Y,S写入要压缩的文件中作为标记位。(主要是为了在解压缩过程中判断是否为压缩文件)
(2)将叶子个数写入压缩文件
(3)将所有叶子按照叶子所对应字符,编码长度(即01的个数 ),转换后的编码长度(即二进制转换成十六进制后所得编码长度),转换后的编码,这样的顺序依次写到压缩文件中
(4)写入八位对齐补偿长度
(5)写入原文件哈夫曼编码长度
(6)将原文件中所有字符转成01二进制编码,将二进制编码转成16进制编码写入文件
5.解压缩
其实解压缩的过程就是将刚刚的得到的压缩文件内容读出来,再进行转化,就得到原文件内容啦
(1)从压缩文件中读取压缩标识,即Y,S,判断是否为压缩文件
(2)从压缩文件读出叶子个数
(3)从压缩文件中读出所有叶子按照叶子所对应字符,编码长度(即01的个数 ),转换后的编码长度(即二进制转换成十六进制后所得编码长度),转换后的编码
(4)读出八位对齐补偿长度
(5)读出压缩文件中哈夫曼编码长度
(6)将压缩文件中所有16进制编码,,将16进制编码转成2进制编码
(7)从前向后依次搜索叶子节点的各个编码,将与之对应的字符写入解压缩文件