seegongsik
我的单词本
数据

装得更小的本事,压缩

把一大堆东西塞进包里时,你把同样的衣服卷起来弄小再装吧。一样没扔,可占的地方少了。数据也能这么做。在不动信息的前提下,只缩小它占的地方,这就是压缩。

01

减少重复

前面我们看到,信息
以比特,也就是 0 和 1,占地方。
要是能装得占地方更少,
就能把同样的信息留得更小。
最简单的一手是减少重复。
同样的字母连成一串时,
不用一个一个都写出来,
只记什么重复、重复几次。
AAAA 就是 A 四次,就这样。

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

点一段重复的字母。一长串变成什么重复几次,长度就短了。

长串缩短了。
一个字母都没扔。
只记了什么、几次而已。
所以再展开就是原样。
重复越多,缩得越多。
可要是不是同样的字母连成串,
而是同样的小段散在各处,
那又该怎么缩呢?

02

把模式变短

散开的重复也能缩。
找一个常出现的长段,
给它定一个短代码。
这样长段每次出现,
就换成那个短代码来写。
代码代表什么,
在一边用一张表记下就行。
出现越频繁,效果越大,
因为换得越多,缩得越多。

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

点一个常出现的小段,给它配个短代码。那个小段变成代码,整体长度就减少。

长段换成了短代码,
整体明显小了。
减少重复、给短代码,
说到底是一个意思,
把同样的信息装进更少的地方。
可这样缩完之后,
以后总会要原来的内容,
再展开时,真的能原样回来吗?

03

一还原就是原件

这是压缩最靠得住的承诺。
缩小之后再展开,
一个字母都不差,原件就回来了。
什么都没扔,当然如此。
A 四次又变回 AAAA,
短代码又变回长段。
这样一点都不丢的压缩,
叫做无损。
它正合适那些一个字母都不能错的东西,
比如文章或程序。

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

点压缩本展开。缩过的还原成原来的字母,和原件并排看是不是一样。

展开的和原件正好对上了。
装小了也没丢东西。
所以可以放心地先压着,
要用时原样唤回来。
那是不是该总是尽量
压得越狠越好呢?
其实那里藏着一个权衡。
来看看拿什么换什么?

04

更小 vs 时间

压缩可以选力度。
轻轻压就快,但缩得少;
用力压就缩得多,
可压和解都更费时间。
越仔细找重复和模式,
缩得越小,但也越费功夫。
所以正确答案随情况而变。
地方紧就用力压,
要快就轻轻压。

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

选一个压缩力度点一下。越用力,体积越小但耗时越长,权衡一目了然。

你看到体积和时间在互相拉扯。
两个不能都要。
装得越小就等得越久,
做得越快就缩得越少。
所以压缩是看情况选用的工具。
要长久存就用力压,
要常打开就轻轻压。
好,现在来把整件事理一理。

05

来理一理

归成一句话,是这样。
压缩把同样的信息装得更小。
重复缩成什么、几次,
常出现的小段给个短代码。
一还原就是原件,所以不丢东西。
压得越狠越小,
但更费时间,所以看情况选。
装小,可一还原还是原样,
这就是压缩。

依次点要点回顾一下。

依次点要点回顾一下。(减少重复 -> 给常出现的小段短代码 -> 还原即原件 -> 更小 vs 时间的权衡)

现在你掌握了
把同样的信息装得更小的本事。
光是减少重复、给短代码,
就能精打细算地省下地方。
而且一还原就是原件,
所以可以放心地装小留着。
把数据装小却又保持完整的
这种感觉,会接到下一个故事。
咱们接着一起看下去。

一句话总结压缩是把同样的信息装进更小空间的本事。有两手。一是减少重复。像 AAAA 这样同样的连成串,写成 A 四次就短了。二是给常出现的小段一个短代码。把长段换成短符号,整体就小了。而且压缩出来的,一还原就和原件一模一样,因为什么都没扔。这叫无损。压得越狠就越小,但压和解都更费时间。所以要在多小和多快之间权衡着选。一句话,减少重复、给短代码把它装小,而还原回来还是原件,这就是压缩。
数据
如果有帮助,请支持我们