数据是怎么被压缩的

标签: 数据 压缩 | 发表时间:2011-06-22 10:13 | 作者:(author unknown) skyan
出处:http://www.guokr.com/

回答问题之前先来看看什么是压缩。当你有天走在路上,碰见熟人对你说:“吃了?”你一定知道他是在打招呼,既不是要请客也不是让你“没吃赶紧回家吃去”。这一句简单的“吃了”是礼貌和问好的体现,也是一种信息的压缩。笼统地说,把一系列已有信息通过一定方法处理,使得其长度缩短,并且信息含量基本或者完全不变,就称之为压缩。


计算机上的压缩过程

我们都知道,计算机采用的是2进制系统。一个连续的n位二进制数集,就可以用来表示 2 n 个字符。目前的国际标准是ASCII码:用一个字节即8位数的2进制码,来表示各种字符和字母。

现在我们只使用2位二进制码,来简单地演示由4个符号组成的字符串的压缩过程。

假设我们有这么一串20个字母的数据:

/gkimage/06/1s/eh/061seh.png

默认情况下,用2位2进制码来表示这四个字母:

A B C D
00 01 10 11
每个字符在字符串种各自出现的次数并不相等:
A:6次           B:10次           C:3次            D:1次

而在计算机中,数据则是以2进制码的形式储存在硬盘上的:
00 00 01 00 00 01 01 10 01 00 01 01 01 10 01 01 00 01 11 10

压缩过程如下:

①注明每个字符的出现次数。把两个出现次数最小的字符圈到一起,看作一个新字符,新字符的次数为两个组成字符的次数之和。

②重复上述操作,直至完成对所有字符的处理。这种操作形成的结构看起来像棵树(下图),被称为——霍夫曼(Huffman)树。

/gkimage/1k/9s/d8/1k9sd8.png

③在每一层的分支线上,按下图所示分别标上0和1。

/gkimage/b5/12/y0/b512y0.png

从最顶端往下读,每个字符都有唯一的分支编号连到它那里,无重复也无遗漏,这样就得到了ABCD这四个字符的新的代码:

A B C D
10 0 110 111
用以上新编码代入原字符串中,得到:
10 10 0 10 10 0 0 110 0 10 0 0 0 110 0 0 10 0 111 110

整理一下得到新编码:
原编码:0000010000010110010001010110010100011110
新编码:1010010100011001000011000100111110

看!数据成功被压缩。这一段40位长度的内容被压缩到了34位,压缩率是85%。

回顾过程容易发现压缩的秘密:出现频率最多的"B"由一位二进制码“0”来表示,而出现频率较低的"C"和"D",则由长度增加了的三位二进制码来表示。通过合理分配不同长度的编码,肯定可以对数据进行一定程度的压缩。

另外可以证明,霍夫曼树就是此类编码替代的最优化的方案之一。因为假如存在一个字符的出现频率高于另一个字符,而它的变长码长度却长于另一个字符,那么必然可以通过交换两者的位置,使得输出结果的总长度变短。有限次操作后可以达到无法再交换的情况,也就是霍夫曼树规则下的情况。

进一步思考几个问题

在压缩文件的时候,人们不禁会产生一些新想法或者遇到一些疑问:是否可以对压缩后的数据再次压缩?当2 n 的n变大后,遇到A:1010,B:10这样的情况,如何解读10101010?

就操作上来说,当然能反复编码,但通过对本文例子中得到的新编码再次操作后会发现,结果是不会有任何变化的。压缩的实质,在于消除特定字符分布上的不均衡,通过将短码分配给高频字符,而长码对应低频字符实现长度上的优化。而数据经过一次压缩后,字符的分布已经几乎平均化了,很难更进一步的压缩了。

而第二个问题描述的情况是不会出现的的。从构造霍夫曼树操作上可以看到,一个字符无法在另一个字符的上层。只要操作正确,就一定可以构造出唯一的代码表,不存在歧义。

还有一个有趣的问题是:虽然把40字节的内容压缩到了34字节,但需要将相应的码表一并发送给接收方(没有对应码表,无法解压)。这不反而使得压缩后的数据比压缩前的还要长?

事实也确实如此。本文例子中,真正的最终结果体积是大于原文的。但这不意味了算法错误。这是因为“n”过小(例子中为2,实际通常为8)导致的。

总长度的不够使得节省出来的那部分容量还不足以弥补码表本身的储存空间。实际应用中,如果你非要去压缩一个只有几个字节的文件,得到的压缩包也经常会大于文件本身。通常,压缩软件会在每压缩4kb到32kb数据后,重新生成并保存一个霍夫曼树。当分块过大时,统计上的整体平均,会掩盖小区域内的极度不平均,损失了压缩的空间。比如存在一个这样的文件:

AAAAA……AAAAA(一万个)BBBBB……BBBBB(一万个)……ZZZZ(一万个)。

如果从整体上进行霍夫曼树操作,将不会产生任何压缩,但是这时候我们把它分成26块,压缩并各自保存相应的重新编码的霍夫曼树,压缩率将非常惊人,约等于12.5%。

