1GB的数据确实可以压缩到比1MB更小的体积。
比如1.56GB的数字“1”,如果用txt文本的形式表示出来就会出现满大屏的“1”,但压缩过后的压缩文件可以描述为:1.txt里有多少个“1”,解压缩可以新建一个名为1.txt的文件,然后往里面写入相应数量的“1”。“1.txt里有多少个1”只会占用磁盘的几KB的空间,而1.txt里真的写入这么多个“1”后,就会占用1.56GB的磁盘空间。
但是如果生成一个随机字符组成的.txt文件,不管用任何压缩软件都很难压缩得动。
压缩软件压缩文件其实就是在找规律,利用数据的一致性和可预测性去实现压缩的目的。一般来说可以用比较精确的自然语言来描述一样事物,那么就越能够对这样事物做压缩。写出1万个“1”和说1个万“1”实际意义不一样,但所表达的意思是一样的。
由此可见压缩后的文件大小是由文件本身的属性和压缩算法共同决定。
如果在一只注射器里装满空气,然后堵住出口,适应按压注射器推进装置可以将空气压缩到很小很小的的体积,当压力释放的时候注射器的橡皮阀也会回退到原来的位置。如果往注射器里装满水,堵住出口后,用力按压注射器推进装置里面的水几乎体积不变。通过这个小实验我们就能很好地理解文件本身的属性到底是个什么东西,它决定了数据可压缩的程度。
为什么说算法也决定了文件的压缩大小呢?
算法所带来的实际效果是颠覆性的,比如算从1到100的和,从1一直加到100既费纸又费时间,还很可能中途会算错。如果找到规律仅仅只需要头数+尾数的和再乘以末尾数的一半,几秒钟就可以心算出答案。
当然算法的绝对优势建立在数据的规律性之上,而文件压缩同样是建立在数据的规律性进行压缩。但话又说回来压缩率高并不代表就一定好。如下图,从1~100的数,我们可以通过不同的程序算法将它输出到屏幕上显示出来。
- 将1、2、3、4、5、6、7、8、9……95、96、97、98、99、100直接输入到程序中,然后通过程序直接输出到屏幕上。
- 定义一个变量i,i初始值为1,输出到屏幕上后i+1,然后再输出。重复99次,就将从1~100的数全部输出到屏幕上了。
- 定义一个数组,初始值为{1,2,3,4,5,6,7,8,9,10},输出到屏幕上,再定义一个数组,值为第一个数组里的数加10,输出到屏幕上。重复9次,就将从1~100的数全部输出到屏幕上了。
算法一因为要花很多的时间将全部要显示的数都写进程序内,所以程序本身所占的存储空间是非常大的,这也意味着打开它很吃内存。算法二写出来的程序所占用的存储空间是最小的,但它需要CPU的计算量是最大的。算法三对算法一、算法二的优点、缺点进行了折中,在程序不占用过多存储空间的前提下,也让CPU计算量减少。这就可以充分地解释为什么有的压缩解压软件压缩率很高但很耗时间、很耗CPU和内存;有的压缩解压软件压缩率压缩率一般但很快能压缩、解压。每次压缩、解压都很快的软件是不存在的,因为并不是每一个文件都会遵循程序设定好的套路走。
有损压缩也是我们常会用到的一种压缩形式
有损压缩顾名思义就是会裁掉一些我们用不到的数据,仅保留我们需要的数据。比如下图的美女图片,将颜色和细节信息删除掉仅仅保留线图我们还是可以认出她是一位美女。通过有损压缩的方式是完全可以将1GB的文件压缩1MB或者更小。当然有损压缩是具有破坏性的,压缩后的数据是没有办法恢复到压缩前。
但有损压缩却是我们经常会用到的,比如图片压缩、音频压缩、视频压缩,人们看图或者显示画面的时候并不会主要到一些细节并不完善,同样即使两个音频录音采样序列可能听起来一样,但实际上并不完全一样。
文档压缩解压离我们渐行渐远
在过去网速慢而且贵的情况下,充分的体现了压缩解压的优势所在。如今网速飞快、每GB存储空间白菜价的年代能用到压缩解压的人越来越少。在软件、硬件都不断升级的前提下,人们也更加倾向于欣赏无损的图片、音频、视频。
其实压缩的技术用途还是非常广泛,比如现代通信,只有当信息的发送方和接受方都能理解编码机制的时候压缩数据通信才能工作。
以上个人浅见,欢迎批评指正。