LZW压缩&字典

时间:2012-07-22 15:36:30

标签: c++ dictionary compression lzw

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

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

有什么建议吗?

4 个答案:

答案 0 :(得分:3)

Unix compress utility (source code link)使用双重散列和周期表清除。

如果你想要快速压缩和解压缩,那么比LZW更好的选择,这是非常过时的。您应该在zlib(可能已在您的计算机上),LZOlz4上查看快速,1级压缩。

除教学或娱乐价值外,没有理由编写新的LZW代码。这只是历史的兴趣。您还可以研究压缩实用程序以进行此类指导和娱乐。

答案 1 :(得分:2)

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

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

在解压缩时,您可以通过更常规的方式访问字典,即按键。 然后,您可以使用任何关联数组结构。像hashtables甚至是字符串的vector / deque(因为你的索引是连续的自然数)。

答案 2 :(得分:1)

您正在寻找的实际上是两个数据结构:

  1. 哈希表。
  2. FIFO队列(丢弃旧表条目))。
  3. 如果你正在寻找你的意见建议的练习,你可以自己实现它们,或者使用stl / sgi / c ++ 11实现(unordered_map是实际的哈希映射,通过sgi或c ++ 11,和FIFO队列是双向链表,例如std :: deque)。

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

答案 3 :(得分:0)

您可以找到具有单向队列here LZW-AB的lzw的最大内存有效实现。但是请注意,它不适用于大文件。

如今,LZW可用于支持支持它的古老的Web服务器。这样的解决方案应该可以完美地工作。