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

用数学运算实现数据无损压缩的算法<?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(即压缩后的文件是原文件的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
<?xml:namespace prefix = v ns = "urn:schemas-microsoft-com:vml" />

对于这种数据文件,基于简单的数学知识,我们有以下事实:

组成这些文件的数据均可视为一个有限位的整数序列,这是显然的,因为任意一个文件无论多长,总是有限的,于是其对应的数据文件也是有限的;

每个整数序列均可视为某个无理序列的一个片断,这也是显然的,做如此分析,意义主要在于随后的数据处理更易于实现;

每个无理序列均可由某个函数在某点的函数值取得,这在理论上是行的通的,如10进位制数据141421356…可认为是由无理数 =1.41421356…的若干位片段获得。

由此提出数学运算压缩算法的具体思想:

构造具备理想长度的无理数片段数据库,被压缩文件与之对应,;

构造函数库,这个数据库由足够简单的、易于实现高精度数值计算的函数构成,并使无理数片段数据库中的每一数据均可由函数库中的某一函数的某一相对简单的数值的函数值取得,或若干函数值的代数和;

任何一个文件在计算机上记录为一个数字序列,例如,一张刻滿的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)是一个有限位的数学表达式,如e31og3等。在生成数据库时,采用某个数学表达式,取其运算结果到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,n13f(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年发表于于河北经贸大学学报上

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/466939.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

dubbo的监控中心

监控中心实际上就是一个web工程。 是dubbo官方给我们提供的一个war包。 只需要部署在Tomcat中就可以了。 推荐把监控中心与注册中心部署在一台服务器上&#xff0c;这样可以不需要任何配置。 部署完成后直接启动Tomcat就可以使用。 注&#xff1a;tail -f logs/catalina.out即可…

​我敢说,这是最全的常用设计模式汇总

今天&#xff0c;想跟大家聊聊代码能力的提升。想起我刚入行那会&#xff0c;怀抱满腔激情&#xff0c;到处学热门框架&#xff0c;但实际上受限于公司体量和业务逻辑&#xff0c;其实往往用不上&#xff0c;时间久了&#xff0c;不用就忘记了&#xff0c;于是在日复一日的工作…

嵌入式高手之路

嵌入式高手之路 宗旨&#xff1a;技术的学习是有限的&#xff0c;分享的精神是无限的。 第一部分&#xff1a;LINUX平台搭建与环境熟悉 了解Linux系统&#xff1b;区分各种版本的Linux系统&#xff0c;以便于拓展 Linux视野。 1、Linux 简介&#xff1b; 2、Linux 系统的主要…

Meterpreter Guide

转载&#xff1a;http://wooyun.jozxing.cc/static/drops/tips-10146.html 0x01 入门篇(生成与接收) 功能介绍 msfpayload和msfencode已经被时代淘汰了现在都转为msfvenom了 msfvenom命令行选项如下&#xff1a;Options:-p, --payload payload> 指定需要使用的…

跟老肖聊天

今天跟一个创业的朋友老肖聊天&#xff0c;聊完之后有点沉重老肖是我的朋友&#xff0c;我讲的都是基于真实的内容&#xff0c;如果觉得我是吹牛或者过分如何&#xff0c;可以绕道&#xff0c;也请嘴下留情。老肖因为公司不景气&#xff0c;这两天出去面试&#xff0c;面试了三…

SSM中(Spring-SpringMVC-Mybatis)(一:概念)

一&#xff1a;Spring&#xff1a; 参照我的另一篇博客&#xff1a; http://www.cnblogs.com/GH0522/p/8127530.html 二:SpringMVC: 流程图&#xff1a; SpringMVC接口解释 DispatcherServlet&#xff1a; Spring提供的前端控制器&#xff0c;所有的请求都有经过它来统一分…

关于VISIO工具栏、菜单栏消失的解决办法

关于VISIO工具栏、菜单栏消失的解决办法1、打开注册表编辑器。2、VISIO 2000HKEY_CURRENT_USER\Software\Visio\Visio2000\Toolbars删除上述键值&#xff0c;再启动VISIO 2000就可以看到工具栏和菜单栏了。3、VISIO 2002HKEY_CURRENT_USER\Software\Microsoft\Visio\Toolbars删…

嵌入式软件书籍

嵌入式书籍推荐 宗旨&#xff1a;技术的学习是有限的&#xff0c;分享的精神是无限的。 Linux基础 1、《Linux与Unix Shell 编程指南》 C语言基础    1、《C Primer Plus&#xff0c;5th Edition》【美】Stephen Prata着    2、《The C Programming Language, 2nd Ed…

C语言函数库

sqrt() - C函数 C库函数 double sqrt(double x) 返回x的平方根。 声明 下面是函数sqrt()声明。 double sqrt(double x) 参数 x -- 这是浮点值。 返回值 这个函数返回x的平方根。 例子 下面的例子演示了如何使用sqrt()函数。 #include <stdio.h> #include <math.h>…

C++实现一个栈

我们先说下栈的知识&#xff0c;先看下我们之前写的文章栈&#xff0c;C语言实现如何自己实现一个栈堆和栈的区别&#xff08;转过无数次的文章&#xff09;这是一个栈这是我们把数据入栈的操作这是数据出栈的操作之前僚机号里面发了一个用C实现的栈文章&#xff0c;比较简单&a…

ApiController得到服务器端绝对路径

System.Web.Hosting.HostingEnvironment.MapPath("路径"); MSDN资料 将虚拟路径映射到服务器上的物理路径。 命名空间&#xff1a; System.Web.Hosting程序集&#xff1a; System.Web&#xff08;在 System.Web.dll 中&#xff09; 语法 public static string Map…

SVN的恢复历险记

今天&#xff0c;同事的机器可能出问题了。自动将Subversion服务器上的Source目录删除并且还Commit了。这可是框架部分的全部代码啊。不过没关系&#xff0c;好在Subversion的功能很强大。 方法很多&#xff1a; 1、选择Subversion --> Show Log&#xff0c;打开Log对话框&a…

JavaScript——文档对象模型

一、基本概念 文档对象模型&#xff08;DOM&#xff09;是表示文档和访问、操作构成文档的各种元素的应用程序接口&#xff08;API&#xff09;。它解决了NetScape的JavaScript和Microsoft的JavaScript之间的冲突&#xff0c;给web设计师和开发者一个标准的方法&#xff0c;可让…

colinux的安装

colinux安装 宗旨&#xff1a;技术的学习是有限的&#xff0c;分享的精神是无限的。 一、在windows上模拟linux环境&#xff0c;主要有三种方法&#xff1a; 1.VMware等虚拟机&#xff0c;缺点&#xff1a;占用系统资源多&#xff0c;运行速度慢。 2.Cygwin等模拟环境&#…

你搞清楚「NULL」、「0」、「'0'」、「0」「\0」了吗?

我们先讨论NULL&#xff0c;平时使用指针的时候&#xff0c;会经常遇见这个家伙&#xff0c;这个家伙的值是是这样定义的#define NULL 0 或者 #define NULL (void *)0我们看一下下面这段代码#include <stdio.h>int main () {size_t ii;int *ptr NULL;unsigned long *nul…

【uoj#207】共价大爷游长沙 随机化+LCT维护子树信息

题目描述 给出一棵树和一个点对集合S&#xff0c;多次改变这棵树的形态、在集合中加入或删除点对&#xff0c;或询问集合内的每组点对之间的路径是否都经过某条给定边。 输入 输入的第一行包含一个整数 id&#xff0c;表示测试数据编号&#xff0c;如第一组数据的id1&#xff0…

ping 命令的几种使用方法?

ping命令的几种使用方法&#xff1f;它是最基本&#xff0c;最常用的&#xff0c;测试物理网络的命令&#xff0c;它的使用频率很高&#xff0c;主要用于确定本地主机和另一台主机能否成功进行发送或接收数据包&#xff0c;根据返回的信息&#xff0c;我们就可以判断TCP/IP参数…

MongoDB基本应用操作整理

启动服务&#xff1a;mongod --dbpathg:/mongo/data 访问服务器&#xff0c;如下&#xff1a; mongodb这个软件的端口是27017 可以把mongo服务配置成系统服务。 使用命令如下&#xff1a; mongod --dbpathg:/mongo/data --logpathg:/mongo/mongo.log --install 在Mongo中就三…

周五跟大佬喝酒,顺便打了个球

这是前天发生的事情&#xff0c;昨天写好了文章&#xff0c;今天才发出来&#xff0c;但是名字还是想写成昨晚小聚。昨晚逍遥和啊尚过来找我打球&#xff0c;很开心&#xff0c;虽然酝酿了好久关于这次的活动&#xff0c;但是它真的发生时&#xff0c;我还是显得有些突兀和紧张…

安装Cygwin

Cygwin安装 宗旨&#xff1a;技术的学习是有限的&#xff0c;分享的精神是无限的。 下载cygwin&#xff1a;https://www.cygwin.com/ 箭头指的地方点一下就是安装该软件&#xff0c;开始要安装的一些软件&#xff0c;gcc&#xff0c;gdb&#xff0c;make&#xff0c;ssh等等。…