用霍夫曼表重建霍夫曼树

时间:2012-12-16 16:04:45

标签: c++ huffman-code

我编写了一个程序来编写一篇关于霍夫曼代码的文章并输出一个代码表。

H:000
d:1011
e:100
l:11
o:01
r:1010
w:001
Total bits:27
Encoded code:000100111101001011010111011

我想编写一个程序,将文件作为输入并对其进行解码。

但我不知道如何重建它。

我的问题是如何重生霍夫曼树?

2 个答案:

答案 0 :(得分:3)

  

我的问题是如何重生霍夫曼树?

它将是一棵二叉树。创建根节点,并将代码以0开头的所有字母放入左子树,将以1开头的字母放入右子树。冲洗并重复(递归),删除每个代码的第一个数字。一旦你的任何特定代码中的数字用完,就为相应的字母创建一个叶子节点。

答案 1 :(得分:3)

如果代码是以规范方式构造的,则不需要重建霍夫曼树,这使得较短的代码在数字上小于较长的代码。有许多方法可以任意地将0和1分配给霍夫曼二叉树的每个分支,并且所有方法都产生相同的代码最优性。选择众多选择中的一个提供了解码和传递代码的优势。

霍夫曼算法所需的唯一信息是代码长度,即每个符号的位数。就这样,可以构造一个典型的霍夫曼码从较短的码前进到较长的代码,和任何给定的码长度(在次H例如排序所有的长度为3码,E,W)内的排序词法顺序的符号。在代码长度内进行排序的目的是减少要发送到接收器的数据量,以便重构代码。

然后你会得到这个替代代码:

l:00
o:01
H:100
e:101
w:110
d:1110
r:1111

现在可以使用两个简单的表来完成解码,一个表只是那些符号,即“loHewdr”,以及您升级到下一个代码长度的代码值。步骤为0000,从1到2位,1000到3位,1110到4位。您为最长的代码读取了足够的位(如果需要,最后添加零,但不要在后续步骤中将它们用作代码的开头)。然后,如果该值小于下一个代码长度的开始值,则使用该值作为表的索引,同时考虑代码中的当前位数。否则,将值的数量添加到索引的下一个值,然后检查下一步。计算跳过的值的数量还需要跟踪当前步骤中代码中的位数。

解码符号后,您就知道它有多少位。从流中删除这些位并重复。

这种方法还具有最短的代码的优势,这是最常见的。由此产生的解码速度非常好。 (还有其他表驱动的方法更快,但它们要复杂得多。)