我正在研究用C ++实现LZW压缩,并且不确定最好的字典实现。
哈希表很有意义,但我不明白我将如何“重新分配”值。如果表格已满,我需要能够开始覆盖之前(最旧的)多字典字典条目。哈希表需要我跟踪这些,找到它,删除它,然后插入新的。
有什么建议吗?
答案 0 :(得分:3)
Unix compress utility (source code link)使用双重散列和周期表清除。
如果你想要快速压缩和解压缩,那么远比LZW更好的选择,这是非常过时的。您应该在zlib(可能已在您的计算机上),LZO和lz4上查看快速,1级压缩。
除教学或娱乐价值外,没有理由编写新的LZW代码。这只是历史的兴趣。您还可以研究压缩实用程序以进行此类指导和娱乐。
答案 1 :(得分:2)
您必须在压缩和解压缩中使用两种不同的结构。
压缩时,您应该使用Trie,因为您必须按内容而不是按键搜索字典。
在解压缩时,您可以通过更常规的方式访问字典,即按键。 然后,您可以使用任何关联数组结构。像hashtables甚至是字符串的vector / deque(因为你的索引是连续的自然数)。
答案 2 :(得分:1)
您正在寻找的实际上是两个数据结构:
如果你正在寻找你的意见建议的练习,你可以自己实现它们,或者使用stl / sgi / c ++ 11实现(unordered_map是实际的哈希映射,通过sgi或c ++ 11,和FIFO队列是双向链表,例如std :: deque)。
这个想法是,无论何时想要丢弃最旧的字典条目,都会弹出队列中的最后一个元素,然后将其从哈希表中删除。
答案 3 :(得分:0)
您可以找到具有单向队列here LZW-AB的lzw的最大内存有效实现。但是请注意,它不适用于大文件。
如今,LZW可用于支持支持它的古老的Web服务器。这样的解决方案应该可以完美地工作。