在之前去马赛克的科普中,我们知道在大多数时候,信息是不能由少变多的,除了靠联想,这也是目前“还原”图片马赛克唯一的办法。
但在我们实际使用计算机的时候,有一种我们经常使用的技术——文件的压缩,解压。这个过程难道不是信息的由多到少,再由少到多的过程吗?
还真不是。
文件的信息量并没有在压缩的过程中减少,因此解压时也就不存在“增多”一说。
那压缩文件是如何做到在保留信息含量的情况下,让文件变小的呢?
我们都知道,电脑上的数据都是以一连串的二进制信息,也就是“0”和“1”的形式存储的。
比如电脑CPU,里面是成千上万的晶体管,这些晶体管只有两种状态,通电和断电。“0”代表断电,“1”代表通电。
再比如硬盘中存储的并不是我们屏幕中看到的文字或图片,而是硬盘中的盘片,通过磁化,用磁极S和N极代表数字“0”和数字“1”来存储信息的。
而一个“0”或“1”的大小就是一比特(Bit),8比特等于一子节(Byte),1024字节就是我们更为常见的1KB。以此类推,1024KB等于1MB,1024MB等于1GB。
知道了数据的大小后,便可以来看电脑实际上在处理的二进制编码了。
「01000001表示字母A
01000010表示字母B
01000011表示字母C
01000100表示字母D」
这一段国际上常用的ASCII编码中字母A-D对应的二进制表示方法。不难看出这些编码中含有大量重复的部分,比如D前面五位数字都是「01000」,每行都有「表示字母字样」。
而压缩文件的原理,本质上就是通过找规律,简化这些电脑0和1之间的排列组合。
比如这里就可以用上「字典算法」压缩这个文件。
字典算法,即把文本中出现频率较多的单词或词汇组合做成一个对应的字典列表,并用特殊代码来表示这个单词或词汇,类似我们小时候解方程时把一个等式列为未知数。
如果这里我们将「01000」列为X,「表示字母」列为Y,就可以这样压缩上面那段编码:
「X001YA
X010YB
X011YC
X100YD」
换种方法解释就是如果你说:
「我吃火锅会拉肚子,我昨天吃火锅了,我今天拉肚子了」
用字典算法就可以将这句话压缩成:
「我吃A会B,我昨天A了,我今天B了」
当然,同样的内容,其实还可以用「固定位长算法」,「RLE」等等算法来进行压缩,但原理都是通过找规律,再进行归纳整理,这就完成电脑了一次压缩。
而有的时候,有的文件可以压缩的很小,有的压缩完却几乎没有变化也是这个原因。内容相似之处较多时则容易压缩的很小,反正则不容易压缩。
参考来源:
《压缩文件原理》,CSDN
《压缩文件的原理到底是什么?》啃芝士