装得更小的本事,压缩
把一大堆东西塞进包里时,你把同样的衣服卷起来弄小再装吧。一样没扔,可占的地方少了。数据也能这么做。在不动信息的前提下,只缩小它占的地方,这就是压缩。
减少重复
前面我们看到,信息
以比特,也就是 0 和 1,占地方。
要是能装得占地方更少,
就能把同样的信息留得更小。
最简单的一手是减少重复。
同样的字母连成一串时,
不用一个一个都写出来,
只记什么重复、重复几次。
AAAA 就是 A 四次,就这样。
点一段重复的字母。一长串变成什么重复几次,长度就短了。
长串缩短了。
一个字母都没扔。
只记了什么、几次而已。
所以再展开就是原样。
重复越多,缩得越多。
可要是不是同样的字母连成串,
而是同样的小段散在各处,
那又该怎么缩呢?
把模式变短
散开的重复也能缩。
找一个常出现的长段,
给它定一个短代码。
这样长段每次出现,
就换成那个短代码来写。
代码代表什么,
在一边用一张表记下就行。
出现越频繁,效果越大,
因为换得越多,缩得越多。
点一个常出现的小段,给它配个短代码。那个小段变成代码,整体长度就减少。
长段换成了短代码,
整体明显小了。
减少重复、给短代码,
说到底是一个意思,
把同样的信息装进更少的地方。
可这样缩完之后,
以后总会要原来的内容,
再展开时,真的能原样回来吗?
一还原就是原件
这是压缩最靠得住的承诺。
缩小之后再展开,
一个字母都不差,原件就回来了。
什么都没扔,当然如此。
A 四次又变回 AAAA,
短代码又变回长段。
这样一点都不丢的压缩,
叫做无损。
它正合适那些一个字母都不能错的东西,
比如文章或程序。
点压缩本展开。缩过的还原成原来的字母,和原件并排看是不是一样。
展开的和原件正好对上了。
装小了也没丢东西。
所以可以放心地先压着,
要用时原样唤回来。
那是不是该总是尽量
压得越狠越好呢?
其实那里藏着一个权衡。
来看看拿什么换什么?
更小 vs 时间
压缩可以选力度。
轻轻压就快,但缩得少;
用力压就缩得多,
可压和解都更费时间。
越仔细找重复和模式,
缩得越小,但也越费功夫。
所以正确答案随情况而变。
地方紧就用力压,
要快就轻轻压。
选一个压缩力度点一下。越用力,体积越小但耗时越长,权衡一目了然。
你看到体积和时间在互相拉扯。
两个不能都要。
装得越小就等得越久,
做得越快就缩得越少。
所以压缩是看情况选用的工具。
要长久存就用力压,
要常打开就轻轻压。
好,现在来把整件事理一理。
来理一理
归成一句话,是这样。
压缩把同样的信息装得更小。
重复缩成什么、几次,
常出现的小段给个短代码。
一还原就是原件,所以不丢东西。
压得越狠越小,
但更费时间,所以看情况选。
装小,可一还原还是原样,
这就是压缩。
依次点要点回顾一下。(减少重复 -> 给常出现的小段短代码 -> 还原即原件 -> 更小 vs 时间的权衡)
现在你掌握了
把同样的信息装得更小的本事。
光是减少重复、给短代码,
就能精打细算地省下地方。
而且一还原就是原件,
所以可以放心地装小留着。
把数据装小却又保持完整的
这种感觉,会接到下一个故事。
咱们接着一起看下去。