我正在研究在 C++ 中实现 LZW 压缩,但不确定最好的字典实现。
哈希表是有道理的,但我不明白我如何能够“重新分配”值。如果表已满,我需要能够开始覆盖以前的(最旧的)多字符字典条目。哈希表需要我跟踪这些,找到它,删除它,然后插入新的。
有什么建议么?
我正在研究在 C++ 中实现 LZW 压缩,但不确定最好的字典实现。
哈希表是有道理的,但我不明白我如何能够“重新分配”值。如果表已满,我需要能够开始覆盖以前的(最旧的)多字符字典条目。哈希表需要我跟踪这些,找到它,删除它,然后插入新的。
有什么建议么?
您必须在压缩和解压缩中使用两种不同的结构。
压缩时,您应该使用Trie,因为您必须按内容而不是键搜索字典。
解压缩时,您以更传统的方式访问字典,即按键。然后,您可以使用任何关联数组结构。像哈希表甚至是字符串的向量/双端队列(因为您的索引是连续的自然数)。
您正在寻找的实际上是两个数据结构放在一起:
如果您正在寻找您的评论建议的练习,您可以自己实现它们,或者使用 stl/sgi/c++11 实现(unordered_map 是实际的哈希映射,通过 sgi 或 c++11,以及一个 FIFO 队列是一个双向链表,例如 std::deque)。
这个想法是,每当您想丢弃最旧的字典条目时,您都会弹出队列中的最后一个元素,然后也将其从哈希表中删除。
您可以尝试在lzws中实现的 2 个字典: