huffman编码译码实现文件的压缩与解压.
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
数据结构
课程设计
题目名称:huffman编码与解码实现文件的压缩与解压专业年级:
组长:
小组成员:
指导教师:
二〇一二年十二月二十六日
目录
一、目标任务与问题分析 (2)
1.1目标任务 (2)
1.2问题分析 (2)
二、算法分析 (2)
2.1构造huffman树 (2)
2.1.1 字符的统计 (2)
2.1.2 huffman树节点的设计 (2)
2.2构造huffman编码 (3)
2.2.1 huffman编码的设计 (3)
2.3 压缩文件与解压文件的实现 (3)
三、执行效果 (4)
3.1界面 (4)
3.2每个字符的编码 (4)
3.3操作部分 (5)
3.4文件效果 (6)
四、源程序 (7)
五、参考文献 (16)
huffman编码与解码实现文件的压缩与解压
一、目标任务与问题分析
1.1目标任务
采用huffman编码思想实现文件的压缩和解压功能,可以将任意文件压缩,压缩后也可以解压出来。这样即节约了存储空间,也不会破坏文件的完整性。
1.2问题分析
本问题首先应该是利用哈夫曼思想,对需要压缩的文件中的个字符进行频率统计,为了能对任意的文件进行处理,应该所有的文件以二进制的方式进行处理,即对文件(不管包含的是字母还是汉字)采取一个个的字节处理,然后根据统计的频率结果构造哈夫曼树,然后对每个字符进行哈夫曼编码,然后逐一对被压缩的文件的每个字符构建的新的哈夫曼编码存入新的文件中即得到的压缩文件。解压过程则利用相应的哈夫曼树及压缩文件中的二进制码将编码序列译码,对文件进行解压,得到解压文件。
二、算法分析
2.1构造huffman树
要利用哈夫曼编码对文本文件进行压缩,首先必须知道期字符相应的哈夫曼编码。为了得到文件中字符的频率,一般的做法是扫描整个文本进行统计,编写程序统计文件中各个字符出现的频率。由于一个字符的范围在[0-255]之间,即共256个状态,所以可以直接用256个哈夫曼树节点即数组(后面有节点的定义)空间来存储整个文件的信息,节点中包括对应字符信息,其中包括频率。
2.1.1 字符的统计
用结构体huffchar来存放文件字符的信息。其中有文件中不同字符出现的种类Count、字符data。
struct huffchar{
//存放读入字符的类;
int Count;//字符出现的个数;
char data;//字符;
};
函数实现:
bool char_judge(char c)//判断字符出现的函数;
void char_add(char c)//添加新出现的字符;
void read_file_count() //文件的读取
2.1.2 huffman树节点的设计
用结构体huff_tree来存储结点信息,其中有成员频率weight、父亲节点parent、左儿子节点lchild、右儿子节点rchild。
struct huff_tree{/
/huffman树结点定义;
int parent;
int lchild;
int rchild;
int weight;
};
函数实现:
void creathuffman() //构造huffman树的函数
2.2构造huffman编码
2.2.1 huffman编码的设计
用结构体huffcode来存储每个字符的编码。其中有编码数组bits、起始编码start、频数count、编码对应的字符c。
struct huffcode{
//结构体
string bits[100];//存放解码;
int start;//
int count;//频数
string c;//存放字符;
};
函数实现:
void huffmancode()//编码函数
2.3 压缩文件与解压文件的实现
将压缩的文件根据huffman树进行编码,存入新的文件(huffman1.txt)中,将huffman.txt 按照huffman编码对应的字符解压回来,但是这样的文件是压缩不了的,当时用了一个30kb 的文件压缩后竟然成了119kb,导致这样的问题是因为一个字符对应几个二进制数字,然而一个二进制文字也是占一个字节,这就导致了压缩后的文件变大。
处理的方法将huffman1.txt文件中的二进制编码7位7位的存成一个ascII值存入新的文件,这样就实现了真正打压缩。
解压的时候将文件中的ascII值重新弄成二进制,不够7位的前边补0,例如ascII值为99的二进制位100011这是6位的ascII码所以再前边补一个0那么99的二进制就变成0100011。
接下来就利用huffman编码将这个文件重新译码过来。
函数实现:
void code_huffman_file()//编码后的二进制码存入文件
void code_file_out()//将编码过的文件恢复;
void evaluating()//比较文件压缩的比例
void change()//将二进制编码变成ascII码
void yichu()//将ascII翻译成二进制码恢复文件
三、执行效果
本算法有一个初始文件为huffman.txt。为一篇小说,大小为32KB
3.1界面
3.2每个字符的编码