seegongsik
数据

压缩 怎么工作

收拾行李箱时,把衣服卷紧了放进去,同样的衣服就能塞进更小的地方。一件也没落下,箱子里却宽松了。数据也可以这样处理:里面的信息原封不动,只把占的地方变小,这门技术就叫压缩。

01

减少重复

上一课,我们看了怎样把数据放在近处、读得更快。把数据变小,也能变快:小了,存起来占的地方少,通过网络传送的时间也短。计算机用 0 和 1,也就是比特来表示一切信息,所以同样的信息要是能用更少的比特表示,就占了便宜。
最简单的办法是减少重复。同一个字母一个接一个地连着出现时,不必一个个全写出来,只写下是什么、连了几次。比如把 AAAA 这四个字母写成“A 四次”。

压缩本 · 长度 12
原件 · 长度 12
AAAABBBCCCCC
点一段重复来缩小

点一段重复。一长串字母缩成“什么、几次”,总长度变短了。

把每一段都缩短,原来十二格长的原件就变成了九格。一个字母也没扔,只是写下了什么、几次。不过,只连了三次的那一段,缩写后格数还是一样,没有好处。重复越长,缩得越多。
这种办法叫游程编码,适合像大片涂着同一种颜色的图画那样、重复很长的数据。可要是同样的字母并不挨在一起,而是同样的片段东一处西一处地散着,这个办法就不管用了。散开的重复该怎么减少?

02

给常出现的片段配短代码

散开的重复也能减少。找出经常出现的长片段,给每一段定一个短代码,片段每出现一次,就换成代码来写。哪个代码代表哪个片段,另外记在一张表里。
片段出现得越频繁,替换得越多,效果就越大。表也得一起存下来,所以很短的数据反而可能变大。实际使用的压缩程序,很多都以这种指回前面出现过的片段的办法为基础。

数据 · 长度 18
thexandtheyandthez
给常出现的片段配代码
点一个片段,给它配短代码

点一个常出现的片段,给它定个短代码。这个片段出现的地方都会换成代码,总长度就减少了。

给两个片段配上代码后,十八格缩成了八格。减少重复也好,配短代码也好,说到底出自同一个想法:数据里有重复的部分,就把那部分少写一些。
反过来说,完全没有重复的随机数据是压不小的。已经压缩过的文件再压一次几乎变不小,也是这个缘故。那么,这样压小的东西再展开,真的能原样回来吗?

03

还原就是原件

用前面这些办法,展开后原件一字不差地回来,因为什么都没扔。“A 四次”这条记录展开后又变回 AAAA 四个字母,短代码查一查表,又变回长片段。
像这样什么都不丢的压缩,叫无损压缩。文字、程序这类错一个字母都不行的数据,一定用无损压缩。

压缩本
展开的
依次点压缩本来展开
原件
AAAAtheBB
依次点压缩本来展开

依次点压缩本来展开。缩写的记录解开成原来的字母,还能和原件并排对比,看是不是一样。

展开的和原件连每个字母都一样。压小了也没丢东西,所以尽可以放心压缩,需要时再原样还原。
另一方面,照片、音乐、视频有时会故意扔掉人几乎察觉不到的细节,把文件压得小得多。这叫有损压缩,扔掉的部分再也找不回来。那么,无损压缩是不是总该压得越狠越好?

04

更小 vs 更快

压缩可以选力度。轻轻压,很快就完,可压得不太小;用力压,能压得更小,可压缩要花更多时间。重复的片段找得越仔细,结果越小,但要做的工作也越多。
所以正确答案因情况而异。压一次就长期保存的文件,或者要让很多人下载的文件,就用力压;每次发送都得当场压缩的,就轻轻压。

体积
时间
选一个压缩力度点一下

选一个压缩力度点一下。压得越狠,体积越小,可花的时间越长,这种取舍一目了然。

体积和时间朝相反的方向变。两样不能同时都要:想压得更小就得多等,想快点完就压不了那么小。很多压缩方法解压的时间不怎么随力度变化,所以付出代价的主要是压缩那一方。
所以,压缩是要根据情况挑着用的工具。地方紧,就用力;时间紧,就轻轻。

05

小结

归纳起来是这样:压缩是把同样的信息装进更小地方的技术。连成一串的重复缩成“什么、几次”,散开的片段配上短代码。前面这些办法都是还原后和原件一模一样的无损压缩。
压得越狠越小,但更费时间,所以要看情况选。找到重复、少写一些,可一还原又原封不动,这就是压缩。

依次点要点回顾一下。

依次点要点回顾一下。(减少重复 → 常出现的片段配短代码 → 还原就是原件 → 更小 vs 时间的取舍)

好几台计算机互相传数据时,也会用到压缩,因为压小了就到得快。
可要是数据大到怎么压都装不进一台计算机,又该怎么办?把数据分到好几台机器上存,再留副本以防故障,下一课讲分布式数据时会说明这个办法。

一句话总结压缩是把同样的信息装进更小地方的技术。同一个字母连着出现,就只写是什么、几次;常出现的片段配上短代码,记在表里。重复越多压得越小,没有重复的随机数据压不小。前面这些办法都是还原后连每个字母都和原件一样的无损压缩;照片、音乐有时则用有损压缩,扔掉不易察觉的部分。压得越狠越小,但更费时间,所以要在体积和时间之间取舍。找到重复、少写一些,一还原又原封不动,这就是压缩的要点。
← 数据
如果有帮助,请支持我们