【问题标题】:How to efficiently decompress huffman coded file如何有效地解压霍夫曼编码文件
【发布时间】:2015-04-27 08:06:08
【问题描述】:

我发现很多问题都在问这个问题,但有些解释很难理解,我无法完全掌握如何有效解压缩文件的概念。 我发现了这些相关的问题: Huffman code with lookup table How to decode huffman code quickly?

但我无法理解解释。我知道如何定期对霍夫曼树进行编码和解码。现在在我的压缩程序中,我可以将以下任何信息写入文件 象征 霍夫曼代码(无符号长) 霍夫曼码长

我打算做的是获取一个文本文件,将其分成小文本文件并单独压缩,然后通过发送所有小压缩文件及其各自的查找表来解压缩该文件(不知道该怎么做部分)到 Nvidia GPU 以尝试使用某种查找表并行解压缩文件。

我有 3 个问题: 我应该在文件头中写入哪些信息来构建查找表? 如何从文件重新创建此表? 如何使用它快速解码霍夫曼编码文件?

【问题讨论】:

  • 如果您要单独压缩小位,请确保首先为整个文件生成表,否则您必须为每个位创建单独的表,这会影响您的压缩.
  • 好的,所以为整个文件制作表格并将其放入 GPU 内存中。现在如何创建表格以及如何有效地使用它
  • 我看到为整个文件制作表格的唯一问题是,除非我为每个文件单独制作表格,否则很难确定在哪里“剪切”霍夫曼编码字符串的位文件片段

标签: c++ nvidia huffman-code data-compression


【解决方案1】:

不要费心自己写,除非这是一个教学练习。使用 zliblz4 或其他几个免费的压缩/解压缩库中的任何一个,这些库的测试比你能做的任何事情都要好。

您只是在谈论 Huffman 编码,这表明您只会获得一小部分可用压缩。提到的库中的大多数压缩来自匹配字符串。查找“LZ77”。

至于高效的霍夫曼解码,大家可以看看zlib的inflate是怎么做的。它为代码的最高有效 9 位创建一个查找表。表中的每个条目都有该代码的符号和位数(小于或等于九),或者如果提供的九位是更长代码的前缀,则该条目具有指向另一个表的指针以解析其余代码和该辅助表所需的位数。 (有几个这样的辅助表。)如果代码长度小于九,则同一符号有多个条目。实际上,29-n 个 n 位代码的多个条目。

因此,要解码,您会从输入中获取 9 位并从表中获取条目。如果它是符号,则从流中删除为代码指示的位数并发出符号。如果它是指向辅助表的指针,则从流中删除 9 位,获取表指示的位数,并在那里查找。现在你肯定会得到一个要发出的符号,以及要从流中删除的剩余位数。

【讨论】:

  • 发帖人想要构建一个可以在 GPU 上运行的霍夫曼查找表实现。没有可用的库。我最近用 iOS 下的 Metal 构建了一个在 GPU 上运行的霍夫曼解码器,C++ 代码实现了霍夫曼逻辑,并且可以轻松重用。见github.com/mdejong/MetalHuffman
  • 副表有多张的原因是什么?
  • 那么表格更小,并且可以比单个表格更快地构建。如果您要为每个 deflate 块构建一个可能包含 32,768 个条目的表,则解压缩会更慢。
猜你喜欢
  • 1970-01-01
  • 2023-03-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-10-17
相关资源
最近更新 更多