使用霍夫曼树解码算法/实现

时间:2013-11-27 18:52:36

标签: c++ algorithm tree huffman-code

从一个如下所示的文本文件开始:

a: 0
b: 100
c: 101
d: 11

0 0 100 100 11 101

所以这会解码:aabbdc

我可以使用哪种解码算法构建一个Huffman树然后用它来解码消息?示例代码也将受到高度赞赏!

这就是我的想法:

  • 创建一个查找表,将每个符号映射到其位
  • 创建根节点
  • 构建树,从编码中读取每个位
    • 如果为0,则创建一个左子。如果1,创造一个合适的孩子
    • 如果到达空间,以某种方式指示一片叶子(左右指针为空)
      • 使用我们读取的位直到该空格并查看这是什么查找表
      • 在该页面插入字符

然后,我可以再次阅读每一位并让它在树中移动。当它到达一个空间时,我会在它到达的叶子处返回角色?

1 个答案:

答案 0 :(得分:2)

输入中没有/不应该有任何空格。你应该得到类似0010010011101的东西。

要创建树,请从每个字符开始,对于每个位,如果它是0则向左移动,如果是1则向右移动(在需要时创建节点) 。当您到达某个字符的末尾时,请将我们所在节点的值设置为该字符。

然后,从树中的根开始查看输入 - 执行与上面相同的操作,但是,而不是创建节点,只需在到达叶子时停止,在该节点输出值并返回到根

示例:

a = 0 - 只需为根创建一个左子项。

  .
 /
a

b = 100 - 向右移动(对于1),然后向左移动(对于0),然后再向左移动(对于0)。

  .
 / \
a   .
   /
  .
 /
b

c = 101 - 向右走,然后向左走,然后向右走。

  .
 / \
a   .
   /
  .
 / \
b   c

d = 11 - 向右走,然后向右走。

  .
 / \
a   .
   / \
  .   d
 / \
b   c

处理输入00100 ...

从根开始。

我们得到0,所以请左转 我们得到一个值为a的叶子,所以输出它并返回到根。

我们得到0,所以请左转 我们得到一个值为a的叶子,所以输出它并返回到根。

我们得到1,所以走吧 我们得到0,所以请左转 我们得到0,所以请左转 我们得到一个值为b的叶子,所以输出它并返回到根。