无损压缩算法历史

引言

无损压缩算法可行的基本原理是,任意一个非随机文件都含有重复数据,这些重复数据可以通过用来确定字符或短语出现概率的统计建模技术来压缩。统计模型可以用来为特定的字符或者短语生成代码,基于它们出现的频率,配置最短的代码给最常用的数据。这些技术包括熵编码(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给班级的同学两个选项,写一篇学期论文或者参加期末考试。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动态产生。

法律问题

Deflate的崛起

当前的一些归档软件

压缩技术

有许多不同的技术被用来压缩数据。大多数技术都不能单独使用,需要结合起来形成一套算法。那些能够单独使用的技术比需要结合的技术通常更加有效。其中的绝大部分都归于entropy编码类别下面,但其它的一些技术也挺常用,如Run-Length Encoding和Burrows-Wheeler Transform。

Run-Length Encoding

Run-Length Encoding是一个非常简单的压缩技术,把重复出现的多个字符替换为重复次数外加字符。单个字符次数为1。RLE非常适合数据重复度比较高的数据,同一行有很多像素颜色相同的渐进图片,也可以结合Burrows-Wheeler Transform等其它技术一起使用。

下面是RLE的一个简单例子:

输入: AAABBCCCCDEEEEEEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA输出: 3A2B4C1D6E38A

Burrows-Wheeler Transform

Burrows-Wheeler Transform是1994年发明的技术,目的是可逆的处理一段输入数据,使得相同字符连续出现的次数最大化。BWT自身并不做任何的压缩操作,仅简单地转化数据,让Run-Length Encoder等压缩算法可以更有效的编码。

Entropy Encoding

数据压缩中,平均来说为了表示一个字符或短语,Entropy意味着所需要的最少bit数。一个基本的entropy编码器包括一个分析模型以及一套编码。输入文件被解析,并产生一个由字符出现概率组成的统计模型。然后,编码器可以利用该统计模型去决定该给每一个字符多少个bit,从而使得最常用的字符用最短的编码,反之最不常用的字符用最长的编码。

Shannon-Fano Coding

这是最早的压缩技术,于1949年由Claude Shannon和Robert Fano发明。这个技术的其中一个步骤是产生一个代表字符出现概率的二叉树。字符以这样一种方式排序,出现得越频繁的字符越靠近树的顶端,越不常见的越靠近树的底部。

一个字符对应的编码通过搜索Shannon-Fano来获得,此外,左分支后面加0,右分支加1。例如,"A"是两个左节点后接一个右节点,那么对于的编码为"0012"。Shannon-Fano coding不总是能够产生最优的编码,主要是由于二叉树是自下而上构建的。由于这个原因,使用的较多的还是对于任意输入都能够得到最优编码的Huffman coding。

Huffman Coding

Huffman Coding是另外一个entropy coding的例子,与Shannon-Fano Coding非常的相似,只是为了产生最优编码二叉树是自上而下构建的。

更详细见:http://blog.csdn.net/kimylrong/article/details/39405981

时间: 2024-11-07 04:31:50

无损压缩算法历史的相关文章

Zstandard:一种新的无损压缩算法

Zstandard(缩写为Zstd)是一种新的无损压缩算法,旨在提供快速压缩,并实现高压缩比.它既不像LZMA和ZPAQ那样追求尽可能高的压缩比,也不像LZ4那样追求极致的压缩速度. 下面是一组基准测试数据: 压缩算法名称 压缩比 压缩速度(MB/s) 解压速度(MB/s) zlib 1.2.8 -6 3.099 18 275 Zstd 2.872 201 498 zlib 1.2.8 -1 2.73 58 250 LZ4 HC r127 2.72 26 1720 QuickLZ 1.5.1b6

几个常用快速无损压缩算法性能比较

SnappySnappy是在谷歌内部生产环境中被许多项目使用的压缩库,包括BigTable,MapReduce和RPC等.谷歌表示算法库针对性能做了调整,而不是针对压缩比或与其他类似工具的兼容性.在Intel酷睿i7处理器上,其单核处理数据流的能力达到250M/s-500M/s.Snappy同时针对64位x86处理器进行了优化,在英特尔酷睿i7处理器单一核心实现了至少250MB/s的压缩性能和500MB/ s的解压缩性能.Snappy对于纯文本的压缩率为1.5-1.7,对于HTML是2-4,当然

添砖加瓦:snappy无损压缩算法

一.简介 Snappy(旧称:Zippy)是Google基于LZ77的思路用C++语言编写的快速数据压缩与解压程序库,并在2011年开源.其目标并非最大压缩率或与其他压缩程序的兼容性,而是非常高的速度和合理的压缩率.使用一个运行在64位模式下的酷睿i7处理器的单个核心,压缩速度250 MB/s,解压速度500 MB/s.压缩率比gzip低20-100% Snappy广泛应用在Google的项目,例如BigTable.MapReduce和Google内部RPC系统的压缩数据.它可在开源项目中使用,

图像压缩算法简要说明

图像压缩的目的是减少图像的不相关性和冗余性使得其能够以有效的形式存储或者传输.图像压缩分为有损压缩和无损压缩,无损图像压缩常用于档案资料.医学.工程制图.剪贴画和漫画.有损图像压缩,对于低比特流的传输条件下常使用.有损图像压缩对于那些可以牺牲少许的图像质量而希望获得低比特传输的图像具有很广泛的应用. 图像的压缩方法就是研究如何减少或去掉数据中冗余部分以减小数据的存储空间,图像压缩中数据冗余主要包含以下几种: 1.编码冗余: 以灰度图像为例,像素点的取值范围是[0,255],而对于一幅图像来说,其

无损数据压缩算法的历史

引言 有两种主要的压缩算法: 有损和无损.有损压缩算法通过移除在保真情形下需要大量的数据去存储的小细节,从而使文件变小.在有损压缩里,因某些必要数据的移除,恢复原文件是不可能的.有损压缩主要用来存储图像和音频文件,同时通过移除数据可以达到一个比较高的压缩率,不过本文不讨论无损压缩.无损压缩,也使文件变小,但对应的解压缩功能可以精确的恢复原文件,不丢失任何数据.无损数据压缩被广泛的应用在计算机领域,从节省你个人电脑的空间,到通过web发送数据.使用Secure Shell交流,查看PNG或GIF图

文本压缩算法的对比和选择

在数据压缩领域里,文本压缩的历史最久,从Morse到Huffman和算术编码(Arithmetic coding),再到基于字典和上下文的压缩算法.各种算法不断改进,从通用算法,到现在更具针对性的算法,结合应用场景的垂直化的趋势越来越明显.所以在选择或者评价压缩算法,一定要结合实际应用场景加以考虑,包括字符集.内容的大小.压缩及解压的性能.以及各端支持情况. 数据压缩算法 一套完整的压缩算法,实际以下几个部分:  其中除编码外的三项目的都是找到一个适于编码的表示方法,而编码则是以简化的方法进行输

spice 图像压缩算法相关代码逻辑流程

下面是转载http://blog.csdn.net/zhoujiaxq/article/details/11201893 内容,是对图像算法的简单介绍接流程 目前的spice图像压缩主要采用了quic,glz和jpeg.quic和glz是无损压缩算法,quic主要用于照片,glz用于人工图像,jpeg也主要用于照片压缩但是是有损的.jpeg能节省50%的带宽,glz只能节省20%,但是jpeg会带来更大的开销,所以不能都使用jpeg进行压缩. spice官网对于广域网支持的介绍:http://s

LZ77压缩算法编码原理详解(结合图片和简单代码)

前言 LZ77算法是无损压缩算法,由以色列人Abraham Lempel发表于1977年.LZ77是典型的基于字典的压缩算法,现在很多压缩技术都是基于LZ77.鉴于其在数据压缩领域的地位,本文将结合图片和源码详细介绍其原理. 原理介绍: 首先介绍几个专业术语. 1.lookahead buffer(不知道怎么用中文表述,暂时称为待编码区): 等待编码的区域 2. search buffer: 已经编码的区域,搜索缓冲区 3.滑动窗口: 指定大小的窗,包含“搜索缓冲区”(左) + “待编码区”(右

iOS LZMA类压缩算法使用

LZMA(Lempel-Ziv-Markov chain-Algorithm的缩写)是2001年以来得到发展的一个数据压缩算法,它用于7-Zip归档工具中的7z格式和 Unix-like 下的 xz 格式.它使用类似于LZ77的字典编码机制,在一般的情况下压缩率比bzip2为高,用于压缩的字典文件大小可达4GB. C++语言写成的LZMA开放源码压缩库使用了区间编码支持的LZ77改进压缩算法以及特殊的用于二进制的预处理程序.LZMA 对数据流.重复序列大小以及重续序列位置单独进行了压缩.LZMA