【问题标题】:LZW compression & dictionaryLZW 压缩和字典
【发布时间】:2012-07-22 15:36:29
【问题描述】:

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

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

有什么建议吗?

【问题讨论】:

  • 有什么阻碍您使用std::map 或其他标准地图实现吗?
  • 好吧,有人只需要问“libbzip2 有什么问题”? :-)
  • @ChristianStieber 也许它的问题在于它不支持极快的 LZW 压缩?
  • 希望进行一些练习,而不是寻找使事情变得过于简单 (STL) 的东西。

标签: c++ dictionary compression lzw


【解决方案1】:

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

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

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

【讨论】:

  • 这应该是评论,而不是答案。
  • 我不能以同样的方式使用链接,也不能在评论中放置段落。
  • 对压缩源代码及其策略的引用使其成为一个正确的答案,以及一个很好的建议。 +1。
  • 哇,马克阿德勒?酷。
【解决方案2】:

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

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

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

【讨论】:

    【解决方案3】:

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

    1. 哈希表。
    2. FIFO 队列(丢弃旧表条目)。

    如果您正在寻找 cmets 建议的练习,您可以自己实现它们,或者使用 stl/sgi/c++11 实现(unordered_map 是实际的哈希映射,通过 sgi 或 c++11,并且FIFO队列是一个双向链表,例如std::deque)。

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

    【讨论】:

      【解决方案4】:

      你可以试试lzws中实现的2个字典:

      1. 链表,内存使用量
      2. 稀疏数组,内存使用

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2021-02-09
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-07-29
        • 2012-10-24
        相关资源
        最近更新 更多