【问题标题】:What if Dictionary size in LZW algorithm is full?如果 LZW 算法中的字典大小已满怎么办?
【发布时间】:2016-10-15 02:03:08
【问题描述】:

我一直在研究 LZW 压缩,但有一件事我不能满足自己,那就是在 LZW 中构建字典时,它的最大限制设置为 4096 个条目。这是为什么 ?。此外,如果字典已满,则字典会被重置,但如果在重置字典之前接下来要读取的几个字符已存在于字典中怎么办。这是一个限制吗?还是我的理解不正确?

【问题讨论】:

  • 一个著名的早期 LZW 实现是 BSD compress(1)。它从 9 位代码开始(字典大小 512 (2^9)) - 霍夫曼编码 LZW 码流会很慢,算术编码并不常见,更不用说不受专利限制的快速编码器了。它根据需要将代码大小增加到 16 的限制,可参数化到 12。压缩比被监控,只有当它变坏时才会发生重置。限制字典大小允许内存很少的计算机解压缩流 - 想想 1/3 世纪前,1200/75 调制解调器,......剩下的很少输入是 AFAIR 未解决的有效问题。

标签: algorithm lzw


【解决方案1】:

字典大小限于输出符号大小。 12 位可以编码 4096 个不同的值。它是讲义和简单/作业实现的常见选择。

但是,可以使用多于源位的任何符号位:16 位符号将允许 65k 字典条目。位越多,当前字典中可以存在的条目就越多,这可以增加“最大”压缩。相反,随着每个输出符号较大,它可能会降低压缩率,特别是对于较小的输入(没有足够的时间来生成字典)和更随机的数据(减少重用字典中符号的能力)。在实践中,19-20 位似乎是有用的限制2,而 16 位符号自然与字节对齐。

也可以根据映射符号的当前数量的 log2 获得自适应符号大小1 - 但随着数据大小的增加,随着字典迅速填满,这种好处会消失。它也在很大程度上被霍夫曼编码所取代。

当字典被“重置”时,它实际上与压缩多个数据块并附加压缩输出相同:字典是分开的。但是,可以根据数据填充字典的时间动态“拆分”数据,而不是每 X 字节的输入。由于符号大小是固定的,因此在做出决定之前确保字典已填满会更有效。

重置字典的主要目的是避免将符号“固定”到输入的一部分中的数据特征,这对于以后的数据可能不正确。压缩器可以使用单个非重置字典,在字典满时重置字典,在字典满时重置字典并且遇到压缩下降等:目标是在域内实现最高压缩/参数。

AlessioLangiu 在"On parsing optimality for dictionary-based text compression—the Zip case" 中简要讨论了许多 LZ77/LZ78/LZW 变体(以及它们使用的优化);这些摘录包含许多有趣的细节,以供进一步研究。

1"Improving LZW' R. Nigel Horspool 详细介绍了自适应符号大小。 Nigel 的"The Effect of Non-Greedy Parsing in Ziv-Lempel Compression Methods" 论文还包括对compress 处理字典重置的总结。

2"The Relative Efficiency of Data Compression by LZW and LZSS" Yair Wiseman 包含符号大小与压缩效率的示例图。图表高度依赖数据。

【讨论】:

  • 您的链接已损坏。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-04-30
  • 1970-01-01
  • 2015-05-14
  • 2021-02-16
  • 2010-12-18
  • 1970-01-01
相关资源
最近更新 更多