用数学运算实现数据无损压缩的算法

用数学运算实现数据无损压缩的算法
(An arithmetic On Lossless Data-Compress By Mathematical Operation)
王春海1 魏玉冬2
[1]河北经贸大学信息技术学院 2河北经贸大学数统学院)
摘 要 通常的无损压缩算法,大多最多只能达到 30 %左右的压缩率。本文提出的压缩算法思想,可以使数据的无损压缩率达到千万分之几,甚至更高。
关键词 :数学运算 数据压缩 无损压缩 海量数据 压缩率 数学函数 数学表达式
1 数据的保存对数据压缩有迫切的需求
现在社会是信息社会,各类信息充斥于生活工作的各个方面,人们离不开信息的搜集、处理、保存与交流。历史遗留下来的信息数据,现时的信息数据,将来的信息数据,其数量之庞大令人难以想象。这些海量的数据,没有任何一个单位或一个实体可以全部保留,只能是保存相应方面的部分数据,在需要时通过网络进行查找和传输,以期达到数据的的共享与使用。但随着数据量的日益累积,网络访问量的激增,将会占用很多时间和网络带宽。为增加网络传输速度,减少访问时间,最直接的方法是增加网络带宽(从最早使用的拨号到 DDN 专线,带宽已达十兆、百兆、千兆…)。但是,网络带宽终有极限,数据也越积越多,如此下去终有一天,众多的数据将无法保存。怎么解决这一问题呢?采用高效的数据压缩是一种较好的选择
2 现有的压缩算法效率低下
目前,数据压缩主要分为两种,一种是有损压缩,主要用于音频、视频、图形、图像的压缩,其主要特征是,数据经压缩后,人们可以接受;另一种是无损压缩,适用于文本文件、数据库、程序等数据的压缩,其特点是,数据经压缩→解压缩后,可以完全与压缩前的数据一样。一般情况下,采用无损压缩,最大的压缩率只能达到 70 %左右(即压缩后的文件是原文件的 30 %)。 通常情况下 50 %- 60 (即压缩后的文件是原文件的4050% 。压缩率如此低的原因主要在于,目前的无损压缩算法,都是基于在文件中找相同的、重复的序列进行压缩。即使 对文本文件、数据库文件等重复性比较高的数据进行压缩,其压缩率最大也只有70%;而 如果对可执行程序(比如 EXE 文件、 COM 文件等),其压缩率只能达到百分之几。因此,寻找更好更有效的办法提高数据的压缩率,具有重大的现实意义。
3 用数学运算实现数据压缩算法
在此,本人提出一种新型的压缩算法,即利用数学运算实现数据的高压缩率。
计算机内的所有数据无论是文本文件、图形文件,还是可执行文件,都可编辑为 16 进制数据文件。下面就是一个文件的部分 16 进制数据:
D5 E2 CA C7 D2 BB B8 F6 CA DD EA 7F 92 23
11 23 42 7F DE 9D C7 98 72 1D A2 6F 7F 8F
对于这种数据文件,基于简单的数学知识,我们有以下事实:
组成这些文件的数据均可视为一个有限位的整数序列,这是显然的,因为任意一个文件无论多长,总是有限的,于是其对应的数据文件也是有限的;
每个整数序列均可视为某个无理序列的一个片断,这也是显然的,做如此分析,意义主要在于随后的数据处理更易于实现;
每个无理序列均可由某个函数在某点的函数值取得,这在理论上是行的通的,如 10 进位制数据 141421356 …可认为是由无理数  =1.41421356 …的若干位片段获得。
由此提出数学运算压缩算法的具体思想:
构造具备理想长度的无理数片段数据库,被压缩文件与之对应,;
构造函数库,这个数据库由足够简单的、易于实现高精度数值计算的函数构成,并使无理数片段数据库中的每一数据均可由函数库中的某一函数的某一相对简单的数值的函数值取得,或若干函数值的代数和;
任何一个文件在计算机上记录为一个数字序列,例如, 一张刻�M的CDDVD光盘,如果将其做成一个光盘映射文件,这个文件用数字的方式保存在计算机的硬盘上,将会是一个数字的序列(因为计算机中最终保存的都是16进制数据)。如果这个文件的数据文件排序 与无理数片段数据库中某个无理数片段的排序相同,则这个文件可由函数库中的某个函数的某一函数值计算获得。
对任何一个文件,找出与之对应的无理数片段,并随之得到产生此值的函数 f (x) 于是文件将以函数形式 f (x), 参数 1 ,参数 ,也即文件被压缩为简单的函数形式 f (x), 参数 1 ,参数 2 。打开压缩文件时,只需简单运算即可得到原文件的数据文件。
此设想的现实意义:面对浩如瀚海的数据,只需要极小的存储就可以代表。在网络上需要下载东西时,也无需下载实际的数据,只要下载与其对应的数学表达式,当真正需要时,在本地运算就可以了。这样,占用网络带宽将极低,甚至不用下载。例如:一个几百兆或几千兆的镜像文件,如果用一个简单的数学表达式来代表,我们完全可以直接把这个数学表达式抄下来即可。
4 数学运算数据压缩法需考虑的问题
数学运算数据压缩法也有相当大的局限性和不足:
①现有的数据都是采用数字方法进行保存,数字方法有其优点,但也有其严重的缺点。用数学方法实现数据的无损压缩,是用“模拟”的方法来保存“数字”,数字数据永远只能、最大近似的“模拟”模拟数据,却不能完全真实的再现模拟数据。举例来说:e1,这可以看做一个模拟数据,e1的结果是一个数字信号。e1的结果永远是模拟e1,却不能代替e1这个数据。
②数学运算数据压缩法的数据库巨大且生成的代价较大。以长度为百位无理数片段为基本单元的数据库为例,即使按十进制算,数据库中也将有10100数据及相应的生成函数,这是一个天文数字。但这是值得的,因为这毕竟得到了百分之九十几的压缩率,而对解压无过高要求,只需通过简单运算即可。如果建立的数据库足够大,将可以达到千万分甚至更大的压缩率。另外,我们可以通过一些方法,使数据库中的函数尽可能的少。这一方面可以参看下面第5部分的内容。
③虽然对任意的数据,我们都可以用一个相对简单的数学表达式来代替,但代价比较巨大,且不易实现。我们可以采用“分段”的方法实现,就是对于任意长度为p1的数字序列,按照p2的长度进行分段,p2序列的数据对应的简单的数学表达式已经事先存放在一个数据库中,如果p2序列的压缩率足够,整个数据就可以达到p2的压缩率。具体实现思路请见下文。
5 数学运算数据压缩算法的实现步骤
假设我们想达到千分之几的无损压缩率(压缩后的文件是原来的千分之几),那我们需要创建一个包括一个如下格式的数据库:
1:数据库与数学代表式对应表
数学表达式
数字序列
f(x1)
0000 ……(9910)……0000
f(x2)
0000 ……(9910)……0001
……
……
f(xn)
ffff ……(991f)……ffff
其中f(xn)是一个有限位的数学表达式,如e3 1og3等。在生成数据库时,采用某个数学表达式,取其运算结果到1000位,并且此结果序列与上表中的数字序列进行查找,与某一行相对应,就用此数学表达式代替这一行。
这样,一个任意长度的数据序列,将按照每1000位进行分段,并查找上表1,每1000位用一个数学表达式相对应。在分段后,如果最后一个分段不足1000位,记下此段的长度,然后不足部分补0,然后再查找表1。此时形成的压缩文件内容如下:
文件长度,压缩率,数学表达式1,数学表达式2,……,数学表达式n1,最后一个数学表达式n
n         文件长度:压缩前文件的总长度
n         压缩率:分段方法,如按照1000位进行分段
n         数学表达式1:第11000位序列对应的数学表达式
n         数学表达式n:第n1000位序列对应的数学表达式
在解压缩时,每一个数学表达式运算到“压缩率”对应的位数。
为了减少数据库中函数的数量,我们可以采用如下的方法来解决:
假设函数f(x1)的运算结果,前100位与某一个序列相对应,如果把f(x1)运算到101位,将运算结果的第1位去掉,剩下的100位也将与这个数据库中的某一个序列相对应。如果把f(x1)运算到100n位,将运算结果的前n位去掉,也将与数据库中的某一个序列相对应。采用此种方法,将会把数据库中函数的类型与数量降到最低。
对此,我们提出数学运行法的压缩算法:
任意的、足够多的数据,将其保存为一个足够大的、单一的数据文件,这将是一个有理数的序列。对于这个序列,我们按照表1中的“压缩率”进行分段,每一段由其相对应的数学表达式来表示。
压缩后,将是一个如下的序列:
f(x1,y1,z1),n11,n12,n13 f(x2,y2,z2),n21,n22,n23,……,f(xm,ym,zm),nm1,nm2,nm3
意义如下:
f(x,y,z) 代表一个数学表达式f()可以是一个数学公式、数学函数或一个简单的算术表达式,xyz代表数学表达式的参数,n1,表示这个数学表达式运算结果的第某一位,n2指从n1位开始后的长度,代表数据的大小。如果n2过于大,n2也可以用一个数学表达式代替,此时数学表达式变为:
f(x,y,z),n1,(f2(x,y,z)),n3
在解压缩时,可以用多线程的方法,同时运行许多数学表达式,然后运算到指定位数进行“组合”。在运算到最后一个数学表达式时,运行到“文件长度”与“压缩率”的余数即可。

[1]   作者简介:王春海1,男,汉,河北河间。河北经贸大学信息技术学院实验中心,助理工程师。
魏玉冬2,男,汉,河北新乐。河北经贸大学数统学院,高级讲师。
注:本文的整体思想、数学运算压缩算法思想由王春海提出,本文的数学表达实现由王春海和魏玉冬提出。本文最早在2004年发表于于河北经贸大学学报上

你可能感兴趣的:(海量数据,无损压缩,压缩率,数学函数 数学表达式,数学运算 数据压缩)