1、哈夫曼压缩解压数据结构设计报告数据结构课程设计报告 设计题目:哈夫曼编码压缩解压缩 学生姓名: 专 业:计算机科学与技术 班 级: 学 号: 指导老师: 完成日期: 合肥工业大学计算机与信息学院一、问题分析和任务定义设计任务采用哈夫曼编码思想实现文件的压缩和恢复功能,并提供压缩前后的占用空间之比。要求(1)描述压缩基本符号的选择方法。(2)运行时的压缩原文件的规模应不小于5K。(3)提供恢复文件与原文件的相同性对比功能。问题分析本课题是利用哈夫曼编码思想,设计对一个文本文件(.txt)中的字符进行哈夫曼编码,生成编码压缩文件,并且还可将一个压缩后的文件进行解码还原为原始文本文件(.txt)。在
2、了解哈夫曼压缩解压缩原理之前,首先让我们来认识哈夫曼树。哈夫曼树又称最优二叉树,是带权路径长度最小的二叉树。在文本文件中多采用二进制编码。为了使文件尽可能的缩短,可以对文件中每个字符出现的次数进行统计。设法让出现次数多的字符二进制码短些,而让那些很少出现的字符二进制码长一些。若对字符集进行不等长编码,则要求字符集中任一字符的编码都不是其它字符编码的前缀。为了确保哈夫曼编码的唯一性,我们可以对它的左右子树的大小给予比较限定,如:左子树的权值小于右子树的权值。哈夫曼树中的左右分支各代表0和1,则从根节点到叶子节点所经历的路径分支的0和1组成的字符串,为该节点对应字符的哈夫曼编码。统计字符中每个字符
3、在文件中出现的平均概率(概率越大,要求编码越短)。利用哈夫曼树的特点:权越大的叶子离根越近,将每个字符的概率值作为权值,构造哈夫曼树。则概率越大的节点,路径越短。哈夫曼译码是从二进制序列的头部开始,顺序匹配成共的部分替换成相应的字符,直至二进制转换为字符序列。哈夫曼用于文件解压缩的基础是在压缩二进制代码的同时还必须存储相应的编码,这样就可以根据存储的哈夫曼编码对压缩代码进行压缩。总之,该课题的任务应该是首先要打开要压缩的文本文件并读出其字符出现的频率,以其为权值构建哈夫曼树。其次要找到构建压缩功能的方法,在构建哈夫曼树的基础上进行编码,改变字符原先的存储结构,以达到压缩文件的目的,以外还有存储
4、相应的哈夫曼编码,为解压缩做准备。测试用数据本实验的数据是通过读入一个名为的文本文档,文档中内容为字符型数据。二、概要设计和数据结构的选择以下是在任务分析对题意的理解做出的概要设计和对数据结构的选择: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=
5、-1 | HTj.weight HTloc1.weight) loc2 = loc1; loc1 = j; 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 HTi.codej; cout =0; j-) arent.lchild) H
6、Ti.codej = 0; else HTi.codej = 1; loc = HTloc.parent; arent=-1) arent-384); while(c) odelen; i+) addbit(HTtmp.codei); if(bitsnum=8) arent = c+384; if(HTc+384.lchild=-1) HTc+384.lchild = i; else HTc+384.rchild = i; int point = root; child; if(HTpoint.lchild=-1 & HTpoint.rchild=-1) (char(point-128); p
7、oint = root; c = c 1; else point = HTpoint.rchild; if(HTpoint.lchild=-1 & HTpoint.rchild=-1) (char(point-128); point = root; c = c 1; (); c = (); child; if(HTpoint.lchild=-1 & HTpoint.rchild=-1) (char(point-128); point = root; c = c 1; else point = HTpoint.rchild; if(HTpoint.lchild=-1 & HTpoint.rchi
8、ld=-1) (char(point-128); point = root; c = c 1; (); (); (); return true;/将原文件与压缩后的文件比较void huffmanTree:compare(char *input, char *output) ifstream origin, compress; (input,ios:binary); (output,ios:binary); if(!origin) cout 无法打开文件 input ! endl; return; if(!compress) cout 无法打开文件 output ! endl; return;
9、 double total1=0, total2=0; char c; while(c) total1+; while(c) total2+; cout 原文件大小: total1 Byte endl; cout 压缩后大小: total2 Byte endl; cout 压缩率: total2/total1*100 % endl; (); ();/将原文件与恢复后的文件比较void huffmanTree:compare2(char *input, char *output) ifstream origin, decompress; (input,ios:binary); (output,i
10、os:binary); double total1=0, total2=0; char c1, c2; bool dif = false; while(c1) & (c2) if(c1!=c2) /依次比较每个字节,不同则将dif标志设为true dif = true; total1+; total2+; while(c1) /若原文件还有剩余的数据,将dif设为true dif = true; total1+; while(c2) /若恢复文件还有剩余的数据,将dif设为true dif = true; total2+; cout 原文件大小: total1 Byte endl; cout
11、恢复文件大小: total2 Byte endl; if(dif=true) cout 原文件与恢复文件不同! endl; else cout 原文件与恢复文件相同! endl; (); ();/#/#include #include void main() int choice = 1; char input255, output255; huffmanTree h; while(choice) cout *endl; cout * 哈夫曼编码压缩恢复算法 *endl; cout * *endl; cout * 1)压缩 *endl; cout * *endl; cout * 2) 恢复 *
12、endl; cout * *endl; cout * 3) 恢复文件与原文件的对比 *endl; cout * *endl; cout * 4) 清屏 *endl; cout * *endl; cout * 5) 退出 *endl; cout * *endl; cout * 说明:请您输入相应的操作序号进行操作 *endl; cout *endl; cout; cin choice; switch(choice) case 1: cout input; cout output; if( (input,output) (); (input,output); coutendl文件压缩成功!endl; else coutendl文件压缩失败!endl; break; case 2: cout input; cout output; if (input,output) coutendl文件恢复成功!endl; else coutendl文件恢复失败!endl; break; case 3: cout input; cout output; (input,output); break; case 4: /执行清屏命令 system(cls); break; case 5: break; default: cout 参数错误!请重新输入 endl; cout endl;
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1