简介
压缩(compression)是为了减少资料大小以节省储存空间和传输的时间。为了资料的传输,压缩能够作用于单独的资料内容或者所有的传输单元(包括资料头),这取决于一些特定的因素。
内容压缩很简单,它就是移除多余的空白字元,插入单个的重复字元指出一个字元串中重复的字元,以及将小型的位串用频繁使用的字元替代。这种类型的压缩能够将文本档案的大小减少50%。压缩由使用特定公式和演算法的程式来执行,它确定如何压缩和解压资料。
压缩原理
利用演算法将档案有损或无损地处理,以达到保留最多档案信息,而令档案体积变小。压缩档案的基本原理是查找档案内的重复位元组,并建立一个相同位元组的"词典"档案,并用一个代码表示,比如在档案裏有几处有一个相同的词"中华人民共和国"用一个代码表示并写入"词典"档案,这样就可以达到缩小档案的目的软体。由于电脑处理的信息是以二进位数的形式表示的,因此压缩软体就是把二进位信息中相同的字元串以特殊字元标记来达到压缩的目的。为了有助于理解档案压缩,请您在脑海裏想象一幅蓝天白云的图片。对于成千上万单调重复的蓝色像点而言,与其一个一个定义"蓝、蓝、蓝……"长长的一串颜色,还不如告诉电脑:"从这个位置开始存储1117个蓝色像点"来得简洁,而且还能大大节约存储空间。这是一个非常简单的图像压缩的例子。其实,所有的电脑档案归根结底都是以"1"和"0"的形式存储的,和蓝色像点一样,只要通过合理的数学计算公式,档案的体积都能够被大大压缩以达到"资料无损稠密"的效果。总的来说,压缩可以分为有损和无损压缩两种。如果丢失个别的资料不会造成太大的影响,这时忽略它们是个好主意,这就是有损压缩。有损压缩广泛套用于动画、声音和图像档案中,典型的代表就是影碟档案格式mpeg、音乐档案格式mp3和图像档案格式jpg。但是更多情况下压缩资料必须準确无误,人们便设计出了无损压缩格式,比如常见的zip、rar等。压缩软体(compression software)自然就是利用压缩原理压缩资料的工具,压缩后所生成的档案称为压缩档(archive),体积只有原来的几分之一甚至更小。当然,压缩档已经是另一种档案格式了,如果你想使用其中的资料,首先得用压缩软体把资料还原,这个过程称作解压缩。常见的压缩软体有winzip、winrar等。
重复压缩
有两种形式的重复存在于电脑资料中,zip就是对这两种重复进行了压缩。
第一种
一种是短语形式的重复,即三个位元组以上的重复,对于这种重复,zip用两个数位:1.重复位置距当前压缩位置的距离;2.重复的长度,来表示这个重复,假设这两个数位各佔一个位元组,于是资料便得到了压缩,这很容易理解。
一个位元组有 0 - 255 共 256 种可能的取值,三个位元组有 256 * 256 * 256 共一千六百多万种可能的情况,更长的短语取值的可能情况以指数方式成长,出现重复的概率似乎极低,实则不然,各种类型的资料都有出现重复的倾向,一篇论文中,为数不多的术语倾向于重复出现;一篇小说,人名和地名会重复出现;一张上下渐变的背景图片,水準方向上的像素会重复出现;程式的源档案中,文法关键字会重复出现(我们写程式时,多少次前后copy、paste?),以几十 K 为单位的非压缩格式的资料中,倾向于大量出现短语式的重复。经过上面提到的方式进行压缩后,短语式重复的倾向被完全破坏,所以在压缩的结果上进行第二次短语式压缩一般是没有效果的。
第二种
第二种重复为单位元组的重复,一个位元组只有256种可能的取值,所以这种重复是必然的。其中,某些位元组出现次数可能较多,另一些则较少,在统计上有分布不均匀的倾向,这是容易理解的,比如一个 ASCII 文本档案中,某些符号可能很少用到,而字母和数位则使用较多,各字母的使用频率也是不一样的,据说字母 e 的使用概率最高;许多图片呈现深色调或浅色调,深色(或浅色)的像素使用较多(这裏顺便提一下:png图片格式是一种无损压缩,其核心演算法就是 zip 演算法,它和 zip 格式的档案的主要区别在于:作为一种图片格式,它在档案头处存放了图片的大小、使用的颜色数等信息);上面提到的短语式压缩的结果也有这种倾向:重复倾向于出现在离当前压缩位置较近的地方,重复长度倾向于比较短(20位元组以内)。这样,就有了压缩的可能:给 256 种位元组取值重新编码,使出现较多的位元组使用较短的编码,出现较少的位元组使用较长的编码,这样一来,变短的位元组相对于变长的位元组更多,档案的总长度就会减少,并且,位元组使用比例越不均匀,压缩比例就越大。
压缩软体
常用压缩软体
WinMount、WinRAR、WinZip、7-Zip 、coolrar
压缩格式
常见压缩档案格式
主要有:rar,zip,tar,cab,uue,jar,iso,z,7-zip,ace,lzh,arj,gzip,bz2等压缩档案。
经过压缩软体压缩的档案叫压缩档案,压缩的原理是把档案的二进位代码压缩,把相邻的0,1代码减少,比如有000000,可以把它变成6个0 的写法60,来减少该档案的空间。
JAR
JAR 档案就是 Java Archive File,顾名思意,它的套用是与 Java 息息相关的,是 Java 的一种文档格式。JAR 档案非常类似 ZIP 档案--準确的说,它就是 ZIP 档案,所以叫它档案包。JAR 档案与 ZIP 档案唯一的区别就是在 JAR 档案的内容中,包含了一个 META-INF/MANIFEST.MF 档案,这个档案是在生成 JAR 档案的时候自动建立的。
ZIP
ZIP应该算是最常见的压缩档案格式了,你甚至不需要单独为它安装一个压缩或者解压缩软体,因为我们使用的Windows系统以及集成了对ZIP压缩格式的支持。
RAR
虽然ZIP在压缩档案格式中地位很高,但相当多的下载网站都选择了用RAR格式来压缩他们的档案,最根本的原因就在于RAR格式的档案压缩率比ZIP更高。
7Z作为压缩格式的后起新秀,7Z有着比RAR更高的压缩率,能够将档案压缩的更加小巧。不过因为RAR格式已经高度普及,又没有网路普及的"天时"相助,7Z想要取代RAR的地位还是相当不容易的。
CAB
CAB是微软的一种安装档案压缩格式,主要套用于软体的安装程式中。因为涉及到安装程式,所以cab档案中包含的档案通常都不是简单的直接压缩,而是对档案名称等都进行了处理,所以虽然可以对其直接解压缩,但解压后得到的档案通常都无法直接使用。
ISO
很多朋友都认为ISO是一种压缩格式,这源于WinRAR增加了对ISO格式"解压"的支持。而实际上,ISO并不是压缩格式,它之中所包含的档案也并没有经过压缩。ISO只是一种光碟的镜像格式,完全复製并储存了光碟上的内容而已。所谓的对ISO"解压"的过程,不过就是对ISO内档案的提取过程。
TAR
tar为后辍的档案能用WinZip或WinRar开启,是因为WinZip或WinRar对.tar档案进行了关联,也就是指可以用相应的解压软体将其解压。
.tar是linux下较为常用的压缩档案的格式,并不是什麽资料库档案。
UUE
uue是一种在遇到邮件编码混合引起乱码的情况下比较有用的压缩格式,可以用winzip或者winrar开启。
上面我们主要只介绍了常用的压缩档案。
压缩基本原理
概述
如果您从网际网路上下载了许多程式和档案,可能会遇到很多ZIP档案。这种压缩机製是一种很方便的发明,尤其是对网路使用者,因为它可以减小档案中的比特和位元组总数,使档案能够通过较慢的网际网路连线实现更快传输,此外还可以减少档案的磁碟佔用空间。在下载了档案后,电脑可使用WinZip或Stuffit这样的程式来展开档案,将其复原到原始大小。如果一切正常,展开的档案与压缩前的原始档案将完全相同。 乍一听好像很神秘:您是怎样减少比特和位元组的数量并将它们原封不动地还原回去的呢?等一切水落石出之后,您会发现这个过程背后的基本理念其实非常简单明了。在本文中,我们将讨论这种通过简单压缩来明显减小档案的方法。
大多数电脑档案类型都包含相当多的冗余内容--它们会反复列出一些相同的信息。档案压缩程式就是要消除这种冗余现象。与反复列出某一块信息不同,档案压缩程式只列出该信息一次,然后当它在原始程式中出现时再重新引用它。
举例
以我们熟悉的信息类型--单词--为例子。
肯尼迪(John F. Kennedy)在1961年的就职演说中曾说过下面这段着名的话:
Ask not what your country can do for you--ask what you can do for your country.(不要问国家能为你做些什麽,而应该问自己能为国家做些什麽。)
这段话有17个单词,包含61个字母、16个空格、1个破折号和1个句点。如果每个字母、空格或标点都佔用1个记忆体单元,那麽档案的总大小为79个单元。为了减小档案的大小,我们需要找出冗余的部分。
我们立刻发现:
如果忽略大小写字母间的区别,这个句子几乎有一半是冗余的。九个单词(ask、not、what、your、country、can、do、for、you)几乎提供了组成整句话所需的所有东西。为了构造出另一半句子,我们只需要拿出前半段句子中的单词,然后加上空格和标点就行了。
大多数压缩程式使用基于自适应字典的LZ演算法来缩小档案。"LZ"指的是此演算法的发明者Lempel和Ziv,"字典"指的是对资料块进行归类的方法。
排列字典的机製有很多种,它也可以像编号列表那样简单。在我们检查肯尼迪这句着名讲话时,可以挑出重复的单词,并将它们放到编号索引中。然后,我们直接写入编号而不是写入整个单词。
结论
因此,如果我们的字典是:
ask
what
your
country
can
do
for
you
我们的句子就应该是这样的:
1 not 2 3 4 5 6 7 8-- 1 2 8 5 6 7 3 4
如果您了解这种机製,那麽只需使用该字典和编号模式即可轻松重新构造出原始句子。这就是在展开某个下载档案时,电脑中的解压缩程式所做的工作。你可能还遇到过能够自行解压缩的压缩档案。若要建立这种档案,编程人员需要在被压缩的档案中设定一个简单的解压缩程式。在下载完毕后,它可以自动重新构造出原始档案。
但是使用这种机製究竟能够节省多少空间呢?"1 not 2 3 4 5 6 7 8--1 2 8 5 6 7 3 4"当然短于"Ask not what your country can do for you-- ask what you can do for your country.",但应注意的是,我们需要随档案一起储存这个字典。
在实际压缩方案中,计算出各种档案需求是一个相当复杂的过程。让我们回过头考虑一下上面的例子。每个字元和空格都佔用1个记忆体单元,整个原句要佔用79个单元。压缩后的句子(包括空格)佔用了37个单元,而字典(单词和编号)也佔用了37个单元。也就是说,档案的大小为74个单元,因此我们并没有把档案大小减少很多。
但这只是一个句子的情况!可以想象的是,如果用该压缩程式处理完肯尼迪讲话的其余部分,我们会发现这些单词以及其他单词重复了更多次。而且,正如下一节所言,为了得到尽可能高的组织效率,可以对字典进行重写。
在上一个的例子中,我们挑出了所有重复的单词并将它们放在一个字典中。对于我们来说,这是最显而易见的字典编写方法。但是压缩程式却不这样认为:它对单词没有概念--它只会寻找各个模式。为了尽可能减小档案的大小,它会仔细挑选出最优模式。
如果从这个角度处理该句子,我们最终会得到一个完全不同的字典。
如果压缩程式扫描肯尼迪的这句话,它遇到的第一个冗余部分只有几个字母长。在ask not what your中,出现了一个重复的模式,即字母t后面跟一个空格--在not和what中。如果压缩程式将此模式写入字典,则每次出现"t"后面跟一个空格的情况时,它会写入一个"1"。但是在这个短句中,此模式的出现次数不够多,不足以将其保留为字典中的一个条目,因此程式最终会覆盖它。
程式接下来注意到的内容是ou,在your和country中都出现了它。如果这是一篇较长的文档,将此模式写入字典会节省大量空间--在英语中ou是一个十分常见的字母组合。但是在压缩程式看完整个句子后,它立即发现了一个更好的字典条目选择:不仅ou发生了重复,而且your和country整个单词都发生了重复,并且它们实际上是作为一个短语your country一起发生重复的。在本例中,程式会用your country条目覆盖掉字典中的ou条目。
短语can do for也发生了重复,一次后面跟着your,另一次跟着you,因此我们又发现can do for you也是一种重复模式。这样,我们可以用一个数位来代替15个字元(包含空格),而your country只允许我们用一个数位代替13个字元(包含空格),所以程式会用r country条目覆盖your country条目,然后再写入一个单独的can do for you条目。程式通过这种方式继续工作,挑出所有重复的信息,然后计算应该将哪一种模式写入字典。基于自适应字典的LZ演算法中的"自适应"部分指的就是这种重写字典的能力。程式执行此工作的过程实际上非常复杂。
无论使用什麽方法,这种深入搜寻机製都能比仅仅挑出单词这种方法更有效率地对档案进行压缩。如果使用我们上面提取出的模式,然后用"__"代替空格,最终将得到下面这个更大的字典:
ask__
what__
you
r__country
__can__do__for__you
而句子则较短:
"1not__2345__--__12354"
句子佔用18个记忆体单元,字典佔用41个单元。所以,我们将档案总大小从79个单元压缩到了59个单元!这仅仅是压缩句子的一种方法,而且不一定是最高效的方法。(看看您能找到更好的方法吗!)
优势
那麽这种机製到底有多好呢?档案压缩率取决于多种因素,包括档案类型、档案大小和压缩方案。
在世界上的大多数语言中,某些字母和单词经常以相同的模式一起出现。正是由于这种高冗余性,而导致文本档案的压缩率会很高。通常大小合适的文本档案的压缩率可以达到50%或更高。大多数程式语言的冗余度也很高,因为它们的命令相对较少,并且命令经常採用一种设定的模式。对于包含大量不重复信息的档案(例如图像或MP3档案),则不能使用这种机製来获得很高的压缩率,因为它们不包含重复多次的模式。
如果档案有大量重复模式,那麽压缩率通常会随着档案大小的增加而增加。从我们的例子中就可以看出这一点--如果我们摘录的肯尼迪讲话再长一些,您会发现又多次出现了我们字典中的模式,因此能够通过每个字典条目节省更多的档案空间。此外,对于更大的档案,还可能出现具有更大普遍性的模式,从而能够建立出效率更高的字典。
此外,档案压缩效率还取决于压缩程式使用的具体演算法。有些程式能够在某些类型的档案中更好地寻找到模式,因此能更有效地压缩这些类型的档案。其他一些压缩程式在字典中又使用了字典,这使它们在压缩大档案时表现很好,但是在压缩较小的档案时效率不高。尽管这一类的所有压缩程式都基于同一个基本理念,但是它们的执行方式却各不相同。程式开发人员始终在尝试建立更好的压缩机製。
有损压缩
我们在上文中讨论的压缩类型称为无损压缩,因为您重新建立的档案与原始档案完全相同。所有无损压缩都基于这样一种理念:将档案变为"较小"的形式以利于传输或存储,并在另一方收到它后复原以便重新使用它。
有损压缩则与此大不相同。这些程式直接去除"不必要"的信息,对档案进行剪裁以使它变得更小。这种类型的压缩大量套用于减小点阵图图像的档案大小,因为点阵图图像的体积通常非常庞大。为了了解有损压缩的工作原理,让我们看看你的电脑如何对一张扫描的照片进行压缩。
对于此类档案,无损压缩程式的压缩率通常不高。尽管图片的大部分看起来都是相同的--例如,整个天空都是蓝色的--但是大部分像素之间都存在微小的差异。为了使图片变得更小同时不降低其解析度,您必须变更某些像素的颜色值。如果图片中包含大量的蓝色天空,程式会挑选一种能够用于所有像素的蓝色。然后,程式重写该档案,所有天空像素的值都使用此信息。如果压缩方案选择得当,您不会注意到任何变化,但是档案大小会显着减小。
当然,对于有损压缩,在档案压缩后您无法将其复原成原始档案的样子。您必须接受压缩程式对原始档案的重新解释。因此,如果需要完全重现原来的内容(例如软体应用程式、资料库和总统就职演说),则不应该使用这种压缩形式。


















