数据结构————文件压缩(利用哈夫曼编码实现)

本文介绍了文件压缩的原理,主要利用哈夫曼编码进行压缩。通过构建哈夫曼树,根据字符出现频率获取编码,以此达到压缩效果。文件压缩流程包括统计字符频率、构建哈夫曼树、获取编码、写入配置信息并压缩字符。解压则需要读取配置信息,重构哈夫曼树,遍历树获取字符。构建哈夫曼树涉及堆、仿函数等技术。在实际操作中,需要注意字符类型的定义、文件的二进制读取以及哈希映射存储字符计数。
摘要由CSDN通过智能技术生成

文件压缩原理:
首先文件压缩是通过HuffmaCode实现的、整体思路通过读取文件获取字符出现频率,通过字符出现频率可以构建HuffmanTree,每个文件中出现的字符通过HuffmanTree获取HuffmanCode,从而将文件中的字符同过HuffmanTree获取相应编码,并写入压缩文件,从而完成文件压缩。
为什么通过HuffmanCode可以实现文件的压缩呢?
原因:1.每个文件的字符种类有限。2.每个字符出现次数可能很多。3.HuffmanTree构造的特点:HuffmanTree越靠近根节点的叶子节点权值越大,路径越短;如果文件中的字符重复的越多,靠近根节点的叶子节点的权值越大,而这些字符的路径最短所以HuffmanCode就越短,这样在这些字符多的情况下压缩率越高。
如何产生HuffmanCode?
1.产生HuffmanCode的条件是先构建HuffmanTree,从构建HuffmanTree的节点中选出权值最小、权值较小的节点;从而形成左右子树,再左右子树的权值相加,作为父亲节点的权值;再将父亲节点入到构建huffmanTree的节点集合中;再继续选最小、次小,直到集合中剩下一个节点时候,这个节点为根节点。
2.通过遍历HuffmanTree的所有叶子节点的路径来获取每个文件中出现的字符的HuffmanCode。
了解了这些压缩原理后,我们该如何实现文件压缩呢?
文件压缩流程:
1.读取文件,统计字符出现次数。
2.通过统计出来的字符出现次数,来构建HuffmanTree。
3.获取HuffmanCode。
4.写如配置信息(每个字符出现的次数,方便解压时重构huffmanTree)。
5.读取文件,将文件中出现的字符的HuffmanCode依次压缩进压缩文件。
文件解压流程:
1.读取配置信息。
2.通过读取信息重构HuffmanTree。
3.通过编码遍历HuffmanTree来获取字符写入压缩文件。
关于构建HuffmanTree用到技术
1.堆:通过小堆来选取最小值和次小值。(前面有一篇讲堆的博客)。
2.仿函数:在堆中用到了仿函数(通过仿函数来比较CharInfo中的权重大小来建堆)。
3.HuffmanCode:因为HuffmanTree所有的信息的都在叶子节点中,而且每个叶子节点都有唯一确定的路径(根节点到叶子节点的路径),即这条路径就为HuffmanCode,而每个叶子节点又对应唯一的字符。
4.string类:用来保存HuffmanCode。
文件压缩的部分细节:
统计文件中所有字符的出现次数。由于Ascall码字符一共255个,只有前128个字符可以显示,定义字符变量时一定要定义成无符号型变量unsigned char ch如下,这是ch读不到文件的结束标志,所以我们可以用函数feof来代替文件的结束标志EOF,最重要的是文件的打开方式一定要是二进制的形式打开否则读不到汉字字符,将出现乱码。而这255个字符我们将采取哈希映射的方式来存储在_info[256]数组中。以数组下标映射每个字符,以方便字符与出现的次数相对应起来。在数组元素中保存字符编码和字符对应的次数。方便我们引索。

  • 5
    点赞
  • 36
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值