【问题标题】:Decoding algorithm/implementation using Huffman tree使用霍夫曼树的解码算法/实现
【发布时间】:2013-12-13 13:55:17
【问题描述】:

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

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

0 0 100 100 11 101

所以这会解码:aabbdc

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

这就是我的想法:

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

然后,我可以再次读取每个位并让它在树中移动。当它碰到一个空格时,我会在它到达的叶子处返回字符吗?

【问题讨论】:

  • 写代码看看会发生什么
  • 用空格分隔代码消除了解码中的所有复杂性,并且确实消除了代码无前缀的需要。此外,如果您对 Huffman 编码很认真,请查看基于表的解码。

标签: c++ algorithm tree huffman-code


【解决方案1】:

输入中没有/不应该有任何空格。你应该得到类似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的叶子,所以输出它并返回到根。

【讨论】:

    猜你喜欢
    • 2014-03-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-06-16
    • 2018-03-02
    相关资源
    最近更新 更多