/gkimage/ny/e0/j4/nye0j4.png

英语中各字母出现频率示意图

从上面字频图我们知道,在现实的文本中,英语字母使用频率各不相同,而且差别很大。有着很高的不平均度。所以大部分压缩软件对文本文件依然有着很高的压缩率。

相关 [数据 压缩] 推荐:

数据是怎么被压缩的

- skyan - 果壳网 guokr.com - 果壳网
回答问题之前先来看看什么是压缩. 当你有天走在路上,碰见熟人对你说:“吃了. ”你一定知道他是在打招呼,既不是要请客也不是让你“没吃赶紧回家吃去”. 这一句简单的“吃了”是礼貌和问好的体现,也是一种信息的压缩. 笼统地说,把一系列已有信息通过一定方法处理,使得其长度缩短,并且信息含量基本或者完全不变,就称之为压缩.

MongoSpy, MongoWatch及MongoDB数据压缩

- gOODiDEA - NoSQLFan
本文源自openmymind博客的一篇文章,文中作者介绍了两个自己用Node.JS写的MongoDB监控小工具,MongoSpy和MongoWatch,然后提出了在对MongoDB进行文本存储时使用压缩以节约空间的设想. 这两上小工具功能并不怎么强大,实现也简单,如果你会用任何一种语言操作MongoDB的话,相信你都能写一个类似的东西.

Oracle 数据压缩(Compression) 技术 说明

- - CSDN博客推荐文章
Oracle 11g EE版本中只有: Basic Table Compression ,而 AdvanceCompression Feature需要单独购买. 11g Advanced Compression 有如下特性:. --支持了DML 语句的compress,下面会重点关注. --包括RMAN和expdp/impdp.对数据泵,compress 是inline的,在impdp时不需要进行解压缩,直接导入即可.

深入学习《Programing Hive》:数据压缩

- - 互联网 - ITeye博客
Hive使用的是Hadoop的文件系统和文件格式,比如TEXTFILE,SEQUENCEFILE等.          在Hive中对中间数据或最终数据数据做压缩,是提高数据吞吐量和性能的一种手段. 对数据做压缩,可以大量减少磁盘的存储空间,比如基于文本的数据文件, 可以将文件压缩40%或更多,同时压缩后的文件在磁盘间传输和I/O也会大大减少;当然压缩和解压缩也会带来额外的CPU开销,但是却可以节省更多的I /O和使用更少的内存开销.

数据压缩与信息熵

- - 阮一峰的网络日志
1992年,美国佐治亚州的WEB Technology公司,宣布做出了重大的技术突破. 该公司的DataFiles/16软件,号称可以将任意大于64KB的文件,压缩为原始大小的16分之一. 业界议论纷纷,如果消息属实,无异于压缩技术的革命. 许多专家还没有看到软件,就断言这是不可能的. 因为根据压缩原理,你不可能将 任意文件压缩到16分之一.

数据库压缩技术探索

- - 文章 – 伯乐在线
作者:雷鹏,Terark核心技术发明人. 曾就职奇虎360,负责搜索引擎核心研发;曾就职Yahoo. 北研所负责搜索广告、广告交易(AdExchange)等项目. 在数据库、高性能计算、分布式、系统架构上都深有造诣. 作为数据库,在系统资源(CPU、内存、SSD、磁盘等)一定的前提下,我们希望:. 存储的数据更多:采用压缩,这个世界上有各种各样的压缩算法;.

String压缩 解压缩

- - CSDN博客推荐文章
数据传输时,有时需要将数据压缩和解压缩,本例使用GZIPOutputStream/GZIPInputStream实现. 1、使用ISO-8859-1作为中介编码,可以保证准确还原数据. 2、字符编码确定时,可以在decompress方法最后一句中显式指定编码. * @return 压缩后的字符串. GZIPOutputStream os = null; // 使用默认缓冲区大小创建新的输出流.

[来自iPc.me] 电脑上的数据究竟是怎样被压缩和还原的??

- 刘星炜 - iPc.me
你有想过为什么压缩软件能把一组数据的体积缩小,并且还能再完整地展开还原吗. [ 请大家更新订阅地址 http://feed.ipc.me ]. iPc.me 猜你可能还会喜欢:10年软件开发中获得的最宝贵的经验. 传说中Google解谜挑战赛的高智商谜题,看我们怎样推倒她们. 仅需一个浏览器里即可写代码学习编程开发.

Chrome采用新压缩算法 提升网页加载速度降低数据流量消耗

- - cnBeta.COM
谷歌Chrome浏览器很快就会提升网页加载速度并且降低数据流量消耗,这要归功于公司引进的Brotli压缩算法. Brotli压缩算法始于去年九月. 谷歌声称和使用已经达到3年时间的Zopfli算法相比,它可以将数据压缩率继续提升26%,谷歌表示,Brotli还可以帮助降低移动设备的电池使用量,达到省电目的.