压缩算法引申

来源:互联网 发布:js开源项目的网站 编辑:程序博客网 时间:2024/04/30 11:37

有一天,有个同事在群里发了一个有关很牛叉的压缩的介绍链接,个人根据自己以前学的信号处理,做了下述的评论,这仅是我作为外行人的评论,不一定准确,各位看客轻拍:

那篇压缩文章链接:

 

在压缩算法界,有个笑话:「圆周率(Pi)压缩法」就是一个例子,常被用来开压缩算法的玩笑 —— 但不止是玩笑而已,理论上确实管用。方法是你把想要的压缩文件二进制化,然后在二进制化的 Pi 序列里找这段数据。由于 Pi 是无限不循环小数,所以任何你所选择的二进制数据最终都会在Pi里被找。这是个疯狂的但是尚未被彻底推翻的理论上可行的算法。但是如果我们只是要对单个文件进行压缩,而不是多个,这个方法一定管用。

个人感觉这个算法从理论上也不见得是可行的。 首先,从信息的分解角度看,Pi虽然是无限不循环小数,但是其所组成的二进制数字组合并不具备正交性,也不一定具备完备性——当前应该没有数学理论说明无限不循环小数具备数值完备性。最简单的证伪方式,如果上述规则不变,只是遍历pi数据串以找到相应待编码的数据串,那么1/3,一个无限循环小数,pi就无法表示了。 因为pi无法构建正交集,这就会影响这个算法的适用性。就像文章中提及,这个是拼人品的算法。因为非正交,并且没有对应的计算公式,即使具备完备条件,这个算法就是耗时无效率的算法。所以,正交性在信息分解上非常重要,这也是为什么FFT算法在时间序列分析上一如既往的流行。FFT算法基础函数是正余弦函数集(exp(jnx)),其正交和完备性都在数学上有证明。 从物理学角度看,有很多极具高压缩的算法模型: 比如,已知一个向上垂直抛射的弹珠,初始速度是v0,求解这颗弹珠上升下降的所有过程。 解决这道题目,就是使用众所周知的牛顿第二定律,加上已知的重力加速度。 把这个模型映射到压缩的编解码,就是 初始速度v0(压缩结果) + {牛顿第二定律,重力加速度}(解码算法)==> 弹珠复杂的上升下降过程 通过一个简单的压缩结果,就可以得到一堆的数据。 如果对弹珠的上升下降过程以1M量级的采样速率,记录空中{当前位置、当前速度、当前前进方向}(这些数据是不重复的),记录对象有1000个不同的弹珠和不同的初始速度,最后压缩效率也会是TB->KB的效率。

从信息学类比热力学的角度看,一个封闭的信息系统,没有外界传入信息熵,信息是不会自动增加的(这个观点,在吴军的《数学之美》中有阐述过)——说明不管什么算法,如果这个算法只是单纯且无损的转换关系,比如zip,fft等,原本的信息量是不会增加的。文章中有那么牛逼的算法,个人觉得信息量要么本来信息量就是有限的,要么就是类似上面那样的物理模型,有个已知的极度抽象的模型。 为了更好的理解这个“已知模型"的作用,用统计学的贝叶斯定理做理解

从统计学的角度看,经典的贝叶斯定理:

检验 + 当前或历史数据 ==> 预测未来

这个公式用在很多地方,压缩算法zip找重复数据的方式、MP3中人耳听觉掩蔽模型、jpg小波变换有损压缩(去除高阶项)都算是“经验”,即对应的压缩算法。这个公式和压缩解压过程的映射关系就是:经验 - 解压算法,当前或历史数据 - 压缩结果,预测未来 - 解压后的数据。如果压缩结果很小,而压缩结果又很大,解压算法肯定牛逼,但是这个解压算法一般通用性不会很高。 经验或者说是规律的提取,成为压缩算法的精要步骤。但是具备通用性的算法,往往抽象的难度会很高;而比较特定的情况,往往比较容易获取。就好比把那个向上抛的小球改为斜抛,并加上空气阻力和风速,就成了计算弹道轨迹的一道题目。这个至今没有通解,也就没有办法提供高效的算法。

那到底有没有高效又通用的压缩算法呢?个人感觉,海森堡在量子力学和信号处理里都说明了,不确定性原理的理论基础。信号处理是信息提取的方法,所以,该理论在信息学应该也是可行的。 海森堡的测不准原理在信息学也是通用的。在高效和通用间,没有绝对的完美,要么此消,要么彼长,这就看特定情况的取舍。

0 0