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

Posted

技术标签:

【中文标题】如何设计一种高效的算法来支持 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 丢弃一次历史记录。 为此,您需要控制数据的压缩。 感谢您的建议,非常感谢您的帮助。不幸的是,我正在追求一种不影响压缩比的随机访问方案。

以上是关于如何设计一种高效的算法来支持 LZ77 压缩序列中的随机访问?的主要内容,如果未能解决你的问题,请参考以下文章

数据流压缩原理实现(huffman编码,LZ77压缩算法)

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

7Z的压缩算法

关于LZ77压缩算法

Linux下libpng库的运用

png文件是啥格式?