[项目]文件压缩

来源:互联网 发布:js时间戳转为date 本地 编辑:程序博客网 时间:2024/05/29 18:11

文件的压缩和解压缩

由于存储一个int 最少需要8个字节 一个char 最少需要1个字节(32位),但大多数时候在一个文件中会有很多重复的数字或者字符,将其进行重新编码,比如说:s:1001 在这个文件中这就代表s 从而就产生了哈夫曼编码
哈夫曼编码: 最佳判定树

定义哈夫曼树之前先说明几个与哈夫曼树有关的概念:

 

路径: 树中一个结点到另一个结点之间的分支构成这两个结点之间的路径。

 

路径长度:路径上的分枝数目称作路径长度。

 

树的路径长度:从树根到每一个结点的路径长度之和。

 

结点的带权路径长度:在一棵树中,如果其结点上附带有一个权值,通常把该结点的路径长度与该结点上的权值

                                        之积称为该结点的带权路径长度

树的带权路径长度:如果树中每个叶子上都带有一个权值,则把树中所有叶子的带权路径长度之和称为树的带

                                   权路径长度。

一般来说,用n(n>0)个带权值的叶子来构造二叉树,限定二叉树中除了这n个叶子外只能出现度为2的结点。
 
那么符合这样条件的二叉树往往可构造出许多颗,
 
 
其中带权路径长度最小的二叉树就称为哈夫曼树最优二叉树
 
特点:
根据哈弗曼树的定义,一棵二叉树要使其WPL值最小,必须使权值越大的叶子结点越靠近根结点,而权值越小的叶子结点
越远离根结点。
将权小的数据放在叶子节点,每次通过选取出最小的权构造出一个新节点再放入可被选择的区域,最终达到最佳的路线
所以:
(1)利用字符集中每个字符的使用频率作为权值构造一个哈夫曼树;
(2)从根结点开始,为到每个叶子结点路径上的左分支赋予0,右分支赋予1,并从根到叶子方向形成该叶子结点的编码

压缩前:
i am a student
压缩后:
a:2
d:1
e:1
i:1
m:1
n:1
s:1
t:2
u:1

然而压缩完以后失去了可读性
故还需将其恢复:解压缩
再将压缩文件恢复成原文件
压缩文件中存储哈夫曼编码(八位一存),解压缩文件通过读哈夫曼编码还原出字符
实现思路:
1.统计文件中字符出现的次数,利用数据结构堆建造Huffman树,出现次数多的编码短,出现次数少的编码长。
根据建造好的Huffman树形成编码,以对文件进行压缩。
2.将文件中出现的字符以及他们出现的次数写入配置文件,以便后续的解压缩。

3.根据配置文件读取相关信息重建Huffman树,对压缩后的文件进行译码。




0 0