有两种基本的压缩算法: 有损和无损。有损压缩算法经过移除在保真情形下需要大量的数据去存储的小细节,从而使文件变小。在有损压缩里,因某些必要数据的移除。恢复原文件是不可能的。有损压缩主要用来存储图像和音频文件。同一时候经过移除数据可以达到一个比較高的压缩率,只是本文不讨论有损压缩。无损压缩,也使文件变小,但相应的解压缩功能可以精确的恢复原文件,不丢失不论什么数据。无损数据压缩被普遍的应用于计算机领域,从节省你我的电脑的空间。到经过web发送数据。php
使用Secure Shell交流,查看PNG或GIF图片。web
无损压缩算法可行的基本原理是,随意一个非随机文件都含有反复数据。这些反复数据可以经过用来肯定字符或短语出现几率的统计建模技术来压缩。统计模型可以用来为特定的字符或者短语生成代码,基于它们出现的频率,配置最短的代码给最常用的数据。这些技术包含熵编码(entropy encoding),游程编码(run-length encoding),以及字典压缩。算法
运用这些技术以及其余技术,一个8-bit长度的字符或者字符串可以用很是少的bit来表示,从而大量的反复数据被移除。数组
直到20世纪70年代,数据压缩才在计算机领域開始扮演重要角色。那时互联网变得更加流行,Lempel-Ziv算法被发明出来,但压缩算法在计算机领域以外有着更悠久的历史。网络
发明于1838年的Morse code。是最先的数据压缩实例,为英语中最常用的字母比方"e"和"t"分配更短的Morse code。以后。随着大型机的兴起,Claude Shannon和Robert Fano发明了Shannon-Fano编码算法。他们的算法基于符号(symbol)出现的几率来给符号分配编码(code)。数据结构
一个符号出现的几率大小与相应的编码成反比,从而用更短的方式来表示符号。多线程
两年后,David Huffman在MIT学习信息理论并上了一门Robert Fano老师的课,Fano给班级的同窗两个选项,写一篇学期论文或者參加期末考试。less
Huffman选择的是写学期论文,题目是寻找二叉编码的最优算法。模块化
通过几个月的努力后依旧没有不论什么成果。Huffman决定放弃所有论文相关的工做,開始学习为參加期末考试作准备。正在那时。灵感爆发,Huffman找到一个与Shannon-Fano编码相相似但是更有效的编码算法。Shannon-Fano编码和Huffman编码的主要差异是构建几率树的过程不一样,前者是自下而上,获得一个次优结果,然后者是自上而下。工具
早期的Shannon-Fano编码和Huffman编码算法实现是使用硬件和硬编码完毕的。直到20世纪70年代互联网以及在线存储的出现,软件压缩才被实现为Huffman编码根据输入数据动态产生。随后,1977年Abraham Lempel 和 Jacob Ziv发表了他们首创性的LZ77算法,第一个使用字典来压缩数据的算法。
特别的,LZ77使用了一个叫作slidingwindow的动态字典。1778年,这对搭档发表了相同使用字典的LZ78算法。
与LZ77不一样,LZ78解析输入数据,生成一个静态字典,不像LZ77动态产生。
LZ77和LZ78都高速的流行开来,衍生出多个下图中所看到的的压缩算法。当中的大多数已经沉寂了,仅仅有那么几个现在被大范围的使用,包含DEFLATE。LZMA以及LZX。绝大多数常用的压缩算法都衍生于LZ77。这不是因为LZ77技术更好,仅仅是因为Sperry在1984年申请了LZ78衍生算法LZW的专利,从而发展受到了专利的阻碍。Sperry開始因专利侵权而起诉软件提供商。server管理员,甚至是使用GIF格式但没有License的终端用户。
同一时候,UNIX压缩工具使用了一个叫LZC的LZW算法微调整版本号。以后因为专利问题而被弃用。
其它的UNIX开发人员也開始放弃使用LZW。这致使UNIX社区採用基于DEFLATE的gzip和基于Burrows-Wheeler Transform的bzip2算法。
长远来讲。对于UNIX社区这是有优势的,因为gzip和bzip2格式差点儿老是比LZW有更好的压缩比。环绕LZW的专利问题已经结束,因为LZW的专利2003年就到期了。
虽然这样。LZW算法已经很是大程度上被替代掉了。只被使用于GIF压缩中。自那之后。也有一些LZW的衍生算法。只是都没有流行开来,LZ77算法仍然是主流。
另一场法律官司发生于1993。关于LZS算法。
LZS是由Stac Electronics开发的。用于硬盘压缩软件。如Stacker。微软在开发影片压缩软件时使用了LZS算法,开发的软件随着MS-DOS 6.0一块儿公布,声称可使硬盘容量翻倍。当Stac Electronics发现本身的知识財产被使用后,起诉了微软。微软随后被判专利侵权并赔偿Stac Electronics1亿2000万美圆,后因微软上诉因非有益侵权而下降了1360万美圆。虽然Stac Electronics和微软发生了一个那么大的官司。但它没有阻碍Lempel-Ziv算法的开发,不像LZW专利纠纷那样。惟一的结果就是LZS没有衍生出不论什么算法。
自从Lempel-Ziv算法被发表以来,随着对存储需求的不断增加,一些公司及其它团体開始使用数据压缩技术,这能让他们知足这些需求。
然而,数据压缩并无被大范围的使用,这一局面直到20世纪80年代末期随着互联网的腾飞才開始改变,那时数据压缩的需求出现了。带宽限额,昂贵。数据压缩能够帮助缓解这些瓶颈。
当万维网发展起来以后人们開始分享不少其它的图片以及其它格式的数据。这些数据远比文本大得多,压缩開始变得极其重要。
为了知足这些需求。几个新的文件格式被开发出来,包含ZIP,GIF,和PNG。
Thom Henderson经过他的公司公布了第一个成功的商业存档格式。叫作ARC,公司名为为System Enhancement Associates。ARC在BBS社区尤其流行。这是因为它是第一个既可以打包又可以压缩的程序。此外还开放了源码。ARC格式使用一个LZW的衍生算法来压缩数据。
一个叫作Phil Katz的家注意到了ARC的流行并决定用汇编语言来重写压缩和解压缩程序,但愿改进ARC。他于1987公布了他的共享软件PKARC程序。不久被Henderson以侵犯版权为由起诉。
Katz被认定为有罪,并被迫支付版权费用以及其余许可协议费用。
他之因此被认定侵权。是因为PKARC是明显抄袭ARC。甚至于一些凝视里面的错别字都一样。
Phil Katz自1988年以后就因许可证问题不能继续出售PKARC,因此1989年他建立了一个PKARC的改动版。就是现在你们熟知的ZIP格式。
由于使用了LZW。它被以为专利侵权的。以后Katz选择转而使用新的IMPLODE算法。这样的格式于1993年再次被改动。那时Kata公布了PKZIP的2.0版本号,那个版本号实现了DEFLATE算法以及一些其余特性。如切割容量等。
这个ZIP版本号也是咱们现在随处可见的格式,所有的ZIP文件都遵循PKZIP 2.0格式,虽然它年代久远。
GIF格式,全称Graphics Interchange Format,于1987年由CompuServe建立。赞成图像无失真地被共享(虽然这样的格式被限定每一帧最多256种颜色),同一时候减少文件的大小以赞成经过数据机传输。
然而,像ZIP格式同样。GIF也是基于LZW算法。虽然专利侵权,Unisys没有办法去阻止GIF的传播。即便是现在。20年后的今天。GIF仍然被使用着。特别是它的动画能力。
虽然GIF没有办法被叫停,CompuServe需找一种不受专利束缚的格式,并于1994年引入了Portable Network Graphics (PNG) 格式。像ZIP同样。PNG使用DEFLATE算法来处理压缩。
虽然DELLATE的专利属于Katz,这个专利并不是强性制的,正是这样,PNG以及其余基于DEFLATE的格式避免了专利侵权。
虽然LZW在压缩历史的初期占领霸主位置,由于Unisys公司的好诉讼做为。LZW慢慢的淡出主流,你们转而使用更快更高效的DEFLATE算法。
现在DEFLATE是使用得最多的算法,有些压缩世界里瑞士军刀的味道。
除了用于PNG和ZIP格式以外。计算机世界里DEFLATE也被频繁的用在其余地方。好比gzip(.gz)文件格式也使用了DEFLATE,gzip是ZIP的一个开源版本号。其余还包含HTTP, SSL, 以及其余的高效压缩网络数据传输的技术。
遗憾的是,Phil Katz英年早逝,没能看到他的DEFLATE算法统治计算机世界。
有几年的时间他酗酒成性,生活也于20世纪90年代末期開始支离破碎。好几回因酒驾或者其余违法行为而被逮捕。
Katz于2000年4月14号被发现死于一个酒店的房间。长年37岁。
死因是酒精致使的严重胰腺出血,身旁是一堆的空酒瓶。
ZIP以及其余基于DEFLATE的格式一直占领主导地位。直到20世纪90年代中期。一些新的改进的格式開始出现。1993年,Eugene Roshal公布了一个叫作WinRAR的归档软件,该软件使用RAR格式。最新的RAR结合了PPM和LZSS算法,前面的版本号就不太清楚了。RAR開始在互联网分享文件方面成为事实标准,特别是盗版影像的传播。
1996年一个叫bzip2d的Burrows-Wheeler Transform算法开源实现公布,并非常快在UNIX平台上面流行开来,大有对抗基于DEFLATE算法的gzip格式。1999年另一个开源压缩程序公布了,以7-Zip或.7z的格式存在,7-Zip应该是第一个能够挑战ZIP和RAR霸主地位的格式。这源于它的高压缩比。模块化以及开放性。这样的格式并不只限于使用一种压缩算法,而是能够在bzip2, LZMA, LZMA2, 和 PPMd算法之间随意选择。最后,归档软件中较新的一个格式是PAQ*格式。
第一个PAQ版本号于2002年由Matt Mahoney公布,叫作PAQ1。
PAQ主要使用一种叫作context mixing的技术来改进PPM算法,context mixing结合了两个甚至是多个统计模型来产生一个更好的符号几率预測。这要比当中的随意一个模型都要好。
有不少不一样的技术被用来压缩数据。大多数技术都不能单独使用,需要结合起来造成一套算法。那些能够单独使用的技术比需要结合的技术一般更加有效。当中的绝大部分都归于entropy编码类别如下。但其余的一些技术也挺常用,如Run-Length Encoding和Burrows-Wheeler Transform。
Run-Length Encoding是一个很easy的压缩技术,把反复出现的多个字符替换为反复次数外加字符。
单个字符次数为1。RLE很适合数据反复度比較高的数据,同一行有许多像素颜色一样的渐进图片。也可以结合Burrows-Wheeler Transform等其余技术一块儿使用。
如下是RLE的一个简单样例:
输入: AAABBCCCCDEEEEEEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA输出: 3A2B4C1D6E38A
Burrows-Wheeler Transform是1994年发明的技术,目的是可逆的处理一段输入数据,使得一样字符连续出现的次数最大化。BWT自身并不作不论什么的压缩操做,仅简单地转化数据,让Run-Length Encoder等压缩算法可以更有效的编码。
BWT算法很是easy:
BWT一般处理有很是多交叉反复字符的长字符串时效果很是好。如下是一个有着理想输入的样例。注意&是文件结束符:
因为交换一样的符号到一块儿。输入数据在BWT处理以后获得优化后的结果。另一个算法可以对该结果进行压缩。比方RLE会获得"3H&3A"。虽然这个样例获得了一个较优的结果,只是现实世界中的数据它不老是这样。
数据压缩中,平均来讲为了表示一个字符或短语。Entropy意味着所需要的最少bit数。
一个主要的entropy编码器包含一个分析模型以及一套编码。
输入文件被解析,并产生一个由字符出现几率组成的统计模型。
而后。编码器可以利用该统计模型去决定该给每一个字符多少个bit,从而使得最常用的字符用最短的编码。反之最不常用的字符用最长的编码。
这是最先的压缩技术。于1949年由Claude Shannon和Robert Fano发明。
这个技术的当中一个步骤是产生一个表明字符出现几率的二叉树。字符以这样一种方式排序,出现得越频繁的字符越靠近树的顶端,越不常见的越靠近树的底部。
一个字符相应的编码经过搜索Shannon-Fano来得到。此外,左分支后面加0。右分支加1。好比,"A"是两个左节点后接一个右节点,那么对于的编码为"0012"。Shannon-Fano coding不老是能够产生最优的编码,主要是由于二叉树是自下而上构建的。由于这个缘由。使用的较多的仍是对于随意输入均可以获得最优编码的Huffman coding。
产生Shannon-Fano编码的算法很是easy:
Huffman Coding是另一个entropy coding的样例,与Shannon-Fano Coding很的类似,仅仅是为了产生最优编码二叉树是自上而下构建的。
生成Huffman编码的算法前面的三个步骤与Shannon-Fano全然一样:
1979年该算法在IBM被开发出来。当时IBM正在调研一些压缩算法。以期用于它们的大型机上。假设单论压缩比。Arithmetic coding确实是一个最优的entropy coding技术,一般压缩例如面Arithmetic Coding要比Huffman Coding表现得更好。
然而。它却也比其余技术复杂得多。
不像其余技术会把字符几率构建成一棵树。arithmetic coding把输入转化为一个0到1之间的有理数,输入字符的个数记为base,里面每一个不一样的字符都分配一个0到base之间的值。
而后,最后转化为二进制获得终于的结果。结果也可以经过把base恢复为原来的base值,替换为相应字符而获得原输入值。
一个主要的计算arithmetic code算法例如如下:
这个数字记为base b(比方 base 2表明2二进制)。
如下是一个编码操做的样例,输入为"ABCDAABD":
最后的4表示base=4。
最后的2表示base=2。
若是字符为8个bit表示,输入共需要64个bit空间,然而相应的arithmetic coding仅仅有15个bit,压缩比为24%,效果显著。
这个样例展现了arithmetic coding是怎样良好的压缩固定字符串的。
LZ77发表于1977年,是名副事实上的压缩算法开山之做。
它首次引入'sliding window'的概念,相较几个基本的压缩算法,压缩比都有很明显的提升。LZ77维护了一个字典。用一个三元组来表示offset。run length和切割字符。offset表示从文件起始位置到当前Phase的起始位置的距离。run length记录当前Phase有多少个字符。切割符仅用于切割不一样的Phase。
Phase就是offset到offset+length之间的子串减掉分隔符。
随着文件解析的进行。基于sliding window字典会动态的变化。好比,64MB的sliding window意味着四点将包括64M的输入数据的信息。
给定一个输入为"abbadabba",那么输出可能像"abb(0,1,'d')(0,3,'a')",例如如下图所看到的:
虽然上述的替换看起来比原数据还要大,当输入数据更大一些的时候,效果会比較好。
LZR是LZ77的改动版本号。于1981年由Michael Rodeh发明。
这个算法目标是成为LZ77的一个线性时间替换算法。然而。编码后Udell指针可能指向文件的随意offset,意味着需要耗费可观的内存。加之压缩比表现也差强人意(LZ77好得多),LZR算是一个不成功的LZ77衍生算法。
DEFLATE于1993年由Phil Katz发明,是现代绝大多数压缩任务的基石。它只结合了两种算法,先用LZ77或LZSS预处理,而后用Huffman编码。高速的获得不错的压缩结果。
DEFLATE64是DEFLATE的一个有专利的扩展,把字典的大小提升到64K(名字随之),从而赞成在sliding window里面有更大的距离。
相比于DEFLATE,DEFLATE64在性能和压缩例如面都有提升。然而。由于DEFLATE64的专利保护以及相较DEFLATE并无特别明显的提升。DEFLATE64很是少被採用。相反一些开源算法如LZMA被大量的使用。
LZSS。全称Lempel-Ziv-Storer-Szymanski,于1982年由James Storer发表。LZSS相较LZ77有所提升,它能检測到一个替换是否真的减少了文件大小。假设文件大小没有减少,再也不替换输入值。此外,输入段被(offset, length)数据对替换,当中offset表示离输入起始位置的bytes数量。length表示从该位置读取了多少个字符。另一个改进是去除了"next character"信息,只使用offset-length数据对。
如下是一个输入为" these theses"简单的样例,结果为" these(0,6)s",只节省了一个Byte,只是输入数据大的时候效果会好得多。
LZSS依旧被用在不少使用普遍的归档格式中,当中最知名的是RAR。LZSS有时也被用于网络数据压缩。
LZH发明于1987年,全称为"Lempel-Ziv Huffman"。
它是LZSS的一个衍生算法,利用Huffman coding压缩指针。压缩效果有微小的提升。
然而使用Huffman coding带来的提升实在是很是有限。相较于使用Huffman coding带来的性能损失。不足为取。
LZB相同发明于1987年。相同是LZSS的衍生算法。如LZH同样,LZB也致力于经过更加有效的编码指针以达到更好的压缩效果。它的作法是随着sliding window变大,逐步的增大指针的数量。它的压缩效果确实比LZSS和LZH要好。只是因为额外的编码步骤,速度上比LZSS慢得多。
ROLZ全称"Reduced Offset Lempel-Ziv",它的目标是提升LZ77的压缩效果。经过限制offset的大小,从而下降为offset-length数据对编码的数据量。这项LZ77的衍生技术于1991年首次出现在Ross Williams的LZRW4算法里面。
其余的实现包含BALZ,QUAD,和 RZM。高度优化的ROLZ能够达到接近LZMA的压缩比,只是ROLZ不太流行。
LZP全称"Lempel-Ziv + Prediction"。
它是ROLZ算法的一个特殊案例,offset减少到1。有几个衍生的算法使用不一样的技术来实现或加快压缩速度,或提升压缩比的目标。
LZW4实现了一个数字编码器达到了最好的压缩比,只是牺牲了部分速度。
Ron Williams于1991年发明了这个算法。第一次引入了Reduced-Offset Lempel-Ziv compressiond的概念。LZRW1能够达到很是高的压缩比。同一时候保持高速有效。
Ron Williams也发明另外几个基于LZRW1改进的衍生算法。如LZRW1-A, 2, 3, 3-A, 和4。
Jeff Bonwick于1998年发明了Lempel-Ziv Jeff Bonwick算法。用于Solaris操做系统的Z文件系统(ZFS)。它被以为是LZRW算法的一个衍生算法,特别是LZRW1。目标是改进压缩速度。既然它是被用于操做系统。速度显得尤其重要。不能因为压缩算法的缘由而使得磁盘操做成为瓶颈。
Lempel-Ziv-Stac算法于1994年由Stac Electronics发明。用于磁盘压缩软件。
它是LZ77的一个改动版本号,区分了输出的文字符号与offset-length数据对,此外还移除了分隔符。
功能上来讲,LZS与LZSS算法很是类似。
LZX算法于1995年由Jonathan Forbes和Tomi Poutanen发明。用于Amiga计算机。LZX中X没有什么特殊的意义。
Forbes于1996年把该算法出售给了微软,并且受雇于微软,那那儿该算法被继续优化并用于微软的cabinet(.CAB)格式。这个算法也被微软用于压缩Compressed HTML Help (CHM) 文件,Windows Imaging Format (WIM) 文件,和 Xbox Live Avatars。
LZO于1996年由Markus发明,该算法的目标是高速的压缩和解压缩。
它赞成调整压缩级别,并且在最高级别下仍仅需64KB额外的内存空间,同一时候解压缩仅需要输入和输出的空间。LZO功能上很相似LZSS,只是是为了速度。而非压缩比作的优化。
Lempel-Ziv Markov chain Algorithm算法于1998年首次发表,是随着7-Zip归档软件一块儿公布的。大多数状况下它比bzip2, DEFLATE以及其余算法表现都要好。LZMA使用一系列技术来完毕输出。首先时一个LZ77的改动版本号,它操做的是bitwise级别,而非传统上的bytewise级别。用于解析数据。LZ77算法解析后的输出通过数字编码。
不少其余的技术可被使用,这依赖于详细的LZMA实现。
相比其余LZ衍生算法,LZMA在压缩例如面提升明显,这要归功于操做bitewise,而非bytewise。
LZMA2是LZMA的一个增量改进版本号,于2009年在7-Zip归档软件的一个更新版本号里面首次引入。
LZMA2改进了多线程处理功能,同一时候优化对不可压缩数据的处理,这也略微提升了压缩效果。
Statistical Lempel-Ziv是于2001年由Sam Kwong博士和Yu Fan Ho博士提出的一个概念。主要的原则是数据的统计分析结果可以与LZ77衍生算法结合起来,进一步优化什么样的编码将存储在字典中。
LZ78于1978年由Lempel和Ziv发明,缩写正是来源于此。再也不使用sliding window来生成字典。输入数据要么被预处理以后用来生成字典,或者字典在文件解析过程当中逐渐造成。LZ78採用了后者。字典的大小一般被限定为几兆的大小,或者所有编码上限为几个比特。比方8个。这是出于下降对内存要求的考量。算法怎样处理正是LZ78的各个衍生算法的差异所在。
解析文件的时候。LZ78把新碰到的字符或者字符串加到字典中。
针对每一个符号,形如(dictionary index, unknown symbol)的字典记录会相应地生成。假设符号已经存在于字典中,那么将从字典中搜索该符号的子字符串以及其后的其余符号。
最长子串的位置即为字典索引(Index)。
字典索引相应的数据被设置为最后一个未知子串。
假设当前字符是未知的,那么字典索引设置为0,表示它是单字符对。这些数据对造成一个链表数据结构。
形如"abbadabbaabaad"的输入,将会产生"(0,a)(0,b)(2,a)(0,d)(1,b)(3,a)(6,d)"这种输出。你能从如下的样例里面看到它是怎样演化的:
LZW于1984年由Terry Welch发明,全称为Lempel-Ziv-Welch。
它是LZ78你们族中被用得最多的算法,虽然被专利严重的阻碍了使用。
LZW改进LZ78的方法与LZSS相似。它删除输出中冗余的数据,使得输出中再也不包括指针。压缩以前它就在字典里面包括了每一个字符。也引入了一些技术改进压缩效果,比方把每一个语句的最后一个字符编码为下一个语句的第一个字符。LZW在图像转换格式中较为常见,早期也曾用于ZIP格式里面,也包括一些其它的专业应用。LZW很的快。只是相较于一些新的算法。压缩效果就显得比較平凡。
一些算法会更快,压缩效果也更好。
LZC。全称Lempel-Ziv Compress,是LZW算法的一个微小改动版本号,用于UNIX压缩工具中。
LZC与LZW二者的差异在于。LZC会监控输出的压缩比。当压缩比超过某一个临界值的时候,字典被丢弃并重构。
Lempel-Ziv Tischer是LZC的改动版,当字典满了,删除最不常用的的语句。用新的记录替换它。另外一些其余的小改进,只是现在LZC和LZT都不常用了。
于1984年由Victor Miller和Mark Wegman发明,LZMW算法很是相似于LZT,它也採用了替换最不常用语句的策略。
然而。不是链接字典中类似的语句,而是链接LZMW最后被编码的两个语句并且存储为一条记录。所以。字典的容量能够高速扩展并且LRUs被更频繁的丢弃掉。
LZMW压缩效果比LZT更好,然而它也是另一个这个时代很是难看到其应用的算法。
LZAP于1988年由James Storer发明,是LZMW算法的改动版本号。AP表明"all prefixes"。以其遍历时在字典里面存储单个语句,字典存储了语句的所有排列组合。好比。假设最后一个语句为"last"。当前语句是"next",字典将存储"lastn"。"lastne","lastnex"。和 "lastnext"。
LZWL是2006年发明的一个LZW改动版本号。处理音节而非字符。LZWL是专为有很是多常用音节的数据集而设计的。比方XML。
这样的算法通常会搭配一个前置处理器。用来把输入数据分解为音节。
Matti Jakobsson于1985年发表了LZJ算法,它是LZ78你们族中惟一一位衍生于LZW的算法。LZJ的工做方式是。在字典中存储每一个通过预处理输入中的不一样字符串。并为它们编码。当字典满了。移除所有仅仅出现一次的记录。
经过抽样来预測数据是一项统计建模技术,使用输入中的一部分数据,来预測兴许的符号将会是什么,经过这样的算法来下降输出数据的entropy。
该算法与字典算法不同,PPM预測下一个符号将会是什么,而不是找出下一个符号来编码。PPM一般结合一个编码器来一块儿使用,如arithmetic编码或者适配的Huffman编码。
PPM或者它的衍生算法被实现于不少归档格式中。包含7-Zip和RAR。
bzip2是Burrows-Wheeler Transform算法的一个开源实现。
它的操做原理很是easy,只是却在压缩比和速度之间达到了一个平衡,表现良好,这让它在UNIX环境上很是流行。首先。使用了一个Run-Length编码器。接下来。Burrows-Wheeler Transform算法增长进来,而后,使用move-to-front transform以达到产生大量一样符号的目标,为接下来的还有一个Run-Length 编码器作准备。最后结果用Huffman编码。将一个消息头与其打包。
PAQ于2002年由Matt Mahoney发明,是老版PPM的一个改进版。改进的方法是使用一项叫作context mixing的革命性技术。Context mixing是指智能地结合多个(PPM是单个模型)统计模型。来作出对下一个符号的更好预測。比当中的不论什么一个模型都要好。PAQ是最有前途的技术之中的一个,它有很是好的压缩比,开发也很是活跃。自它出现后算起,有超过20个衍生算法被发明出来,当中一些在压缩例如面屡破记录。
PAQ的最大缺点是速度,这源于使用了多个统计模型来得到更好的压缩比。
然而随着硬件速度的不断提高。它也许会是将来的标准。PAQ在应用方面进步缓慢,一个叫PAQ8O的衍生算法可以在一个叫PeaZip的Windows程序里面找到。PAQ8O支持64-bit,速度也有较大提高。
其余的PAQ格式只用于命令行程序。