欢迎来到天天文库
浏览记录
ID:47429791
大小:522.42 KB
页数:17页
时间:2020-01-11
《huffman编码译码实现文件的压缩与解压》由会员上传分享,免费在线阅读,更多相关内容在行业资料-天天文库。
1、数据结构课程设计题目名称:huffman编码与解码实现文件的压缩与解压专业年级:组长:小组成员:指导教师:二〇一二年十二月二十六日目录一、目标任务与问题分析…………………………21.1目标任务…………………………………………21.2问题分析…………………………………………2二、算法分析………………………………………22.1构造huffman树…………………………………22.1.1字符的统计………………………………………………22.1.2huffman树节点的设计……………………………………22.2构造huffman编码………………………………32.2.1huffman编码
2、的设计………………………………………32.3压缩文件与解压文件的实现……………………3三、执行效果……………………………………43.1界面………………………………………………………43.2每个字符的编码…………………………………………43.3操作部分…………………………………………………53.4文件效果…………………………………………………6四、源程序………………………………………………7五、参考文献……………………………………………1615huffman编码与解码实现文件的压缩与解压一、目标任务与问题分析1.1目标任务采用huffman编码思想实现文件的压缩和解压功能,
3、可以将任意文件压缩,压缩后也可以解压出来。这样即节约了存储空间,也不会破坏文件的完整性。1.2问题分析本问题首先应该是利用哈夫曼思想,对需要压缩的文件中的个字符进行频率统计,为了能对任意的文件进行处理,应该所有的文件以二进制的方式进行处理,即对文件(不管包含的是字母还是汉字)采取一个个的字节处理,然后根据统计的频率结果构造哈夫曼树,然后对每个字符进行哈夫曼编码,然后逐一对被压缩的文件的每个字符构建的新的哈夫曼编码存入新的文件中即得到的压缩文件。解压过程则利用相应的哈夫曼树及压缩文件中的二进制码将编码序列译码,对文件进行解压,得到解压文件。二、算法分析2.1构造huffma
4、n树要利用哈夫曼编码对文本文件进行压缩,首先必须知道期字符相应的哈夫曼编码。为了得到文件中字符的频率,一般的做法是扫描整个文本进行统计,编写程序统计文件中各个字符出现的频率。由于一个字符的范围在[0-255]之间,即共256个状态,所以可以直接用256个哈夫曼树节点即数组(后面有节点的定义)空间来存储整个文件的信息,节点中包括对应字符信息,其中包括频率。2.1.1字符的统计用结构体huffchar来存放文件字符的信息。其中有文件中不同字符出现的种类Count、字符data。structhuffchar{//存放读入字符的类;intCount;//字符出现的个数;chard
5、ata;//字符;};函数实现:boolchar_judge(charc)//判断字符出现的函数;voidchar_add(charc)//添加新出现的字符;voidread_file_count()//文件的读取2.1.2huffman树节点的设计用结构体huff_tree来存储结点信息,其中有成员频率weight、父亲节点parent、左儿子节点lchild、右儿子节点rchild。15structhuff_tree{//huffman树结点定义;intparent;intlchild;intrchild;intweight;};函数实现:voidcreathuffm
6、an()//构造huffman树的函数2.2构造huffman编码2.2.1huffman编码的设计用结构体huffcode来存储每个字符的编码。其中有编码数组bits、起始编码start、频数count、编码对应的字符c。structhuffcode{//结构体stringbits[100];//存放解码;intstart;//intcount;//频数stringc;//存放字符;};函数实现:voidhuffmancode()//编码函数2.3压缩文件与解压文件的实现将压缩的文件根据huffman树进行编码,存入新的文件(huffman1.txt)中,将huffma
7、n.txt按照huffman编码对应的字符解压回来,但是这样的文件是压缩不了的,当时用了一个30kb的文件压缩后竟然成了119kb,导致这样的问题是因为一个字符对应几个二进制数字,然而一个二进制文字也是占一个字节,这就导致了压缩后的文件变大。处理的方法将huffman1.txt文件中的二进制编码7位7位的存成一个ascII值存入新的文件,这样就实现了真正打压缩。解压的时候将文件中的ascII值重新弄成二进制,不够7位的前边补0,例如ascII值为99的二进制位100011这是6位的ascII码所以再前边补一个0那么99的二进制
此文档下载收益归作者所有