为什么霍夫曼编码好?

时间:2014-02-18 11:59:23

标签: algorithm data-structures huffman-code

询问霍夫曼编码是如何工作的,相反,我想知道为什么它是好的。

我有以下两个问题:

Q1

我理解Huffman编码的最终目的是为某些char提供更少的位数,因此节省了空间。我不明白的是为什么char的位数决定可能与char的频率有关?

Huffman Encoding Trees

  

使用可变长度代码有时是有利的,其中   不同的符号可以由不同的比特数表示。对于   例如,莫尔斯电码不使用相同数量的点和短划线   对于每个字母的字母。尤其是E,最常见的   字母,用一个点表示。

所以在摩尔斯电码中,E可以用一个点表示,因为它是最常用的字母。但为什么?为什么它只是因为它最常见而成为一个点?

Q2

为什么字符的概率/统计对霍夫曼编码如此重要?

如果统计表错误会发生什么?

7 个答案:

答案 0 :(得分:3)

如果为最常用使用的符号指定较少的数字或位或较短的代码字词,则可以节省大量存储空间。

假设您要为英文字母分配26个唯一代码,并希望根据这些代码存储英文小说(仅限字母),如果为最常出现的字符分配短长度代码,则需要较少的内存。

您可能已经发现重要城市的邮政编码和STD代码通常较短(因为它们经常使用)。这是信息论中非常基本的概念。

霍夫曼编码提供前缀码。

霍夫曼树的建设:

n字符构造霍夫曼树的贪婪方法如下:

在n个子树中放置n个字符。 通过将两个最小权重节点组合成树来开始,该树被分配两个叶节点权重的总和作为其根节点的权重。 这样做直到你得到一棵树。

例如,考虑下面的二叉树,其中E和T具有高权重(非常高的发生率)

enter image description here

这是一个前缀树。要获取任何字符的霍夫曼代码,请从与该字符对应的节点开始并回溯,直到获得根节点。

答案 1 :(得分:2)

事实上,E 可以,例如,三个破折号,然后是两个点。当您进行自己的编码时,您可以做出决定。如果您的目标是对某个文本进行编码以使结果尽可能短,则 应选择最常用字符的短代码。霍夫曼算法确保我们获得特定文本的最佳代码。

如果频率表在某种程度上是错误的,那么霍夫曼算法仍会给你一个有效的编码,但编码的文本会比你使用正确的频率表时更长。这通常不是问题,因为我们通常根据要编码的实际文本创建频率表,因此频率表对于我们要编码的文本将是“完美的”。

答案 2 :(得分:1)

嗯..你想为更频繁出现的符号分配更短的代码...霍夫曼编码只是通过这个简单的假设...: - )

你计算所有符号的频率,对它们进行排序,然后开始为每个符号分配位代码。符号越频繁,你分配给它的代码越短......就这么简单。

最大的问题是:我们计算这些频率的窗口应该有多大?它应该与整个文件一样大吗?还是应该更小?如果后者适用,有多大?大多数霍夫曼编码都有某种“测试运行”,在这种情况下,他们估计最佳窗口大小,就像TCP / IP的窗口大小一样。

答案 3 :(得分:0)

霍夫曼代码有两个好处:

  1. 鉴于某些语料库,它们具有空间效率

  2. 它们是前缀代码

  3. 例如,给定一些文档集,将这些文档编码为霍夫曼代码是对其进行编码的最节省空间的方式,从而节省空间。然而,这仅适用于那组文档,因为您最终得到的代码取决于原始文档集中的标记/符号的概率。统计数据很重要,因为具有最高概率(频率)的符号被赋予最短的代码。因此,最有可能存在于数据中的符号在编码中使用的位数最少,从而使编码更有效。

    前缀代码部分很有用,因为它意味着没有代码是另一个代码的前缀。在例如A = dot dashJ = dot dash dash dash的莫尔斯代码中,您如何知道在哪里打破阅读代码。这增加了使用莫尔斯传输数据的低效率,因为您需要一个特殊符号(暂停)来表示一个代码的传输结束。将其与每个代码唯一的霍夫曼代码进行比较,只要您发现输入中符号的编码,就会知道这是传输的符号,因为它保证为前缀其他一些符号。

答案 4 :(得分:0)

使用最短的比特序列来获得最常用字符的双重效果可以节省成本。

举一个具体的例子,假设你有一段由1024个e个字符和1024个其他字符组成的文本。

代码为8位,即未压缩形式的完整2048字节。

现在假设我们将e表示为单个1位,将每个其他字母表示为0位,后跟其原始的8位(霍夫曼的一种非常原始的形式)。

您可以看到一半的字符已经从8位扩展到9位,给出9216位或1152字节。但是,e字符已从8位减少到1,这意味着它们占用1024位或128字节。

因此使用的总字节数为1152 + 128或1280字节,表示压缩率为62.5%。

您可以使用基于字符的可能频率的固定编码方案(suce as English text),或者您可以使用自适应Huffman编码,在编码字符和调整频率时更改编码方案。虽然前者可能适用于具有高匹配频率概率的输入,但后者可以适应任何输入。

答案 5 :(得分:0)

统计表不能错,因为在一般的霍夫曼算法中,在开头分析孔文本,并建立给定文本的频繁统计,而莫尔斯有一个静态符号 - 代码映射。

霍夫曼算法利用给定文本的优势。例如,如果E是英语中最常用的字母,那么这并不意味着E在给定作者的给定文本中最常见。

霍夫曼算法的另一个优点是,您可以将它用于从[0,1]完成的中国象形文字开始的任何字母表,而莫尔斯仅用于英文字母

答案 6 :(得分:0)

  1. 所以在莫尔斯电码中,“E”可以用一个点表示,因为它是最常用的字母。但为什么?为什么它是一个点因为它的频率?
    “E”可以编码为特定代码字典的任何唯一代码,因此它可以是“0”,我们选择它来缩短以节省内存,因此编码后使用的平均字节最小化。

  2. 为什么字符的概率/统计对霍夫曼编码如此重要?如果统计表错误会发生什么? 我们为什么编码?节省空间吧?编码后使用的空间是freq(wordi)* Length(wordi),这是我们应该尽量减少的,所以我们选择贪婪地分配具有高概率短代码的单词以节省空间。
    如果统计表错误,则编码不是节省空间的最佳方法。