文件压缩:ZIP
1.什么是文件压缩?
数据压缩是指在不丢失有用信息的前提下,缩减数据量以减少存储空间,提高其传输、存储和处理效率,
或按照一定的算法对数据进行重新组织,减少数据的冗余和存储的空间的一种技术方法。
2.为什么需要对文件进行压缩?
a.文件太大,为了节省空间
b.提高数据在网络上传输的效率
c.压缩之后,对文件可以起到加密的作用。在文件传输的过程中更安全
3.文件压缩分类?
a.有损压缩:解压缩之后不能将其还原成与源文件完全相同的格式。解压缩之后的文件虽然有损,但是在识别文件内容的时候,基本没有障碍。
举例:看电影的时候,有表情,高清,蓝光。视频文件进行了分类,虽然视觉有体验差异,但是并没有影响对信息的获取
b.无损压缩:源文件被压缩之后,通过解压工具如果能够还原成和源文件完全相同的形式
4.如何进行压缩?
GZIP压缩算法经历了两个阶段
第一个阶段使用改进的LZ77压缩算法对上下文中的重复语句进行压缩
第二阶段,采用huffman编码思想对第一阶段压缩完成的数据进行字节上的压缩,从而实现对数据的高效压缩存储。
对于一些文件来说可以通过一定的算法,来达到压缩的目的。
GZIP:GZIP就是L7ZZ的变形 + 基于哈夫曼编码的压缩
L7ZZ变形:原理就是将重复出现的语句用距离长度对来替换
举例: 对mnoabczxyuvwabc123456abczxydefgh进行压缩
压缩结果:mnoabczxyuvw(9,3)132456(18,6)defgh
括号中数字的意思就是在距离现在9个字符的位置,往后数有3个字符重复
所以说现在的问题就是如何从一个长的文件中找到尽可能多的字符?假如使用的是STL中的字符匹配,
时间复杂度太大,所以有别的查找算法。在第一步压缩结束的情况下,再进行基于哈夫曼编码的再次压缩
L7ZZ:是基于语句的压缩。
哈夫曼编码是基于字节的压缩。
了解:L7ZZ压缩算法简单介绍
GZIP中哈夫曼思想:
通过前面LZ77变形思想对源数据进行语句的重复压缩之后,语句层面的重复性已经解决,但并不代表压缩效果已经
达到最佳,字节层面可能也有大量重复的。比如:"BCDCDDBDDCADCBDC"
一个字节占8个比特位,那如果能对所有字节找到小于8个比特位的编码,然后用找到的编码对源文件中对应字节重
新进行改写,也可以让源文件更小。
1.静态等长编码
根据静态等长编码压缩方式将"BCDCDDBDDCADCBDC"压缩后为01101110 11110111 11100011 10011110,压缩完成后的结果只占4个字节
2.动态不等长编码:
使用不等长编码对源数据进行压缩:10111011 00101001 11000111 01011,最后还比登长压缩,多压缩了三个比特位,效果比等长压缩,更好一点。
获取哈夫曼编码:
现在问题就是,如何根据需要压缩的文件,获取哈夫曼编码树,再由哈夫曼编码树确定不等长编码?
huffman树构建
1. 由给定的n个权值{ w1, w2, w3, … , wn}构造n棵只有根节点的二叉树森林F={T1, T2 , T3, … ,Tn},
每棵二叉树Ti只有一个带权值wi的根节点,左右孩子均为空。
2. 重复以下步骤,直到F中只剩下一棵树为止
a.在F中选取两棵根节点权值最小的二叉树,作为左右子树构造一棵新的二叉树,新二叉树根节点的权值为其左右子树根节点的权值之和
b.在F中删除这两棵二叉树
c.把新的二叉树加入到F中
问题:如果不等长编码中出现一个编码是另一个编码的前缀怎么办?该情况是否会出现?
肯定不会,因为每个叶子节点都是唯一的,通往叶子结点的路径也是唯一的。