用数学运算实现数据无损压缩的算法<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" />
(An arithmetic On Lossless Data-Compress By Mathematical Operation)
王春海1 魏玉冬2
([1]河北经贸大学信息技术学院 2河北经贸大学数统学院)
摘 要通常的无损压缩算法,大多最多只能达到30%左右的压缩率。本文提出的压缩算法思想,可以使数据的无损压缩率达到千万分之几,甚至更高。
关键词:数学运算 数据压缩 无损压缩 海量数据 压缩率 数学函数 数学表达式
1 数据的保存对数据压缩有迫切的需求
现在社会是信息社会,各类信息充斥于生活工作的各个方面,人们离不开信息的搜集、处理、保存与交流。历史遗留下来的信息数据,现时的信息数据,将来的信息数据,其数量之庞大令人难以想象。这些海量的数据,没有任何一个单位或一个实体可以全部保留,只能是保存相应方面的部分数据,在需要时通过网络进行查找和传输,以期达到数据的的共享与使用。但随着数据量的日益累积,网络访问量的激增,将会占用很多时间和网络带宽。为增加网络传输速度,减少访问时间,最直接的方法是增加网络带宽(从最早使用的拨号到DDN专线,带宽已达十兆、百兆、千兆…)。但是,网络带宽终有极限,数据也越积越多,如此下去终有一天,众多的数据将无法保存。怎么解决这一问题呢?采用高效的数据压缩是一种较好的选择。
2 现有的压缩算法效率低下
目前,数据压缩主要分为两种,一种是有损压缩,主要用于音频、视频、图形、图像的压缩,其主要特征是,数据经压缩后,人们可以接受;另一种是无损压缩,适用于文本文件、数据库、程序等数据的压缩,其特点是,数据经压缩→解压缩后,可以完全与压缩前的数据一样。一般情况下,采用无损压缩,最大的压缩率只能达到70%左右(即压缩后的文件是原文件的30%)。通常情况下是50%-60%(即压缩后的文件是原文件的40-50%)。压缩率如此低的原因主要在于,目前的无损压缩算法,都是基于在文件中找相同的、重复的序列进行压缩。即使对文本文件、数据库文件等重复性比较高的数据进行压缩,其压缩率最大也只有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
<?xml:namespace prefix = v ns = "urn:schemas-microsoft-com:vml" />
对于这种数据文件,基于简单的数学知识,我们有以下事实:
①组成这些文件的数据均可视为一个有限位的整数序列,这是显然的,因为任意一个文件无论多长,总是有限的,于是其对应的数据文件也是有限的;
②每个整数序列均可视为某个无理序列的一个片断,这也是显然的,做如此分析,意义主要在于随后的数据处理更易于实现;
③每个无理序列均可由某个函数在某点的函数值取得,这在理论上是行的通的,如10进位制数据141421356…可认为是由无理数 =1.41421356…的若干位片段获得。
由此提出数学运算压缩算法的具体思想:
①构造具备理想长度的无理数片段数据库,被压缩文件与之对应,;
②构造函数库,这个数据库由足够简单的、易于实现高精度数值计算的函数构成,并使无理数片段数据库中的每一数据均可由函数库中的某一函数的某一相对简单的数值的函数值取得,或若干函数值的代数和;
③任何一个文件在计算机上记录为一个数字序列,例如,一张刻滿的CD或DVD光盘,如果将其做成一个光盘映射文件,这个文件用数字的方式保存在计算机的硬盘上,将会是一个数字的序列(因为计算机中最终保存的都是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……(991个0)……0000
f(x2)
0000……(991个0)……0001
……
……
f(xn)
ffff……(991个f)……ffff
其中f(xn)是一个有限位的数学表达式,如e3、、1og3等。在生成数据库时,采用某个数学表达式,取其运算结果到1000位,并且此结果序列与上表中的数字序列进行查找,与某一行相对应,就用此数学表达式代替这一行。
这样,一个任意长度的数据序列,将按照每1000位进行分段,并查找上表1,每1000位用一个数学表达式相对应。在分段后,如果最后一个分段不足1000位,记下此段的长度,然后不足部分补0,然后再查找表1。此时形成的压缩文件内容如下:
文件长度,压缩率,数学表达式1,数学表达式2,……,数学表达式n-1,最后一个数学表达式n
n         文件长度:压缩前文件的总长度
n         压缩率:分段方法,如按照1000位进行分段
n         数学表达式1:第1个1000位序列对应的数学表达式
n         数学表达式n:第n个1000位序列对应的数学表达式
在解压缩时,每一个数学表达式运算到“压缩率”对应的位数。
为了减少数据库中函数的数量,我们可以采用如下的方法来解决:
假设函数f(x1)的运算结果,前100位与某一个序列相对应,如果把f(x1)运算到101位,将运算结果的第1位去掉,剩下的100位也将与这个数据库中的某一个序列相对应。如果把f(x1)运算到100+n位,将运算结果的前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()可以是一个数学公式、数学函数或一个简单的算术表达式,x、y、z代表数学表达式的参数,n1,表示这个数学表达式运算结果的第某一位,n2指从n1位开始后的长度,代表数据的大小。如果n2过于大,n2也可以用一个数学表达式代替,此时数学表达式变为:
f(x,y,z),n1,(f2(x,y,z)),n3
在解压缩时,可以用多线程的方法,同时运行许多数学表达式,然后运算到指定位数进行“组合”。在运算到最后一个数学表达式时,运行到“文件长度”与“压缩率”的余数即可。

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

用数学运算实现数据无损压缩的算法相关推荐

  1. 谷歌AutoML新进展,进化算法加持,仅用数学运算自动找出ML算法

    机器之心报道 参与:魔王.杜伟.小舟 授权转载自公众号机器之心 仅使用基础数学运算就能自动搜索机器学习算法?谷歌 Quoc V. Le 等人提出了 AutoML-Zero 方法. AutoML-Zer ...

  2. shell脚本实战-使用shell进行数学运算

    前言 上篇文章我们探讨了shell脚本的基础和变量, 在学习变量的时候我们探讨了环境变量和用户自定义变量,以及一些特殊的用法.无论使用哪种语言都少不了进行算术操作,今天我们来看看如何使用shell脚本 ...

  3. 只会高中数学运算就能发现算法?Google开源的AutoML-Zero有多厉害

    译者 | 刘畅 出品 | AI科技大本营(ID:rgznai100) 机器学习研究,已经在多个方面都取得了进步,包括模型结构和优化方法等.而使此类研究自动化的工作(称为AutoML)也有重大进展.这一 ...

  4. 只会高中数学运算就能发现算法?Google 开源的 AutoML-Zero 有多厉害

    译者 | 刘畅 来源 | AI科技大本营(ID:rgznai100) 机器学习研究,已经在多个方面都取得了进步,包括模型结构和优化方法等.而使此类研究自动化的工作(称为AutoML)也有重大进展.这一 ...

  5. GEE:使用Sentinel-2数据做基于NDVI的长势监测(求5年影像集的NDVI均值,和当前年份的NDVI,两个影像做数学运算)

    本文记录了农作物长势监测的原理和在GEE上实现的代码,记录了最简单的长势监测算法(更复杂的算法可以根据例子中的方法灵活转换) 详细代码:完整代码 https://code.earthengine.go ...

  6. python解一元二次方程虚根_Python编程实现数学运算求一元二次方程的实根算法示例...

    本文实例讲述了Python编程实现数学运算求一元二次方程的实根算法.分享给大家供大家参考,具体如下: 问题: 请定义一个函数quadratic(a, b, c),接收3个参数,返回一元二次方程:ax² ...

  7. python数据可视化开发(2):pandas读取Excel的数据格式处理(数据读取、指定列数据、DataFrame转json、数学运算、透视表运算输出)

    系列文章目录 python开发低代码数据可视化大屏:pandas.read_excel读取表格 python实现直接读取excle数据实现的百度地图标注 python数据可视化开发(1):Matplo ...

  8. python求一元二次方程实根_Python编程实现数学运算求一元二次方程的实根算法示例...

    本文实例讲述了Python编程实现数学运算求一元二次方程的实根算法.分享给大家供大家参考,具体如下: 问题: 请定义一个函数quadratic(a,b,c),接收3个参数,返回一元二次方程:ax² + ...

  9. Pytorch和Tensorflow在10000*1000数据规模线性回归算法中的运算速度对比

    Pytorch和Tensorflow在10000*1000数据规模线性回归算法中的运算速度对比 因为在学习人工智能相关知识,于是将学习过程与程序放在这里,希望对大家有帮助,共同学习,共同进步(不喜勿喷 ...

最新文章

  1. 网站优化中应该注意的细节有哪些?
  2. STM32F1笔记(十二)DAC
  3. supervisor安装和配置
  4. 2018年4月工业用微型计算机,2018年自考工业用微型计算机押密试题及答案(六)...
  5. i css svg,如何设置 CSS 背景图中的 SVG 的颜色
  6. 用集合return多个值_十五个常用的 Laravel 集合(Collection)
  7. Hibernate学习(二)持久化类,主键生成策略、一级缓存、事务
  8. 深度解读CSS3 position的属性
  9. Atitit img hot click link 图像背景拉伸100%Map area trouble..So body backgrd img mode...is easy...No
  10. 07-figma-钢笔工具
  11. A problem occurred configuring root project ‘xxx‘.
  12. 公务员考试计算机专业类别,专业!公务员专业类别划分
  13. 制造业的业务流程管理BPM
  14. nagios配置示例
  15. C语言图书馆如何添加图书,如何使用C语言编写图书馆管理系统?
  16. C++枚举enum类型-典型性质
  17. JS实现漂亮的窗口拖拽效果(可改变大小、最大化、最小化、关闭)
  18. 2022-2028全球与中国紫外线发生器市场现状及未来发展趋势
  19. 天拓分享 | 西门子伺服电机的使用过程中这些事项要注意
  20. Pandas技巧大全:含具体代码实现

热门文章

  1. 《Python Cookbook 3rd》笔记(3.2):执行精确的浮点数运算
  2. 写出表格的结构html,一个面试题,根据json结构生成html表格
  3. 公用计算机管理,如何管理公用计算机和私人计算机的文件访问
  4. 怎么改电脑网络ip地址_抛弃重启路由器获取ip地址方式,巧妙运用ip代理改IP工具...
  5. 针对C++异常的学习
  6. C++primer第二章2.4节对于const限定符相关内容进行详解
  7. Android Gradle 批量修改生成的apk文件名
  8. 亚特兰大峰会精彩看点:软件吞噬世界,OpenStack是变革核心
  9. Map 集合循环、遍历的 四 种方式
  10. 图解 Linux 安装 JDK1.8 、配置环境变量