目录
背景知识:二叉树的应用、赫夫曼树。
目的要求:掌握赫夫曼树和赫夫曼编码的基本思想和算法的程序实现。
实验内容:实现文件中数据的加解密与压缩:将硬盘上的一个文本文件进行加密,比较加密文件和原始文件的大小差别;对加密文件进行解密,比较原始文件和解码文件的内容是否一致。
实验说明:
1.输入和输出:
(1)输入:硬盘上给定的原始文件及文件路径。
(2)输出:
- 硬盘上的加密文件及文件路径;
- 硬盘上的解码文件及文件路径;
- 原始文件和解码文件的比对结果。
2.实验要求:
- 提取原始文件中的数据(包括中文、英文或其他字符),根据数据出现的频率为权重,构建Huffman编码表;
- 根据Huffman编码表对原始文件进行加密,得到加密文件并保存到硬盘上;
- 将加密文件进行解密,得到解码文件并保存点硬盘上;
- 比对原始文件和解码文件的一致性,得出是否一致的结论。
3.参考类型定义 //双亲孩子表示法
typedef struct {
unsigned int weight;
unsigned int parent, lchild, rchild;
} HTNode, *HuffmanTree; //动态分配数组存储赫夫曼树
- typedef char * * HuffmanCode; //动态分配数组存储赫夫曼编码表
(*≧︶≦))( ̄▽ ̄* )ゞ小唠叨
这是我们的数据结构实验二,作为拖延症患者的我ddl从来都是第一生产力,于是,熬了两个晚上终于把思路给理出来了。8过代码还是借鉴啦大佬的博客
(一)第一步就是思路整理
这个实验难在它对我来说有一些抽象,一开始对文件的压缩和解压的概念很模糊,后来找到了B站上的一个视频(https://www.bilibili.com/video/BV1Yt411Y76w?from=search&seid=11711631498115172127),把这个本来对我来说比较抽象的概念具体化了:假设文件中的内容是“abcdabccccca”12个字符,一个ascii码对应一个字节,那么就是12个字节。但是如果用少于1个字节的几个位来表示各个字符,列如a:10,c:11,b:01,c:00,那么算下来只需要不到12个字节(5-6个字节)就可以搞定。而每个字符的编码可以由哈夫曼编码得到,每个字符的权值就是它出现的频率。
实验中比较重要的两个步骤就是压缩和解压缩:
①压缩:先打开要压缩的文件,分析每个字符的总次数,然后将次数传给哈夫曼树,构建一颗哈夫曼树,然后获取到每个字符的哈夫曼编码,将编码写入文件
②解压缩:打开要解压缩的文件,读出储存的哈夫曼字典(结构体),然后根据字典逐个的翻译编码得到字符,写入文件。
哈夫曼编码的思路(来自上述链接中大佬的博客): |
||
|