lz78算法的简介

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了lz78算法的简介相关的知识,希望对你有一定的参考价值。

参考技术A

尽管在最初得到流行,但是后来 LZ78 的普及逐渐衰减,这可能是由于在刚 LZ78 出现的一些年份,一部分 LZ78 算法获得了美国专利保护。最流行的 LZ78 压缩形式是 LZW 算法,这个算法是 Terry Welch 所开发的一个 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表示当前码字的缀-符串。

如何设计一种高效的算法来支持 LZ77 压缩序列中的随机访问?

【中文标题】如何设计一种高效的算法来支持 LZ77 压缩序列中的随机访问?【英文标题】:How to design an efficient algorithm to support random access in LZ77 compressed sequences? 【发布时间】:2021-07-02 12:26:22 【问题描述】:

我正在从事一个文本压缩项目,我需要在 LZ77 压缩序列中设计一种有效的算法。特别是,给定一个 LZ77 压缩序列和一个索引 i,我们可以 恢复输入序列S的单个符号S[i]。算法消耗的空间和随机访问一个符号的时间是我们追求的。

提前感谢您的建议。

【问题讨论】:

【参考方案1】:

有关示例,请参阅 zran.c。它在 gzip 或 zlib 流中构建带有入口点的索引。就未压缩数据而言,您可以选择入口点彼此之间的大致距离。要获取未压缩数据的随机字节,您可以从该字节之前的最近入口点开始解压缩,并解压缩直到到达该字节。

权衡是存储空间更少,入口点更少,但获取任何给定字节的时间更长,而不是更多存储空间和更少时间。

【讨论】:

感谢您的建议。很遗憾,我之前采用过这个方案。现在我想设计一个不需要额外空间并且支持随机访问的算法,或者在支付少量额外空间的情况下设计一个高效的随机访问算法。再次感谢您的建议。 LZ77 使用以前未压缩的数据作为要复制的字符串源进行压缩。因此,压缩方法固有的是,在随机位置开始解压缩时,您必须以某种方式恢复该历史记录。 另一种方法是在选择的随机访问点丢弃历史记录。如果你经常丢弃历史,你会严重降低压缩率。如果您可以在随机位置解压缩约 1 MB 的数据以获取您的字节,那么对 deflate 压缩的打击不会太糟糕,以至于每 1 MB 丢弃一次历史记录。 为此,您需要控制数据的压缩。 感谢您的建议,非常感谢您的帮助。不幸的是,我正在追求一种不影响压缩比的随机访问方案。

以上是关于lz78算法的简介的主要内容,如果未能解决你的问题,请参考以下文章

LZ4压缩算法简介

LZ4压缩算法简介

LZ78 压缩算法的 Java 实现

数据压缩LZ78算法原理及实现

数据压缩算法---LZ77算法 的分析与实现

LZSS算法名称的由来