没有合适的资源?快使用搜索试试~ 我知道了~
经典压缩算法zip的详细解释。文档详细解释了算法的思想,和实现。适合初学者。
资源推荐
资源详情
资源评论
zip 的算法原理
无损数据压缩是一件奇妙的事情,想一想,一串任意的数据能够根据一定的规则转换成只
有原来 1/2 - 1/5 长度的数据,并且能够按照相应的规则还原到原来的样子,听起来真是很
酷。
原理部分:
有两种形式的重复存在于计算机数据中,zip 就是对这两种重复进行了压缩。
一种是短语形式的重复,即三个字节以上的重复,对于这种重复,zip 用两个数字:1.重复
位置距当前压缩位置的距离;2.重复的长度,来表示这个重复,假设这两个数字各占一个
字节,于是数据便得到了压缩,这很容易理解。
一个字节有 0 - 255 共 256 种可能的取值,三个字节有 256 * 256 * 256 共一千六百多万种可
能的情况,更长的短语取值的可能情况以指数方式增长,出现重复的概率似乎极低,实则
不然,各种类型的数据都有出现重复的倾向,一篇论文中,为数不多的术语倾向于重复出
现;一篇小说,人名和地名会重复出现;一张上下渐变的背景图片,水平方向上的像素会
重复出现; 程序的源文件中,语法关键字会重复出现(我们写程序时,多少次前后
copy、paste?),以几十 K 为单位的非压缩格式的数据中,倾向于大量出现短语式的重复。
经过上面提到的方式进行压缩后,短语式重复的倾向被完全破坏,所以在压缩的结果上进
行第二次短语式压缩一般是没有效果的。
第二种重复为单字节的重复,一个字节只有 256 种可能的取值,所以这种重复是必然的。
其中,某些字节出现次数可能较多,另一些则较少,在统计上有分布不均匀的倾向,这是
容易理解的,比如一个 ASCII 文本文件中,某些符号可能很少用到,而字母和数字则使用
较多,各字母的使用频率也是不一样的,据说字母 e 的使用概率最高;许多图片呈现深色
调或浅色调,深色(或浅色)的像素使用较多(这里顺便提一下:png 图片格式是一种无
损压缩,其核心算法就是 zip 算法,它和 zip 格式的文件的主要区别在于:作为一种图片格
式,它在文件头处存放了图片的大小、使用的颜色数等信息);上面提到的短语式压缩的
结果也有这种倾向:重复倾向于出现在离当前压缩位置较近的地方,重复长度倾向于比较
短(20 字节以内)。这样,就有了压缩的可能:给 256 种字节取值重新编码,使出现较多
的字节使用较短的编码,出现较少的字节使用较长的编码,这样一来,变短的字节相对于
变长的字节更多,文件的总长度就会减少,并且,字节使用比例越不均匀,压缩比例就越
大。
在进一步讨论编码的要求以及办法前,先提一下:编码式压缩必须在短语式压缩之后进行
因为编码式压缩后,原先八位二进制值的字节就被破坏了,这样文件中短语式重复的倾向
也会被破坏(除非先进行解码)。另外,短语式压缩后的结果:那些剩下的未被匹配的单
双字节和得到匹配的距离、长度值仍然具有取值分布不均匀性,因此,两种压缩方式的顺
序不能变。
在编码式压缩后,以连续的八位作为一个字节,原先未压缩文件中所具有的字节取值不均
匀的倾向被彻底破坏,成为随机性取值,根据统计学知识,随机性取值具有均匀性的倾向
(比如抛硬币试验,抛一千次,正反面朝上的次数都接近于 500 次)。因此,编码式压缩
后的结果无法再进行编码式压缩。
短语式压缩和编码式压缩是目前计算机科学界研究出的仅有的两种无损压缩方法,它们都
无法重复进行,所以,压缩文件无法再次压缩(实际上,能反复进行的压缩算法是不可想
象的,因为最终会压缩到 0 字节)。
短语式重复的倾向和字节取值分布不均匀的倾向是可以压缩的基础,两种压缩的顺序不能
互换的原因也说了,下面我们来看编码式压缩的要求及方法:
压缩文件无法再次压缩是因为:
1. 短语式压缩去掉了三个字节以上的重复,压缩后的结果中包含的是未匹配的单双字节,
和匹配距离、长度的组合。这个结果当然仍然可能包含三个字节以上的重复,但是概率极
低。因为三个字节有 256 * 256 * 256 共一千六百多万种可能的情况。
所以只要把原始文件中“自然存在”的短语式重复倾向压掉就可以了,一千六百万分之一的
概率再去压缩没有必要。
编码式压缩利用各个单字节使用频率不一样的倾向,使定长编码变为不定长编码,给使用
频率高的字节更短的编码,使用频率低的字节更长的编码,起到压缩的效果。如果把编码
式压缩的“结果”按照 8 位作为 1 字节,重新统计各字节的使用频率,应该是大致相等的。因
为新的字节使用频率是随机的。相等的频率再去变换字节长短是没有意义的,因为变短的
字节没有比变长的字节更多。
所以压掉了原始文件中“自然存在”的单字节使用频率不均匀的倾向后,随机的使用频率再
去压缩也失去了意义。
首先,为了使用不定长的编码表示单个字符,编码必须符合“前缀编码”的要求,即较短的
编码决不能是较长编码的前缀,反过来说就是,任何一个字符的编码,都不是由另一个字
符的编码加上若干位 0 或 1 组成,否则解压缩程序将无法解码
看一下前缀编码的一个最简单的例子:
符号 编码
A 0
B 10
C 110
D 1110
E 11110
有了上面的码表,你一定可以轻松地从下面这串二进制流中分辨出真正的信息内容了:
1110010101110110111100010 – DABBDCEAAB
要构造符合这一要求的二进制编码体系,二叉树是最理想的选择。考察下面这棵二叉树:
要编码的字符总是出现在树叶上,假定从根向树叶行走的过程中,左转为 0,右转为 1,则
一个字符的编码就是从根走到该字符所在树叶的路径。正因为字符只能出现在树叶上,任
何一个字符的路径都不会是另一字符路径的前缀路径,符合要求的前缀编码也就构造成功
了:
a - 00 b - 010 c - 011 d - 10 e – 11
接下来来看编码式压缩的过程:
为了简化问题,假定一个文件中只出现了 a,b,c,d ,e 四种字符,它们的出现次数分别
是
a : 6 次
b : 15 次
c : 2 次
d : 9 次
e : 1 次
如果用定长的编码方式为这四种字符编码: a : 000 b : 001 c : 010 d : 011 e : 100
那么整个文件的长度是 3*6 + 3*15 + 3*2 + 3*9 + 3*1 = 99
用二叉树表示这四种编码(其中叶子节点上的数字是其使用次数,非叶子节点上的数字是其
左右孩子使用次数之和):
(如果某个节点只有一个子节点,可以去掉这个子节点。)
剩余12页未读,继续阅读
资源评论
schindleren
- 粉丝: 1
- 资源: 8
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功