霍夫曼编码gydF4y2Ba
霍夫曼编码gydF4y2Ba是一种有效的压缩数据而不丢失信息的方法。在计算机科学中,信息被编码为位- 1和位- 0。gydF4y2Ba位字符串的gydF4y2Ba对告诉计算机要执行哪些指令的信息进行编码。电子游戏、照片、电影等等都被编码成计算机中的位串。计算机每秒执行数十亿条指令,而一个电子游戏可能包含数十亿位数据。很容易理解为什么高效和明确的信息编码是计算机科学感兴趣的主题。gydF4y2Ba
霍夫曼编码通过分析信息中某些符号出现的频率,提供了一种有效的、明确的代码。出现频率较高的符号将被编码为较短位的字符串,而使用频率较低的符号将被编码为较长的字符串。由于符号的频率因信息而异,没有一种霍夫曼编码可以适用于所有信息。这意味着发送消息X的霍夫曼编码可能与发送消息y的霍夫曼编码不同。有一种算法用于生成给定消息的霍夫曼编码,基于该特定消息中的符号的频率。gydF4y2Ba
霍夫曼编码通过使用频率排序工作gydF4y2Ba二叉树gydF4y2Ba编码符号。gydF4y2Ba
内容gydF4y2Ba
信息编码gydF4y2Ba
在gydF4y2Ba信息理论gydF4y2Ba,其目标通常是以尽可能少的位元来传输信息,并且每个编码都是明确的。例如,要以尽可能少的位编码A、B、C和D,每个字母都可以编码为“1”。然而,使用这种编码,消息“1111”可能意味着“ABCD”或“AAAA”——这是含糊不清的。gydF4y2Ba
编码可以是固定长度的,也可以是可变长度的。gydF4y2Ba
一个gydF4y2Ba定长编码gydF4y2Ba是每个符号的编码都有相同的位数。例如:gydF4y2Ba
一个gydF4y2Ba 00gydF4y2Ba BgydF4y2Ba 01gydF4y2Ba CgydF4y2Ba 10gydF4y2Ba DgydF4y2Ba 11gydF4y2Ba 一个gydF4y2Ba变长编码gydF4y2Ba符号可以用不同的位数进行编码。例如:gydF4y2Ba
一个gydF4y2Ba 000gydF4y2Ba BgydF4y2Ba 1gydF4y2Ba CgydF4y2Ba 110gydF4y2Ba DgydF4y2Ba 1111gydF4y2Ba
解释为什么下面的编码方案是糟糕的编码。gydF4y2Ba
一个gydF4y2Ba BgydF4y2Ba CgydF4y2Ba DgydF4y2Ba 0gydF4y2Ba 1gydF4y2Ba 11gydF4y2Ba 10gydF4y2Ba
让我们尝试一些编码:gydF4y2Ba
- 编写消息BAC的二进制编码。gydF4y2Ba 1011gydF4y2Ba
- 编写消息DC的二进制编码。gydF4y2Ba 1011gydF4y2Ba
- 编写消息的二进制编码DDC。gydF4y2Ba 101011gydF4y2Ba
- 编写消息BADBB的二进制编码。gydF4y2Ba 101011gydF4y2Ba
正如您可以从上面的消息编码中看到的,在某些情况下,相同的二进制字符串编码不同的消息。这种编码方案是二义性的,因为在我们对一条消息进行编码后,它的二进制表示并不只针对那条消息。例如,使用上面的编码,“BB”被编码为“11”,但“11”也是“C”的编码。gydF4y2Ba
下面的编码是无二义性的,但是效率很低,因为存在对这些字母的较短(且仍然无二义性)编码。给出一个等价的但更短的编码。gydF4y2Ba
一个gydF4y2Ba BgydF4y2Ba CgydF4y2Ba DgydF4y2Ba 0000gydF4y2Ba 0101gydF4y2Ba 1010gydF4y2Ba 1111gydF4y2Ba
每个字母都有相同数量的比特来编码它。因此,我们知道每一个gydF4y2Ba 字符串中的位将对字母进行编码。与上面的示例(使用可变长度编码)不同,我们不必担心歧义,因为每个字母都有一个相同长度的唯一二进制赋值。例如,如果B被编码为1和C编码为11,看到一个消息我们不知道如果发送方打算发送BB或C .上面的固定长度编码中,不可能重叠编码:0000总是会被解读为一个,1010总是会解读为C。gydF4y2Ba
然而,这些编码的长度是所需长度的两倍:因为4位编码只是重复的相同的2位编码,所以存在冗余信息。gydF4y2Ba
代表gydF4y2Ba 符号,我们需要gydF4y2Ba 位,因为每个位有两个可能的值:1或0。因此,与gydF4y2Ba 我们可以表示比特gydF4y2Ba 不同的符号。gydF4y2Ba
这个问题已经gydF4y2Ba 符号,所以我们只需要gydF4y2Ba 来做这个。因此,我们的编码方式如下:gydF4y2Ba
一个gydF4y2Ba BgydF4y2Ba CgydF4y2Ba DgydF4y2Ba 00gydF4y2Ba 01gydF4y2Ba 10gydF4y2Ba 11gydF4y2Ba
需要多少位来表示gydF4y2Ba 不同的符号(使用固定长度编码)?gydF4y2Ba
代表gydF4y2Ba 固定长度编码的符号,gydF4y2Ba 需要位,因为每个位有两个可能的值:1或0。因此,与gydF4y2Ba 位,gydF4y2Ba 可以表示不同的符号。gydF4y2Ba
霍夫曼编码gydF4y2Ba
霍夫曼代码是一种编码信息的方法,使用可变长度的字符串来表示符号,这取决于它们出现的频率。其理念是,使用频率较高的符号应该较短,而出现频率较低的符号可以较长。通过这种方式,平均而言,对给定消息进行编码所需的比特数将比使用固定长度的代码更短。在包含许多稀有符号的消息中,可变长度编码产生的字符串可能比固定长度编码产生的字符串长。gydF4y2Ba
如上述部分所示,对编码方案是明确的。由于可变长度编码易于模糊,因此必须注意生成避免模糊性的方案。霍夫曼编码使用gydF4y2Ba贪婪算法gydF4y2Ba建立一个前缀树,优化编码方案,使最常用的符号具有最短的编码。描述编码的前缀树确保任何特定符号的代码永远不是表示任何其他符号的位串的前缀。为了确定一个符号的二进制赋值,让树的叶子对应这些符号,赋值将是从树的根到叶子的路径。gydF4y2Ba
从下面的霍夫曼树中我们得到了什么编码?gydF4y2Ba
象征gydF4y2Ba | 编码# 1gydF4y2Ba |
一个gydF4y2Ba | 0000gydF4y2Ba |
BgydF4y2Ba | 01gydF4y2Ba |
CgydF4y2Ba | 101.gydF4y2Ba |
DgydF4y2Ba | 1gydF4y2Ba |
EgydF4y2Ba | 0000gydF4y2Ba |
象征gydF4y2Ba | 编码# 2gydF4y2Ba |
一个gydF4y2Ba | 1gydF4y2Ba |
BgydF4y2Ba | 01gydF4y2Ba |
CgydF4y2Ba | 001gydF4y2Ba |
DgydF4y2Ba | 0001gydF4y2Ba |
EgydF4y2Ba | 0000gydF4y2Ba |
象征gydF4y2Ba | 编码# 3gydF4y2Ba |
一个gydF4y2Ba | 1gydF4y2Ba |
BgydF4y2Ba | 1gydF4y2Ba |
CgydF4y2Ba | 1gydF4y2Ba |
DgydF4y2Ba | 1gydF4y2Ba |
EgydF4y2Ba | 0gydF4y2Ba |
霍夫曼编码算法获取关于特定符号出现的频率或概率的信息。它开始从底部向上构建前缀树,从列表中可能性最小的两个符号开始。它获取这些符号并形成包含它们的子树,然后从列表中删除单个符号。该算法将子树中元素的概率加和,并将子树及其概率添加到列表中。接下来,算法搜索列表,选择概率最小的两个符号或子树。它使用这些来创建一个新的子树,从列表中删除原始的子树/符号,然后将新的子树及其组合概率添加到列表中。这样重复,直到有一个树和所有的元素已经添加。gydF4y2Ba
给出下面的概率表,创建一个霍夫曼树来编码每个符号。gydF4y2Ba
象征gydF4y2Ba 概率gydF4y2Ba 一个gydF4y2Ba BgydF4y2Ba CgydF4y2Ba DgydF4y2Ba EgydF4y2Ba 概率最小的两个元素是D和e,所以我们创建子树:gydF4y2Ba
并更新列表以包含概率为的子树DEgydF4y2Ba
象征gydF4y2Ba 概率gydF4y2Ba 一个gydF4y2Ba BgydF4y2Ba CgydF4y2Ba 德gydF4y2Ba 接下来的两个最小概率是DE和C,所以我们创建子树:gydF4y2Ba
并更新列表以包含子树CDE的概率为gydF4y2Ba
象征gydF4y2Ba 概率gydF4y2Ba 一个gydF4y2Ba BgydF4y2Ba CDEgydF4y2Ba 接下来的两个最小概率是A和B,所以我们创建了子树:gydF4y2Ba
然后更新这个列表,以包含子树AB的概率为gydF4y2Ba
象征gydF4y2Ba 概率gydF4y2Ba ABgydF4y2Ba CDEgydF4y2Ba 现在,我们只剩下两个元素了,所以我们构建子树:gydF4y2Ba
ABCDE的概率是gydF4y2Ba ,这是预料之中的,因为其中一个符号将会出现。gydF4y2Ba
下面是我们从树中得到的编码:gydF4y2Ba
象征gydF4y2Ba 编码gydF4y2Ba 一个gydF4y2Ba 11gydF4y2Ba BgydF4y2Ba 10gydF4y2Ba CgydF4y2Ba 01gydF4y2Ba DgydF4y2Ba 001gydF4y2Ba EgydF4y2Ba 000gydF4y2Ba
霍夫曼编码算法gydF4y2Ba
列出一些符号和它们的可能性。gydF4y2Ba
选择两个概率最小的符号(如果多个符号具有相同的概率,则任意选择两个)。gydF4y2Ba
使用这两个符号中的二进制树,用“0”用“1”标记一个分支,并具有“0”。It doesn't matter which side you label 1 or 0 as long as the labeling is consistent throughout the problem (e.g. the left side should always be 1 and the right side should always be 0, or the left side should always be 0 and the right side should always be 1).
将这两个符号的概率相加,得到新子树的概率。gydF4y2Ba
从列表中移除符号并将子树添加到列表中。gydF4y2Ba
回到列表中,选择概率最小的两个符号/子树,并将它们组合成一个新的子树。从列表中移除原始的符号/子树,并将新的子树添加到列表中。gydF4y2Ba
重复,直到所有的元素被组合起来。gydF4y2Ba
霍夫曼编码对于单个字符的编码是最优的,但是对于一个编码的多个字符的编码,其他的压缩方法更好。并且,当每个输入符号是一个已知的独立的、同分布的随机变量并具有gydF4y2Ba概率gydF4y2Ba这是2的幂的倒数。gydF4y2Ba[1]gydF4y2Ba
另请参阅gydF4y2Ba
参考gydF4y2Ba
- , .gydF4y2Ba霍夫曼编码gydF4y2Ba.2016年7月20日,从gydF4y2Bahttps://en.wikipedia.org/wiki/Huffman_codinggydF4y2Ba