繁体   English   中英

为什么霍夫曼编码好?

[英]Why Huffman Coding is good?

不是在问霍夫曼编码如何工作,而是想知道为什么它很好。

我有以下两个问题:

Q1

我知道霍夫曼编码的最终目的是给某些字符更少的位数,这样可以节省空间。 我不明白的是,为什么一个字符的位数决定可能与该字符的频率有关?

霍夫曼编码树

有时使用可变长度代码是有利的,在可变长度代码中,不同的符号可以由不同数量的比特表示。 例如,摩尔斯电码对字母表的每个字母不使用相同数量的点和破折号。 特别是,最常见的字母E由一个点表示。

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

Q2

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

如果统计信息表不正确怎么办?

如果为最常用的符号分配较少的数字或位或较短的代码字,则将节省大量存储空间。

假设您要为英语字母分配26个唯一的代码,并想用这些代码来存储英文小说(仅字母),如果您将短长度的代码分配给最常出现的字符,则将需要较少的存储空间。

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

哈夫曼编码给出前缀代码。

霍夫曼树的构建:

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

在n个子树中放置n字符。 首先将两个最小权重的节点合并到一棵树中,然后将两个叶节点权重之和指定为其根节点的权重。 这样做直到得到一棵树。

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

在此处输入图片说明

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

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

如果频率表出现某种错误,则霍夫曼算法仍会为您提供有效的编码,但是编码的文本将比使用正确的频率表时要长。 这通常不是问题,因为我们通常根据要编码的实际文本创建频率表,因此频率表对于要编码的文本将是“完美的”。

好..您想要为出现频率更高的符号分配较短的代码...哈夫曼编码仅在此简单假设下起作用。:-)

您可以计算所有符号的频率,对所有符号进行排序,然后开始为每个符号分配位代码。符号越频繁,分配给它的代码越短..如此简单。

最大的问题是:计算此类频率的窗口应多大? 是否应该与整个文件一样大? 还是应该更小? 如果适用后者,则有多大? 大多数霍夫曼编码都有某种“测试运行”方式,其中它们估计最佳窗口尺寸有点像TCP / IP对其窗口帧尺寸所做的那样。

霍夫曼代码有两个好处:

  1. 考虑到某些语料库,它们是节省空间的

  2. 他们是前缀代码

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

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

这是使用最短的位序列来显示最频繁的字符的双重效果,可为您节省开支。

举一个具体的例子,假设您有一段文本,其中包含1024个e字符和所有其他1024个字符的总和。

由于8位代码,即以未压缩形式使用的完整2048字节。

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

您会看到一半字符已从8位扩展到9位,即9216位或1152字节。 但是, e字符已从8位减少到1位,这意味着它们占用了1024位或128个字节。

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

您可以使用基于字符可能出现的频率的固定编码方案(称为英文文本),也可以使用自适应霍夫曼编码,该编码随着处理字符和调整频率而更改编码方案。 尽管前者可以很好地匹配频率的输入,但后者可以适应任何输入。

统计表不会错,因为在一般的霍夫曼算法中,一开始就分析孔文本,并建立给定文本的频繁统计信息,而莫尔斯则具有静态符号码图。

霍夫曼算法利用了给定文本的优势。 例如,如果E通常是英语中最频繁出现的字母,则并不意味着E在给定作者的给定文本中是最频繁出现的。

霍夫曼算法的另一个优点是,您可以将其用于以[0,1]结尾的中文象形文字开头的任何字母,而摩尔斯仅定义为英语字母

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM