- 1、本文档共16页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
Huffman的应用之文件压缩与解压缩精要
Huffman的应用之文件压缩与解压缩
最近这段时间一直在学习树的这种数据结构,也接触到了Huffman树以及了解了什仫是Huffman编码,而我们常用的zip压缩也是利用的Huffman编码的特性,那仫是不是可以自己实现一个文件压缩呢?当然可以了.在文件压缩中我实现了Huffman树和建堆Heap的代码,zip压缩的介绍
下面开始介绍自己实现的文件压缩的思路和问题...
1).统计读取一个文件统计这个文件中字符出现的次数.
2).建树以字符出现的次数作为权值使用贪心算法构建Huffman树(根据Huffman树的特性字符出现次数多的一定靠近根结点,出现次数少的一定远离根结点).
3).生成Huffman编码规则左0右1.
4).压缩再次读取文件,根据生成的Huffman编码压缩文件.
5).生成配置文件将字符以及字符出现的次数写进配置文件中.
6).解压缩利用配置文件还原出Huffman树,根据压缩文件还原出原文件.
7).测试判断解压是否正确需要判断原文件和解压缩之后的文件是否相同,利用Beyond Compare软件进行对比.
下面是我举的一个简单的范例,模拟压缩和解压缩的过程,希望有读者有帮助
利用Beyond Compare软件进行对比
在实现中出现了很多的问题,下面我提出几个容易犯的问题,仅供参考
1).在使用贪心算法构建Huffman树的时候,如果我们以unsigned char一个字节来存储它总共有2^8=256个字符,如果将所有的字符都构建Huffman树,这不仅降低了效率还将分配极大的内存.所以我设立了非法值这个概念,只有当字符出现的次数不为0的时候才将该字符构建到Huffman树中.
2).在写压缩文件的时候我们是将字符对应的Huffman编码转化为对应的位,每当填满一个字节(8位)后再写入压缩文件中.如果最后一个字节没有填满我们就将已经填的位移位空出后几个位置,将未满的位置补0补满一个字节再写入压缩文件中.
3).如果我们将源文件压缩之后再去解压,因为你的Huffman树和Huffman编码都是在压缩函数中得到的,此时再去解压那仫你的Huffman编码以及不存在了该如何去还原文件呢?这就是为什仫要生成配置文件的原因了,在配置文件中写入了字符以及字符出现的次数.在解压缩中根据配置文件构建新的Huffman树.
4).由压缩文件还原文件的时候如何知道压了多少个字符呢?也就是说因为我们在压缩的时候最后一个字节是补了0的在解压缩的时候可能会把这个补的位当成字符的编码来处理.一种想法是在统计字符出现的次数的时候设置一个变量,每读取一个字符该变量就加1,最后将该变量写进配置文件中.另外一种想法就是根据根结点的权值,通过上述简单的实例观察可知根结点权值中的_count就是字符出现的次数.
解决了以上几个问题,我的程序已经可以压缩那256个字符并正确的还原了,那仫如果是大文件或者是汉字,图片以及音频视频呢?
1).因为有些特殊的字符编码,所以我们统计字符出现的次数的时候应该用的是unsigned char,刚开始我用的文件结束标志是EOF在ASII中它的编码是-1此时已经不可以用EOF来判断是否文件结束了,所以我用了feof这个函数来判断文件是否结束.
2).统计字符出现次数应该用的类型是long long,这就解决了大文件的压缩和解压缩的问题了.
3).因为汉字,图片,视频这些在内存中是以二进制的形式存在的,所以我们将以文本形式打开读或者写的修改为以二进制的形式读或者写.
为了验证大文件的压缩我找了一个8.09M的文件压缩之后是6.50M,并且可以正确还原.
1).测试效率
2).利用Beyond Compare软件进行对比,如果一样说明压缩成功
[cpp] view plain copy print?在CODE上查看代码片派生到我的代码片
#define _CRT_SECURE_NO_WARNINGS 1
#pragma once
#include Heap.h
templateclass T
struct HuffmanTreeNode
{
T _weight;
HuffmanTreeNodeT *_left;
HuffmanTreeNodeT *_right;
HuffmanTreeNodeT *_parent;
HuffmanTreeNode(const T w=T())
:_weight(w)
,_left(NULL
您可能关注的文档
- 人民版思想品德七年级上册第一单元第三课第一框《生命的节奏》授课.ppt
- 人民版高中历史-必修二--复习提纲.doc
- 人民版罗斯福新政.ppt
- 人机交互第7章Web界面设计.ppt
- 人民版八年级上册第一课我的父亲母亲.ppt
- 人民版新文化运动.ppt
- 人民解放军百万大军横渡长江分析.ppt
- 人民解放军百万大军横渡渡江分析.ppt
- 人民网2015年年报(word版).docx
- 人民邮电出版社《电子商务概论》课后习题答案.doc
- 抢分秘籍10 带电粒子电场中的直线运动、偏转和交变电电场中的应用(三大题型)(原卷版)-2025年高考物理冲刺抢押秘籍.pdf
- 抢分秘籍11 带电粒子在组合场、叠加场中的运动(五大题型)(解析版)-2025年高考物理冲刺抢押秘籍.pdf
- 抢分秘籍11 带电粒子在组合场、叠加场中的运动(五大题型)(原卷版)-2025年高考物理冲刺抢押秘籍.pdf
- 抢分秘籍12 电磁感应中的电路与图像问题(二大题型)(解析版) -2025年高考物理冲刺抢押秘籍.pdf
- 抢分秘籍12 电磁感应中的电路与图像问题(二大题型)(原卷版)-2025年高考物理冲刺抢押秘籍.pdf
- 抢分秘籍14 热力学定律与气体实验定律综合应用(五大题型)(解析版)-2025年高考物理冲刺抢押秘籍.pdf
- 抢分秘籍13 电磁感应中的动力学、能量和动量问题(三大题型)(原卷版)-2025年高考物理冲刺抢押秘籍.pdf
- 抢分秘籍14 热力学定律与气体实验定律综合应用(五大题型)(原卷版)-2025年高考物理冲刺抢押秘籍.pdf
- 抢分秘籍16 振动图像与波动图像的综合应用(三大题型)(解析版)-2025年高考物理冲刺抢押秘籍.pdf
- 抢分秘籍15 光的折射、全反射的综合应用(二大题型)(解析版)-2025年高考物理冲刺抢押秘籍.pdf
最近下载
- 2024年信息系统监理师考试真题及答案.docx VIP
- 第17课 辛亥革命与中华民国的建立 课件(共25张PPT)-中职高一上学期高教版(2025)中国历史全一册(含音频+视频).pptx VIP
- 基于区块链的数字身份认证系统设计.docx VIP
- A10联盟2025届高三4月质量检测考试 物理试卷(含答案解析).pdf
- 现场管理人机料法环知识培训课件(PPT-46张).ppt
- ASTM E384-17美国材料与试验协会标准.pdf VIP
- 21《杨氏之子》公开课一等奖创新教学设计.docx VIP
- 2022监理工程师《建设工程目标控制(交通)》公路工程费用与进度控制.pdf VIP
- 供热企业运检人员专业知识习题集.pdf VIP
- 《严格规范涉企行政检查》专题讲座.pptx
文档评论(0)