寻味经典|什么是神奇的无损压缩算法[1]
1.开场白
好久不见,我是挤牙膏号主大白。
已经有一个多月没有更新文章了,最近花了些时间想了下今年要写些什么,最终确定了两个系列:
-
寻味经典系列
寻味经典
:揭秘经典算法、朴实功能背后闪闪发光的东西。
-
探索未知系列
探索未知
:介绍多个领域最前沿、最有趣的新发现和新进展。
这两个系列背后的想法也很朴实:无论是做研究还是工作,都要经过长期积累,才能深刻理解存在的问题、解决方法、瓶颈所在、突破方向等。
我们都是站在前人的肩膀上来做事情的,在享受肩膀带来便利的同时,我们也要努力去提升肩膀的高度,哪怕只有一点点。
马上开始2021年第一篇文章的阅读之旅吧!
2.压缩算法的理论基础
任何适用于工程的算法都有它的数学和信息学理论基础, 就如同我们写论文要先做仿真,理论给实践提供了一定的方向和依据。
对于压缩算法来说,我们肯定会问:这是压缩极限了吗?还有提升空间吗?
2.1 信息学之父
聊到这里,不得不提到信息学之父 克劳德·艾尔伍德·香农 ,来简单看下他的履历简介:
克劳德·艾尔伍德·香农(Claude Elwood Shannon ,1916年4月30日—2001年2月24日)是美国数学家、信息论的创始人。
1936年获得密歇根大学学士学位,1940年在麻省理工学院获得硕士和博士学位,1941年进入贝尔实验室工作,1956年他成为麻省理工学院客座教授,并于1958年成为终生教授,1978年成为名誉教授。
香农提出了信息熵的概念,为信息论和数字通信奠定了基础,他也是一位著名的密码破译者,他在贝尔实验室破译团队主要追踪德国飞机和火箭。
相关论文:1938年的硕士论文《继电器与开关电路的符号分析》,1948年的《通讯的数学原理》和1949年的《噪声下的通信》,1949年的另外一篇重要论文《Communication Theory of Secrecy Systems》。
看完这段介绍,我感觉自己被秒成了粉末了,只能默默打开了网抑云,感受一下什么是:”生而为人,我很遗憾。”
2.3 信息熵entropy
熵本身是一个热力学范畴的概念,描述了一种混乱程度和无序性, 这是个特别有用的概念,因为自然界的本质就是无序和混乱。
举个不恰当的例子,我们经常看娱乐圈八卦新闻的时候,会说信息量很大,上热搜了等等,那么我们该如何去度量信息量呢?
香农大神解决了信息的度量问题,让一种无序不确定的状态有了数学语言的描述。
在1948年的论文《A Mathematical Theory of Communication》中作者将Entropy与Uncertainty等价使用的。
文中提出信息熵是信息不确定性(Uncertainty)的度量,不确定性越大,信息熵越大。
论文地址
:http://people.math.harvard.edu/~ctm/home/text/others/shannon/entropy/entropy.pdf
在论文的第6章给出信息熵的几个属性以及信息熵和不确定性之间的联系:
简单翻译一下:
-
信息熵是随着概率连续变化的;
-
如果构成事件的各个因素的概率相等,那么信息熵随构成因素总数n的增加而增加,即选择越多,不确定性越大。
-
当一个选择可以分解为两个连续选择时,分解前后的熵值应该相等,不确定性相同。
我们假设一个事件有多种可能的选择,每个选择的概率分别记为p1,p2….pn,文章进一步给出了概率和信息熵的公式:
其中k为一个正常量, 经过前面的一些分析,我们基本上快懵圈了,太难了。 我们暂且记住一个结论: 信息是可度量的,并和内容中源字符串的概率分布密切相关。
3. 数据压缩的本质
既然有了理论的支持,那么我们来想一想 如何进行数据压缩呢?
压缩的前提是冗余的存在,消除冗余就是压缩,用更少的信息来完整表达信息,来看下百科的定义:
数据压缩是指在不丢失有用信息的前提下,缩减数据量以减少存储空间,提高其传输、存储和处理效率,
需要按照一定的算法对数据进行重新组织,减少数据的冗余和存储的空间的一种技术方法。
举几个简单的例子:
-
“北京交通大学的交通信息工程及控制专业不错” 和 “北交的交控专业不错”
在上述文本中”北京交通大学”可以用”北交”代替,”交通信息工程及控制专业”可以用”交控专业”代替。
-
“aaaaaaaaxxxxxxkkkkkkzzzzzzzzzz” 和 “8a6x6k10z”
在上述文本中有比较明显的局部重复,比如a出现了8次,z出现了10次,如果我们在分析了输入字符的分布规律之后,确定了”重复次数+字符”的规则,就可以进行替换了。
3.1 概率分布和数据编码
本质上来说, 数据压缩就是找到待压缩内容的概率分布,再按照一定的编码算法,将那些出现概率高的部分代替成更短的形式 。
所以输入内容重复的部分越多,就可以压缩地越小,压缩率越高,如果内容几乎没有重复完全随机,就很难压缩。
这个和我们平时优化代码性能的思路非常相似,热点代码的优化才能带来更大的收益。