基于Huffman和LZ77的文件压缩(一)Huffman压缩

点我获取代码

1 压缩的优点
1 节省空间
2 提高文件在网络上的传输效率
3 压缩可以形成一定程度上的加密。

2 文件压缩的分类
1 有损压缩
2 无损压缩

无损压缩: 通过解压之后 能形成和源代码一木一样的压缩方式。
有损: 解压缩之后和源文件格式不完全相同,但基本不影响。例如 视频的清晰度。

先大概了解

	LZ77  基于语句 ,用<长度,距离, 下一个字符> 替换重复出现的语句

**LZ77的变形 **:原理:将重复多次出现的语句用尽可能短的标记来替换。

eg :asdfghjkl1234asdfgh0
asdfghjkl1234(连着重复出现的个数,当前位置向前数距离)0

LZ77消除了文件中重复出现的语句,但还存在字节之间的重复 ,因此再用哈夫曼编码压缩一次。

Huffman压缩

哈夫曼编码

哈夫曼编码是可变字长编码,该方法完全依据字符出现概率来构造异字头的平均长度最短的码字

Huffman压缩:基于字节

1 个字节 == 8个比特位,如果对每个字节都能找到更好的改写方法改写原数据,就可以达到压缩的目的。

举个栗子:
文件 :ABBBCCCCCDDDDDDD
提供这样的哈夫曼编码
eg: A: 00
B: 01
C: 10
D: 11
来一组字符串 ,就会进行相应的替换。大大节省空间

这种Huffman压缩之后,大小原来的1/4

还存在不等长编码:
A: 100
B:101
C:11
D:0

这样的话,D出现次数处越多,压缩的效果就越好。

如果将C的编码改成10,那么就成了A 或B的编码前缀,压缩时不会出现问题,但解压缩可能会出问题,遇见10 就不知道怎么解析。

ABBBCCCCCDDDDDDD
基于Huffman和LZ77的文件压缩(一)Huffman压缩_第1张图片

什么是huffman哈夫曼树

带权路径最小的二叉树为哈夫曼树

带权路径长度WPL:
WPL = 所有叶子的权 * 根到该叶子的路径长度 之和

Hffman压缩四部曲:

1 : 统计每个字符出现的次数
2 : 创建哈夫曼树:
3 :获取字符的编码(二进制串)
4 : 用编码改写源文件

核心:Huffman 树的构建

1 提供一组字符权值(出现的次数)

2 以每个权值为节点,创建n颗只有根节点的二叉树的森林

3 如果森林超过两棵树 ,进行以下操作:
a: 从森林中每次取出两颗根节点权值最小的二叉树

b:以这两颗二叉树作为某个节点的左右子树,创建出一颗新的二叉树,新二叉树权值为左右子树权值之和。

c: 将新创建的二叉树插入到森林中,直到二叉树森林中只剩一棵树。

点我继续阅读

你可能感兴趣的:(文件压缩)