1、在文本文件中多采用二进制编码。为了使文件尽可能的缩短,可以对文件中每个字符出现的次数进行统计。设法让出现次数多的字符二进制码短些,而让那些很少出现的字符二进制码长一些。若对字符集进行不等长编码,则要求字符集中任一字符的编码都不是其它字符编码的前缀。为了确保哈夫曼编码的唯一性,我们可以对它的左右子树的大小给予比较限定,如:左子树的权值小于右子树的权值。哈夫曼树中的左右分支各代表0和1,则从根节点到叶子节点所经历的路径分支的0和1组成的字符串,为该节点对应字符的哈夫曼编码。统计字符中每个字符在文件中出现的平均概率(概率越大,要求编码越短)。利用哈夫曼树的特点:权越大的叶子离根越近,将每个字符的概率
2、值作为权值,构造哈夫曼树。则概率越大的节点,路径越短。哈夫曼译码是从二进制序列的头部开始,顺序匹配成共的部分替换成相应的字符,直至二进制转换为字符序列。哈夫曼用于文件解压缩的基础是在压缩二进制代码的同时还必须存储相应的编码,这样就可以根据存储的哈夫曼编码对压缩代码进行压缩。总之,该课题的任务应该是首先要打开要压缩的文本文件并读出其字符出现的频率,以其为权值构建哈夫曼树。其次要找到构建压缩功能的方法,在构建哈夫曼树的基础上进行编码,改变字符原先的存储结构,以达到压缩文件的目的,以外还有存储相应的哈夫曼编码,为解压缩做准备。测试用数据本实验的数据是通过读入一个名为的文本文档,文档中内容为字符型数据
3、。二、概要设计和数据结构的选择以下是在任务分析对题意的理解做出的概要设计和对数据结构的选择:1、数据结构定义【1】/C+程序设计(第2版)【M】.高等教育出版社,2009年9月【2】郑莉等. c+语言程序设计(第三版)【M】.北京:清华大学出版社,2003年12月附录: odelen != 0) delete HTi.code; eight=MAX) eight = 0; leafnum+; HTc+128.weight+; arent != -1) continue; if(loc1=-1 | HTj.weight HTloc1.weight) loc2 = loc1; loc1 = j;
4、else if(loc2=-1 | HTj.weight loc2 loc2 : loc1; HTi.rchild = loc1loc2 loc1 : loc2; HTloc1.parent = i; HTloc2.parent = i; root = i;odelen!=0) cout 值为 i-128 的字符的huffman编码:; for(int j=0; jHTi.codelen; j+) cout =0; j-) arent.lchild) HTi.codej = 0; else HTi.codej = 1; loc = HTloc.parent;arent=-1) arent-38
5、4); while(c) odelen; i+) addbit(HTtmp.codei); if(bitsnum=8) arent = c+384; if(HTc+384.lchild=-1) HTc+384.lchild = i; HTc+384.rchild = i; int point = root; child; if(HTpoint.lchild=-1 & HTpoint.rchild=-1) (char(point-128); point = root; c = c 1; point = HTpoint.rchild; (); c = (); child; if(HTpoint.l
6、child=-1 & (char(point-128); point = root; c = c else point = HTpoint.rchild; (); return true;/将原文件与压缩后的文件比较void huffmanTree:compare(char *input, char *output) ifstream origin, compress; (input,ios:binary); (output,ios: if(!origin) cout 无法打开文件 input ! return;compress) output double total1=0, total2=
7、0; char c; total1+; total2+; cout 原文件大小: total1 Byte压缩后大小: total2 压缩率: total2/total1*100 %/将原文件与恢复后的文件比较compare2(char *input, char *output) ifstream origin, decompress; char c1, c2; bool dif = false; while(c1) & (c2) if(c1!=c2) /依次比较每个字节,不同则将dif标志设为true dif = true; while(c1) /若原文件还有剩余的数据,将dif设为true
8、dif = true; while(c2) /若恢复文件还有剩余的数据,将dif设为true恢复文件大小: if(dif=true)原文件与恢复文件不同! else原文件与恢复文件相同!/#/#include void main() int choice = 1; char input255, output255; huffmanTree h; while(choice) cout cin choice; switch(choice) case 1:请输入待压缩的文件名: cin input;请输入压缩后的文件名: output; if( (input,output) (); (input,output); coutendl文件压缩成功! else文件压缩失败! break; case 2:请输入待恢复的文件名:请输入恢复后的文件名: if (input,output)文件恢复成功! else文件恢复失败! case 3:请输入原文件的文件名:请输入恢复文件的文件名: (input,output); case 4: /执行清屏命令 system(cls); case 5: default:参数错误!请重新输入
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1