讲清楚一个简单的概念之数据压缩

数据压缩是指在不丢失有用信息的前提下,缩减数据量以减少存储空间,提高其传输、存储和处理效率,或按照一定的算法对数据进行重新组织,减少数据的冗余和存储的空间的一种技术方法。

上面这段话摘自百度百科,大概描述清楚了数据压缩是怎么一回事。

概念

本质上,所谓”压缩”就是找出文件内容的概率分布,将那些出现概率高的部分代替成更短的形式。所以,内容越是重复的文件,就可以压缩地越小。比如,”ABABABABABABAB”可以压缩成”7AB”。相应地,如果内容毫无重复,就很难压缩。极端情况就是,遇到那些均匀分布的随机字符串,往往连一个字符都压缩不了。比如任意排列的10个阿拉伯数字(5271839406),就是无法压缩的;再比如,无理数(比如π)也很难压缩。压缩就是一个消除冗余的过程,相当于用一种更精简的形式,表达相同的内容。 可以想象,压缩过一次以后,文件中的重复字符串将大幅减少。好的压缩算法,可以将冗余降到最低,以至于再也没有办法进一步压缩。所以,压缩已经压缩过的文件(递归压缩),通常是没有意义的。

分类

  • 有损

有损压缩是指使用压缩后的数据进行重构,重构后的数据与原来的数据有所不同,但不影响人对原始资料表达的信息造成误解。有损压缩适用于重构信号不一定非要和原始信号完全相同的场合。通常可以分为特征抽取和量化两大类,特征抽取包括基于模式的编码、分形编码等,量化包括零记忆量化、预测编码、直接映射和变换编码等方法。

  • 无损

无损压缩是指使用压缩后的数据进行重构(或者叫做还原,解压缩),重构后的数据与原来的数据完全相同;无损压缩用于要求重构的信号与原始信号完全一致的场合。通常使用的是统计编码技术,包括哈夫曼编码、算术编码和游程编码等。

编码

压缩可以分解成两个步骤:

  • 第一步是得到文件内容的概率分布,哪些部分出现的次数多,哪些部分出现的次数少;
  • 第二步是对文件进行编码,用较短的符号替代那些重复出现的部分。

编码的方式有很多,比如RLE、哈夫曼、Rice、LZW等

这里简单介绍下游程编码(RLE)

原数据0000000000000001111111000000011111111111(40位)

该字符串含有15个0,7个1,7个0以及11个1,因此我们将该字符压缩为15(二进制表示:1111),7(0111),7(0111),1(0001)。所有字符串都是有交替出现的01组成的,因此我们只需要将游程的长度编码即可。

编码后数据1111011101110001(16位)

极限

概率分布一般是确定的,现在就来考虑编码,怎样找到最短的符号作为替代符。
如果文件内容只有两种情况(比如扔硬币的结果),那么只要1个二进制位就够了,1表示正面,0表示表示负面。如果文件内容包含三种情况(比如球赛的结果),那么最少需要2个二进制位。如果文件内容包含六种情况(比如扔筛子的结果),那么最少需要3个二进制位。

一般来说,在均匀分布的情况下,假定一个字符(或字符串)在文件中出现的概率是p,那么在这个位置上最多可能出现1/p种情况。需要log2(1/p)个二进制位表示替代符号。

期望

pnlog2(1/pn)=E(log2(1/p))∑pn*log2(1/pn) = E(log2(1/p))

© 版权声明
THE END
喜欢就支持一下吧
点赞0 分享