`
yznxing
  • 浏览: 370471 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

【转】关于LZ77压缩算法

阅读更多

全新的思路

 

我们在第三和第四章中讨论的压缩模型都是基于对信息中单个字符出现频率的统计而设计的,直到 70 年代末期,这种思路在数据压缩领域一直占据着统治地位。在我们今天看来,这种情形在某种程度上显得有些可笑,但事情就是这样,一旦某项技术在某一领域形成 了惯例,人们就很难创造出在思路上与其大相径庭的哪怕是更简单更实用的技术来。


我们敬佩那两个在数据压缩领域做出了杰出贡献的以色列人,因为正是他们打破了 Huffman 编码一统天下的格局,带给了我们既高效又简便的“字典模型”。至今,几乎我们日常使用的所有通用压缩工具,象 ARJ,PKZip,WinZip,LHArc,RAR,GZip,ACE,ZOO,TurboZip,Compress,JAR……甚至许多硬件如网络 设备中内置的压缩算法,无一例外,都可以最终归结为这两个以色列人的杰出贡献。



说起来,字典模型的思路相当简单,我们日常生活中就经常在使用这种压缩思想。我们常常跟人说“奥运会”、“IBM”、“TCP”之类的词汇,说者和 听者都明白它们指的是“奥林匹克运动会”、“国际商业机器公司”和“传输控制协议”,这实际就是信息的压缩。我们之所以可以顺利使用这种压缩方式而不产生 语义上的误解,是因为在说者和听者的心中都有一个事先定义好的缩略语字典,我们在对信息进行压缩(说)和解压缩(听)的过程中都对字典进行了查询操作。字 典压缩模型正是基于这一思路设计实现的。



最简单的情况是,我们拥有一本预先定义好的字典。例如,我们要对一篇中文文章进行压缩,我们手中已经有一本《现代汉语词典》。那么,我们扫描要压缩 的文章,并对其中的句子进行分词操作,对每一个独立的词语,我们在《现代汉语词典》查找它的出现位置,如果找到,我们就输出页码和该词在该页中的序号,如 果没有找到,我们就输出一个新词。这就是静态字典模型的基本算法了。



你一定可以发现,静态字典模型并不是好的选择。首先,静态模型的适应性不强,我们必须为每类不同的信息建立不同的字典;其次,对静态模型,我们必须 维护信息量并不算小的字典,这一额外的信息量影响了最终的压缩效果。所以,几乎所有通用的字典模型都使用了自适应的方式,也就是说,将已经编码过的信息作 为字典,如果要编码的字符串曾经出现过,就输出该字符串的出现位置及长度,否则输出新的字符串。根据这一思路,你能从下面这幅图中读出其中包含的原始信息 吗?




 


啊,对了,是“吃葡萄不吐葡萄皮,不吃葡萄倒吐葡萄皮”。现在你该大致明白自适应字典模型的梗概了吧。好了,下面就让我们来深入学习字典模型的第一 类实现——LZ77 算法。

 

滑动的窗口

LZ77 算法在某种意义上又可以称为“滑动窗口压缩”,这是由于该算法将一个虚拟的,可以跟随压缩进程滑动的窗口作为术语字典,要压缩的字符串如果在该窗口中出 现,则输出其出现位置和长度。使用固定大小窗口进行术语匹配,而不是在所有已经编码的信息中匹配,是因为匹配算法的时间消耗往往很多,必须限制字典的大小 才能保证算法的效率;随着压缩的进程滑动字典窗口,使其中总包含最近编码过的信息,是因为对大多数信息而言,要编码的字符串往往在最近的上下文中更容易找 到匹配串。

 

 

参照下图,让我们熟悉一下 LZ77 算法的基本流程。

 


 

1、从当前压缩位置开始,考察未编码的数据,并试图在滑动窗口中找出最长的匹配字符串,如果找到,则进行步骤 2,否则进行步骤 3。

2、输出三元符号组 ( off, len, c )。其中 off 为窗口中匹配字符串相对窗口边界的偏移,len 为可匹配的长度,c 为下一个字符。然后将窗口向后滑动 len + 1 个字符,继续步骤 1。

3、输出三元符号组 ( 0, 0, c )。其中 c 为下一个字符。然后将窗口向后滑动 len + 1 个字符,继续步骤 1。

 

 

我们结合实例来说明。假设窗口的大小为 10 个字符,我们刚编码过的 10 个字符是:abcdbbccaa,即将编码的字符为:abaeaaabaee

我们首先发现,可以和要编码字符匹配的最长串为 ab ( off = 0, len = 2 ), ab 的下一个字符为 a,我们输出三元组:( 0, 2, a )

现在窗口向后滑动 3 个字符,窗口中的内容为:dbbccaaaba

下一个字符 e 在窗口中没有匹配,我们输出三元组:( 0, 0, e )

窗口向后滑动 1 个字符,其中内容变为:bbccaaabae

我们马上发现,要编码的 aaabae 在窗口中存在( off = 4, len = 6 ),其后的字符为 e,我们可以输出:( 4, 6, e )

这样,我们将可以匹配的字符串都变成了指向窗口内的指针,并由此完成了对上述数据的压缩。

 

 

解压缩的过程十分简单,只要我们向压缩时那样维护好滑动的窗口,随着三元组的不断输入,我们在窗口中找到相应的匹配串,缀上后继字符 c 输出(如果 off 和 len 都为 0 则只输出后继字符 c )即可还原出原始数据。

当然,真正实现 LZ77 算法时还有许多复杂的问题需要解决,下面我们就来对可能碰到的问题逐一加以探讨。

 

……

 

后面的分析就不转载了,贴个链接有兴趣的同学自己看吧。


http://hi.baidu.com/sihochina/blog/item/f42b67dfe0de89164954039c.html

 

具体的实现,可以参考RednaxelaFX的实现:

 

http://rednaxelafx.iteye.com/blog/180434

 

 

 

 

 

  • 大小: 7.8 KB
  • 大小: 12.4 KB
0
0
分享到:
评论

相关推荐

    C语言实现LZ77压缩算法

    LZ77(Lempel-Ziv-77)压缩算法是数据压缩领域中的一个经典方法,由Abraham Lempel和Jacob Ziv在1977年提出。这种无损压缩技术主要用于文本和二进制数据,尤其适用于未经过预处理的数据。C语言是一种通用的、面向...

    c#版本 Lz77压缩算法

    c# Lz77 压缩算法,已经使用很久 没有bug

    LZ77压缩算法(C语言版)

    ### LZ77压缩算法(C语言版)知识点解析 #### 一、LZ77压缩算法简介 LZ77是一种无损数据压缩算法,由Abraham Lempel和Jacob Ziv于1977年提出,是LZ系列算法中的一个。该算法通过查找历史数据中的重复序列来实现数据...

    lz77压缩算法源码

    LZ77(Lempel-Ziv-77)压缩算法是数据压缩领域的一个经典方法,由Abraham Lempel和Jacob Ziv于1977年提出。它是一种无损压缩技术,常用于创建ZIP文件格式。在本文中,我们将深入探讨LZ77压缩算法的工作原理、ZIP和...

    lz77压缩算法c语言实现

    LZ77(Lempel-Ziv-77)压缩算法是数据压缩领域中的一个经典算法,由Abraham Lempel和Jacob Ziv在1977年提出。该算法基于滑动窗口策略,通过查找输入数据中的重复模式来创建编码,从而减少原始数据的存储需求。下面将...

    LZ77压缩算法

    LZ77压缩算法,全称为Lempel-Ziv-Welch(或Lempel-Ziv-Storer-Szymanski)算法,是数据压缩领域的一种基础且广泛应用的无损压缩算法。该算法由以色列科学家Abraham Lempel、Jacob Ziv和美国科学家Mark Welch共同提出...

    LZ77压缩算法介绍

    LZ77压缩算法是数据压缩领域中一种基础且重要的无损压缩方法,由 Abraham Lempel 和 Jacob Ziv 在1977年提出,因此得名。这种算法基于滑动窗口的概念,通过查找文本中的重复模式来实现数据的压缩。在本文中,我们将...

    LZ77数据无损压缩算法,可以直接运行

    LZ77(Lempel-Ziv-Welch)数据无损压缩算法是计算机科学领域中一种广泛应用的无损压缩方法。它由Abraham Lempel、Jacob Ziv和Stanley Welch于1977年提出,是LZW(Lempel-Ziv-Welch)算法的基础,但LZ77本身并不涉及...

    LZ77压缩算法及其派生算法探究

    简介了LZ77压缩算法,详尽阐述了算法的基本原理。

    CSDN技术中心 LZ77压缩算法(C语言版).rar_LZ_LZ77_lz77算法 c语言_压缩文件_压缩算法

    LZ77压缩算法是数据压缩领域中一种基础且重要的算法,由 Abraham Lempel 和 Jacob Ziv 在1977年提出,因此得名LZ77。这个算法是LZ系列压缩方法的鼻祖,对后续的压缩算法如LZSS、LZW等产生了深远的影响。C语言作为...

    LZ77压缩算法(C语言版).doc

    LZ77压缩算法(C语言版) LZ77压缩算法是一种常用的无损压缩算法,它基于字典式压缩的思想,通过查找重复模式来压缩数据。在C语言版的实现中,使用了_bit操作来实现压缩和解压缩操作。 标题:LZ77压缩算法(C语言版) ...

    LZ77压缩,js&java版本

    **LZ77压缩算法详解** LZ77(Lempel-Ziv-Welch)是一种无损数据压缩算法,由Abraham Lempel、Jacob Ziv和Stuart Welch共同提出,是LZW(Lempel-Ziv-Welch)算法的基础。在JavaScript和Java这两种不同的编程语言中,...

    simple-lz77.rar_LZ77_LZ77压缩算法_lz77.c_lz77算法c_simple算法

    LZ77(Lempel-Ziv-77)压缩算法是数据压缩领域中的一个基础方法,由Abraham Lempel和Jacob Ziv在1977年提出。该算法是一种无损压缩技术,主要用于文本、图像和音频数据的压缩,以减少存储空间并提高传输效率。在本...

    lz4压缩算法java实现-LZ4-极快的压缩算法,排序算法数据结构 最快的排序算法

    LZ4压缩算法java实现 LZ4压缩算法是lossless压缩算法,提供了高达500 MB/s每个核心的压缩速度,且可以根据多核CPU进行扩展。它具有极快的解压速度,速度可达多GB/s每个核心,通常达到多核系统中的RAM速度限制。速度...

    lz77_lz77压缩解压缩c语言_LZ77_

    LZ77,全称Lempel-Ziv-Welch(有时也称为LZ77 from Storer-Szymanski,因为他们在1977年独立提出),是一种无损数据压缩算法,广泛应用于文本、图像、音频和视频的压缩。在C语言中实现LZ77,通常涉及到对输入数据流...

    LZ77数据无算压缩解压算法

    LZ77(Lempel-Ziv-77)数据无损压缩算法是计算机科学领域中一种广泛应用的无损压缩方法,由Jacob Ziv和Abraham Lempel于1977年提出。该算法主要基于滑动窗口的概念,通过查找输入数据中的重复模式来实现压缩,这些...

    LZ77数据压缩C语言源代码

    **LZ77数据压缩算法概述** LZ77(Lempel-Ziv-77)是一种无损数据压缩算法,由Abraham Lempel和Jacob Ziv在1977年提出。它是基于字典的滑动窗口压缩方法,主要用于文本、图像和其他类型的数据。在C语言中实现LZ77,...

    图像压缩算法---lz77

    **图像压缩算法——LZ77** 在信息技术领域,数据压缩是至关重要的,尤其是在处理图像、音频和视频等大量数据时。LZ77(Lempel-Ziv算法的1977版本)是一种无损数据压缩算法,由Abraham Lempel和Jacob Ziv在1977年...

Global site tag (gtag.js) - Google Analytics