浅谈 Lempel-Ziv压缩方法

Lempel-Ziv 压缩方法

粗略定义:

Lempel-Ziv(LZ)是一种压缩方法,可用于任何大小长度的任何字母的文件压缩

历史及简介

LZ算法最早由亚伯拉罕·伦佩尔(Abraham Lempel)和雅各布·齐夫(Jacob Ziv)于1977年在论文“A Universal Algorithm for Sequential Data Compression”中引入。
LZ算法拥有自适应的能力,通过下面所介绍的一种数字搜索树的数据结构,能够完成多种输入符号的文件的压缩。目前许多主流的压缩软件,例如:7z、zip等,均是通过此类算法的变形,LZ77,LZ78包括其他种种整合而成。

应用方法

  • 从左到右遍历,将所有之前未出现的字符组合标号
  • 通过刚刚标号的新数组重新表示整个数组,其中,最后一位用字母表中的一个数表示
  • 通过刚刚得到的字符加数组的组合,将每个字符组合定义为标号长度+定长的字母表的编码,完成压缩

EXAMPLE

我们知道某个文件有三种字符,{a,b,c}。并且现有一种文件,它输入的内容为:
abaabcaaabbcaaaa
我们对此开始进行一系列的标号操作,从最左端开始。
对所有之前没有出现的都进行标注。
如以下表格所示,一开始,从空集为0开始,给后来未出现的情况进行标号1~8
然后第三行开始,我们都用前面出现过的代号,加一个全新的符号,来进行标识,如第三行表示。

-abaabcaaabbcaaaa
012345678
00a0b1a1b3a2b0c5a

接下来,我们在已经构造的输出中构造位序列。编码输出序列所需的位数是编码指向当前片段前缀的整数所需的最小位数加上编码一个符号B所需的位数。
其中B为大小为k的字母表进行编码所需要的位数,其计算方法为

B = [ log ⁡ 2 k ] B = [\log_{2}{k}] B=[log2k]

继续进行编辑

-abaabcaaabbcaaaa
012345678
00a0b1a1b3a2b0c5a
00+B1+B2+B2+B3+B3+B3+B3+B

上面的例子中,第八位aaaa,翻译成5a,需要3位来表示编号5,然后有一个B位表示a。
其中B位表示了所需的所有字母表的数据,{a,b,c}

数字搜索树(DST)

粗浅定义:

数字搜索树是一个k元树,其中k是输入文件的字母表的大小,每个边对应于k个符号中的一个。

图示

上述例子的一种数字搜索树

数字搜索数的简单描述

  • 为LZ算法进行编码的数字搜索树,从根节点“0”开始,每个节点与每个“碎片段”相连接,构成树。每个情况的标号,或者说,权重,如图所标识。
  • 连接的上端为父节点,下面为子节点,所标注的即为权重。

编码

在分析输入字符串时创建上述数字搜索树,通过处理每个符号来跟踪DST中的正确路径,直到达到数码0(nil)或需要新的分支,在这种情况下,编码时在树中插入相应的节点。由于每个输入符号在编码器中引起一个步骤,很明显这需要O(n)时间,其中n是输入符号的数目。编码器完成编码后,可以丢弃DST,因为压缩信息完全包含在上面描述的输出序列中。因此,我们完全可以把编码视为构建DST本身。

解码

Lempel-Ziv方法的解码是通过观察带有父指针的数字搜索树,因此可以应用数组来实现对数据的解码,如下所示:

pointerparentedge value
10a
20b
31a
42c
53a
62b
70c
85a

从LZ方法解码压缩信息所用的时间是O(n),与编码一样,通过将DST逆向为一个数组,每个符号一次解压缩一个。每个数组索引都有一个指向其父索引的指针,该指针允许解码器在O(n)时间内重新创建原始信息。

注意

假设在某个概率模型下,输入序列具有熵E,那么对于很广泛的模型序列情况下,输出序列的预期长度非常接近其理论下限即香农下界,即所覆盖的模型包括从一组具有给定概率的单词中提取的独立单词数据流。有趣的是,与前缀固定编码不同,我们不需要事先知道这些概率,因为Lempel-Ziv方法会自动调整自身,来适应各种状况
关于香农下界和前缀编码等说明,可以参照我另一篇博客,对信息论、编码熵等进行了简单的描述:
浅谈香农定理、信息论、熵

本文的是在学习下面的公开演讲与文章后、整合处理来的,附上文件名,有兴趣的朋友可以自行阅读

A Lecture on the Lempel-Ziv Compression Method
Jacob Bettencourt
March 30, 2018

  • 2
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
LZW(Lempel-Ziv-Welch)算法是一种无损的数据压缩算法,它最初由Abraham Lempel和Jacob Ziv在1977年提出,后来由Terry Welch在1984年进行了改进和完善。LZW算法主要用于文本和图像数据的压缩,它的压缩率通常比RLE(Run-length encoding)算法更高。 LZW算法的基本思想是将连续出现的数据序列编码为单个符号,从而减少数据的存储空间。LZW算法主要分为两个阶段:字典的建立和数据的编码。 在字典的建立阶段,LZW算法会构建一个初始字典表,其中包含了所有可能的输入符号。例如,对于8位的像素值,LZW算法将建立一个包含256个符号的初始字典表,每个符号对应一个像素值。 在数据的编码阶段,LZW算法会遍历输入数据,逐个读取数据,并将读取的数据添加到字典表中,同时输出对应的符号。在后续的数据读取过程中,LZW算法将会不断更新字典表,将出现过的数据序列编码为单个符号。 具体的编码过程如下: 1. 初始化字典表,将所有可能的输入符号添加到字典表中。 2. 从输入数据中读取一个符号,将其作为当前输入序列的起始符号。 3. 逐个读取输入数据,构建当前的输入序列。 4. 如果当前的输入序列已经存在于字典表中,则将其对应的符号输出,并将当前输入序列扩展一个符号。 5. 如果当前的输入序列不存在于字典表中,则将其对应的符号添加到字典表中,并将当前输入序列扩展一个符号。 6. 重复步骤3~5,直到输入数据全部编码完成。 LZW算法的优点是可以处理任意类型的数据,不需要事先对数据进行特殊处理,同时具有良好的压缩率和高效的解压速度。不过它也有一些缺点,例如需要较大的字典表来存储编码和解码用的符号,因此在处理大规模数据时可能会占用较大的存储空间。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值