问题描述:
生活中文件压缩技术可谓随处可见,在数据的密集型传输中文件压缩是一项重要的实用性技术。例如:较大文件的下载,传输等。常见的文件压缩工具有winRAR,2345好压,快压(KuaiZip)等,这些工具已经开发的相当牛逼,但是作为入门级的程序员来说,不能只停留在观摩的立场上,扮演使用者的角色。有必要深入了解其底层的基础实现方式,掌握基础的文件压缩原理,所以在此将其视为一个小型项目列出,以供大家交流探讨,相互学习....
★在此之前,先来说说什么是文件压缩,用以抛出一个基础概念。
文件压缩:一个较大的文件经压缩后,产生了另一个较小容量的文件。而这个较小容量的文件,称其是这些较大容量的(可能一个或一个以上的文件)的压缩文件。而压缩此文件的过程称为文件压缩。目前互联网络上大家常用的FTP文件服务器上的文件大多属于压缩文件,文件下载后必须先解压缩才能够使用;另外在使用电子邮件附加文件功能的时候,最好也能事先对附加文件进行压缩处理。
文件压缩的原理:目前压缩技术可分为通用无损数据压缩与有损压缩两大类,但不管是采用何种技术模型,其本质内容都是一样的,即都是通过某种特殊的编码方式将数据信息中存在的重复度、冗余度有效地降低,从而达到数据压缩的目的。比如:“中国”是“中华人民共和国”的简称,但前者的字数是2,后者则是7,但我们都不会对它们俩所要表达的意思产生误解,这是因为前者保留了信息中最“关键点”。同时,作为有思维能力的人类,我们可以根据前后词汇关系和知识积累,就可推断出其原来的全部信息。压缩技术也一样,在不影响文件的基本使用的前提下,只保留原数据中一些“关键点”,去掉了数据中的重复的、冗余的信息,从而达到压缩的目的。这就是文件压缩技术所要遵循的最基本原理。
★在这里运用的是基于Huffman编码的方式实现文件的压缩和解压缩。
Huffman算法:哈夫曼是一种常用的压缩方法,是1952年为文本文件建立的,其基本原理是频繁使用的数据用较短的代码代替,很少使用的数据用较长的代码代替,每个数据的代码各不相同。这些代码都是二进制码,且码的长度是可变的。如: 有一个原始数据序列,ABACCDAA则编码为A(0),B(10),C(110),(D111),压缩后010011011011100。产生霍夫曼编码需要对原始数据扫描两遍,第一遍扫描要精确地统计出原始数据中的每个值出现的频率,第二遍是建立霍夫曼树并进行编码,由于需要建立二叉树并遍历二叉树生成编码,因此数据压缩和还原速度都较慢,但简单有效,因而得到广泛的应用。 哈夫曼算法在改变任何符号二进制编码引起少量密集表现方面是最佳的。
※Hufman压缩的特性:1.该算法是依赖于原始数据的,并且Huffman树为每一个节点生成的对应的Huffman编码是唯一的;2.其每个字符的编码长度是根据其出现的频率决定的,也就是说出现频率高的字符其编码短,频率低的字符其编码长。
▲有关于Huffman树的建立,编码等一系列相关过程的基础讲解在此就不做赘述了,后面会陆续更新博文。
主要一共四个模块: 1.建 树:创建Huffman树。
2.编 码:根据Huffman树实现编码,将编码结果和对应数据建立映射关系。
3.解 码:根据Huffman编码逆向获取解码信息。
4.文件操作:文件的打开和关闭。
废话不多说,直接上代码:
1.Huffman树的建立:
/****************************** HuffmanTree.h *****************************************************
************ 该文件是Huffman树的建立,为了增强其传参时的健壮性,在此使用了C++中的模板用以实现. ************
****************************************************************************************************************/
#pragma once
#include "Heap.h"
#include<assert.h>
templat