【问题标题】:Encode Huffman table with text用文本编码 Huffman 表
【发布时间】:2017-06-03 02:39:16
【问题描述】:

我有一个实现霍夫曼编码来编码文本的代码。

鉴于以下文字

abbccc

我的程序生成下表

a -> 00
b -> 01
c -> 1

所以编码后的文本(位数组)是

000101111

问题是:我需要将表格与文本一起编码,但我不知道推荐的方法是什么。

到目前为止我的想法:

  • 第一个字节是表中键值对的数量N
  • 接下来的 N*2 字节是键值对本身(一个字节为键,一个字节为值)
  • 剩余位是编码文本本身

您能否为此建议我一些更灵活但更便宜(低内存使用)的方法?

【问题讨论】:

  • 我很确定 DEFLATE 算法使用 Huffman 编码。你可以看看他们是如何做到的。警告文档有点密集且难以理解。我还没有弄明白。几年前我记得,如果你按照一定的程序来构建霍夫曼树,然后以某种排序顺序存储 KVP,就会有一个唯一的表示,这使得存储表非常紧凑。 ietf.org/rfc/rfc1951.txt
  • 如果您想以尽可能小的尺寸存储表格(您并没有真正说出“便宜”的含义),然后查找规范的霍夫曼代码。对于初学者,en.wikipedia.org/wiki/Canonical_Huffman_code。我认为这就是@ithenoob 正在讨论的内容?
  • @Gene:我特别指的是 DEFLATE 管理其字典的方式,我相信它也以某种神秘的方式被压缩。但是,您链接到的维基百科页面似乎更有希望,因为它更具可读性并且明确指出将讨论紧凑的霍夫曼表示。
  • @Gene,“便宜”是指内存。我编辑了我的问题以使其清楚。感谢您指出这一点。
  • @ithenoob,我会尽快阅读此规范,谢谢。

标签: data-structures language-agnostic huffman-code


【解决方案1】:

Deflate RFC1951 将 Huffman 表存储在压缩数据的前面。请参阅第 3.2.7 节。您不需要存储代码(在您的情况下为 00,01,1),而是存储它们的长度(即 2,2,1)。第 3.2.2 节描述了在解压缩时如何将这些长度转换回代码。该表由您将拥有的所有符号的长度序列描述,在您的小示例中,它将类似于 0,0,0,...,2,2,1,....0。零表示这些符号不会出现在文件中,除了长度为 2、2、1 的 a、b、c 之外。为了使这个长度表紧凑,您可以进行游程长度编码。在 Deflate(第 3.2.7 节)中,长度符号 18(n) 将长度为 0 的序列编码 n 次。下一个问题是如何编码长度符号'18'?您可以使用 5 位代码来表示 0 到 18 的长度符号,以使其更简单。或者您也可以使用 Huffman 对它们进行编码,例如使用 Deflate 所做的 0-7 位代码。

【讨论】:

    猜你喜欢
    • 2022-06-15
    • 2019-04-12
    • 2018-12-27
    • 2010-12-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多