LZW 压缩和字典

LZW compression & dictionary

本文关键字:字典 压缩 LZW      更新时间:2023-10-16

我正在研究在C++中实现LZW压缩,但不确定最好的字典实现。

哈希表是有意义的,但我不明白如何"重新分配"值。如果表已满,我需要能够开始覆盖以前(最旧的)多字符字典条目。哈希表需要我跟踪这些,找到它,删除它,然后插入新的。

有什么建议吗?

Unix压缩实用程序(源代码链接)使用双哈希和周期表清除。

如果你想要快速压缩和解压缩,那么有比LZW更好的选择,LZW已经过时了。您应该看看zlib(可能已经在您的机器上了)、LZO和lz4中的快速1级压缩。

除了教学或娱乐价值之外,没有任何理由编写新的LZW代码。它只具有历史意义。您还可以研究压缩实用程序,用于此类指导和娱乐。

在压缩和解压缩中必须使用两种不同的结构。

压缩时,您应该使用Trie,因为您必须按内容而不是按关键字搜索字典。

在解压缩时,您可以用更传统的方式访问字典,即按键访问。然后可以使用任何关联数组结构。比如哈希表,甚至字符串的矢量/数据集(因为索引是连续的自然数)。

您要查找的实际上是两个数据结构放在一起:

  1. 哈希表
  2. FIFO队列(用于丢弃旧表项)

如果你想按照你的评论寻求实践,你可以自己实现它们,或者使用stl/sgi/c++11实现(unordered_map是通过sgi或c++11的实际哈希图,FIFO队列是一个双链表,比如std::deque)。

其想法是,每当您想要丢弃最旧的字典条目时,都会弹出队列中的最后一个元素,然后将其从哈希表中删除。

您可以尝试在lzws中实现的两个字典:

  1. 链表,内存使用情况<=327kb
  2. 稀疏阵列,内存使用量<=3350万