在介绍LZ78算法之前,首先说明在算法中用到的几个术语和符号:
(1) 字符流(Charstream)
:要被编码的数据序列。
(2) 字符(Character)
:字符流中的基本数据单元。
(3) 前缀(Prefix)
: 在一个字符之前的字符序列。
(4) 缀-符串(String)
:前缀+字符。
(5) 码字(Code word)
:码字流中的基本数据单元,代表词典中的一串字符。
(6) 码字流(Codestream)
: 码字和字符组成的序列,是编码器的输出。
(7) 词典(Dictionary)
: 缀-符串表。按照词典中的索引号对每条缀-符串(String)指定一个码字(Code word)。
(8) 当前前缀(Current prefix)
:在编码算法中使用,指当前正在处理的前缀,用符号P表示。
(9) 当前字符(Current character)
:在编码算法中使用,指当前前缀之后的字符,用符号C表示。
(10) 当前码字(Current code word)
: 在译码算法中使用,指当前处理的码字,用W表示当前码字,String.W表示当前码字的缀-符串。
1. 编码算法
LZ78的编码思想是不断地从字符流中提取新的缀-符串(String),通俗地理解为新“词条”,然后用“代号”也就是码字(Code
word)表示这个“词条”。这样一来,对字符流的编码就变成了用码字(Code
word)去替换字符流(Charstream),生成码字流(Codestream),从而达到压缩数据的目的。
在编码开始时词典是空的,不包含任何缀-符串(string)。在这种情况下编码器就输出一个表示空字符串的特殊码字(例如“0”)和字符流中
(Charstream)的第一个字符C,并把这个字符C添加到词典中作为一个由一个字符组成的缀-符串(string)。在编码过程中,如果出现类似的
情况,也照此办理。在词典中已经包含某些缀-符串(String)之后,如果“当前前缀P
+当前字符C”已经在词典中,就用字符C来扩展这个前缀,这样的扩展操作一直重复到获得一个在词典中没有的缀-符串(String)为止。此时就输出表示
当前前缀P的码字(Code
word)和字符C,并把P+C添加到词典中作为前缀(Prefix),然后开始处理字符流(Charstream)中的下一个前缀。
LZ78编码器的输出是码字-字符(W,C)对,每次输出一对到码字流中,与码字W相对应的缀-符串(String)用字符C进行扩展生成新的缀-符串(String),然后添加到词典中。LZ78编码的具体算法如下:
步骤1: 在开始时,词典和当前前缀P都是空的。
步骤2: 当前字符C :=字符流中的下一个字符。
步骤3: 判断P+C是否在词典中:
(1) 如果“是”:用C扩展P,让P := P+C ;
(2) 如果“否”:
① 输出与当前前缀P相对应的码字和当前字符C;
② 把字符串P+C 添加到词典中。
③ 令P :=空值。
(3) 判断字符流中是否还有字符需要编码
① 如果“是”:返回到步骤2。
② 如果“否”:若当前前缀P不是空的,输出相应于当前前缀P的码字,然后结束编码。
2. 译码算法
在译码开始时译码词典是空的,它将在译码过程中从码字流中重构。每当从码字流中读入一对码字-字符(W,C)对时,码字就参考已经在词典中的缀-符
串,然后把当前码字的缀-符串string.W
和字符C输出到字符流(Charstream),而把当前缀-符串(string.W+C)添加到词典中。在译码结束之后,重构的词典与编码时生成的词典
完全相同。LZ78译码的具体算法如下:
步骤1: 在开始时词典是空的。
步骤2: 当前码字W :=码字流中的下一个码字。
步骤3: 当前字符C := 紧随码字之后的字符。
步骤4: 把当前码字的缀-符串(string.W)输出到字符流(Charstream),然后输出字符C。
步骤5: 把string.W+C添加到词典中。
步骤6: 判断码字流中是否还有码字要译
(1) 如果“是”,就返回到步骤2。
(2) 如果“否”,则结束。
[例4.6]
编码字符串如表4-13所示,编码过程如表4-14所示。现说明如下:
(1) “步骤”栏表示编码步骤。
(2) “位置”栏表示在输入数据中的当前位置。
(3) “词典”栏表示添加到词典中的缀-符串,缀-符串的索引等于“步骤”序号。
(4) “输出”栏以(当前码字W, 当前字符C)简化为(W, C)的形式输出。
表4-13 编码字符串
位置 |
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
字符 |
A |
B |
B |
C |
B |
C |
A |
B |
A |
表4-14 编码过程
步骤 |
位置 |
词典 |
输出 |
1 |
1 |
A |
(0,A) |
2 |
2 |
B |
(0,B) |
3 |
3 |
B C |
(2,C) |
4 |
5 |
B C A |
(3,A) |
5 |
8 |
B A |
(2,A) |
与LZ77相比,LZ78的最大优点是在每个编码步骤中减少了缀-符串(String)比较的数目,而压缩率与LZ77类似。
From : http://courseware2.itsinghua.com/course/yjs/jsj/dmt/1-1/ch04/tcp040404.html?ttype=1&tcode=menu4_040404
分享到:
相关推荐
LZ78压缩算法是一种基于字典的无损数据压缩方法,由Abraham Lempel、Jacob Ziv和Stu Arkin在1977年提出。它通过查找输入字符串中的最长匹配前缀来构建一个新的编码,从而实现数据的压缩。这种算法的主要思想是创建一...
本篇将深入探讨LZ78压缩算法,并结合MATLAB环境的实现方法,以便于理解这一经典的自适应预测编码技术。LZ78算法是数据压缩领域中的一个里程碑,由Lempel、Ziv和Welch在1977年提出,其主要思想是基于已编码的数据构建...
实验目的:理解LZ78编码算法。 实验内容:写出程序,利用LZ78编码实现对某字符序列的二元压缩(二元压缩,即编成二进制序列),并能解压。 实验步骤: 1、压缩 (1) 为字符序列中可能出现的字符进行二进制编码 (2...
LZ78压缩算法是一种基于字典的无损数据压缩方法,由 Abraham Lempel、Jozsef Ziv 和 Terry Gailiunas 在1978年提出,因此得名LZ78。它是LZW(Lempel-Ziv-Welch)压缩算法的前身,后者在实际应用中更为广泛,比如在...
lz78数据压缩算法是基于LZ78的数据压缩算法,主要讲解LZ78算法中用到的几个术语和符号、LZ78的编码思想及LZ78编码的具体算法步骤。LZ78算法的主要思想是不断地从字符流中提取新的缀-符串,然后用“代号”也就是码字...
LZ78压缩算法是一种经典的无损数据压缩方法,由Abraham Lempel和Jacob Ziv在1978年提出,因此得名LZ78。它属于预测编码类的压缩算法,通过查找输入数据中的重复模式并用更短的代码来表示这些模式来实现数据压缩。本...
LZ78编码是一种经典的无损数据压缩算法,由Abraham Lempel、Jacob Ziv和Stu Arthurs在1977年提出。它通过查找输入数据中的重复模式来构建一个字典,然后用这些模式的引用来代替原始数据,从而实现压缩。在Matlab环境...
LZ78压缩算法是一种早期的无损数据压缩方法,由Abraham Lempel、Jacob Ziv和Steeve C. Steinberg在1977年提出,因此得名LZ78。这个算法基于词典编码思想,通过构建一个动态的、自适应的词典来实现数据的压缩。在LZ78...
lz算法的c实现主要是使用c实现lz77
**lz77算法的C语言实现** lz77算法,全称为Lempel-Ziv-77算法,是数据压缩领域中的一个经典算法,由Abraham Lempel和Jacob Ziv于1977年提出。它基于一种滑动窗口模型,通过查找输入数据中的重复模式来创建编码。LZ...
LZ78算法和LZW算法是LZ系列压缩算法的代表。它们都具有类似的存储形式,由一个明确的未压缩的字符和一个向前查找的索引构成。这使得它们可以被某些基于后缀匹配的搜索算法直接处理。 改进的搜索算法 本文对一些模式...
LZ77压缩算法是数据压缩领域中一种基础且重要的无损压缩方法,由 Abraham Lempel 和 Jacob Ziv 在1977年提出,因此得名。这种算法基于滑动窗口的概念,通过查找文本中的重复模式来实现数据的压缩。在本文中,我们将...
### LZ77算法详解 #### 一、LZ77算法概述 ...此外,LZ77算法还可以扩展为LZ78等其他版本,以适应不同的压缩需求。总体来说,理解LZ77算法的基本原理对于从事数据压缩领域的专业人士来说至关重要。
几种常用的压缩算法 本程序包含以下功能: 1、 Arithmetic coding 2、 Huffman coding 3、 LZ77 coding 4、 LZ78 coding 5、 LZW 6、 RLE 7、 DCT 8、 Furie transform
LZ77(Lempel-Ziv-77)算法是一种无损数据压缩方法,广泛应用于文本、图像和音频文件的压缩。它是由Jacob Ziv和Abraham Lempel在1977年提出的,是LZ系列压缩算法的基础。LZ77的核心思想是通过查找输入数据中的重复...
LZ77(Lempel-Ziv-77)压缩算法是数据压缩领域中的一个经典方法,由Abraham Lempel和Jacob Ziv在1977年提出。这种无损压缩技术主要用于文本和二进制数据,尤其适用于未经过预处理的数据。C语言是一种通用的、面向...
LZ77 算法介绍 ...LZ77 算法的变种有很多,如 LZ78、LZW、LZSS 等,它们都基于 LZ77 算法的原理,但有所改进和优化。 LZ77 算法是一种非常重要的无损压缩算法,它广泛应用于各种压缩工具和应用程序中。
在提供的文件中,`readme`文件可能包含了关于如何使用该C语言实现的说明,而`LZ77-master`或`lz78-master.zip`可能是源代码仓库,包含LZ77算法的实现和其他辅助文件。通过阅读源代码和`readme`,你可以深入了解LZ77...
LZ77(Lempel-Ziv-77)压缩算法是数据压缩领域的一个经典方法,由Abraham Lempel和Jacob Ziv于1977年提出。它是一种无损压缩技术,常用于创建ZIP文件格式。在本文中,我们将深入探讨LZ77压缩算法的工作原理、ZIP和...