C++ 基于哈夫曼树的解码算法/实现
从如下所示的文本文件开始:C++ 基于哈夫曼树的解码算法/实现,c++,algorithm,tree,huffman-code,C++,Algorithm,Tree,Huffman Code,从如下所示的文本文件开始: a: 0 b: 100 c: 101 d: 11 0 0 100 100 11 101 所以这将解码:aabbdc 我可以使用什么解码算法来构建哈夫曼树,然后使用它来解码消息?示例代码也将非常感谢 以下是我的想法: 创建将每个符号映射到其位的查找表 创建根节点 要构建树,请从编码的 如果为0,则创建左子级。如果为1,请创建正确的子级 如果已到达空格,则以某种方式指示一个叶(空的左指针和右指针) 使用我们读取的位,直到那个空间,然后看看这是什么查找表 在该叶子
a: 0
b: 100
c: 101
d: 11
0 0 100 100 11 101
所以这将解码:aabbdc
我可以使用什么解码算法来构建哈夫曼树,然后使用它来解码消息?示例代码也将非常感谢
以下是我的想法:
- 创建将每个符号映射到其位的查找表
- 创建根节点
- 要构建树,请从编码的
- 如果为0,则创建左子级。如果为1,请创建正确的子级
- 如果已到达空格,则以某种方式指示一个叶(空的左指针和右指针)
- 使用我们读取的位,直到那个空间,然后看看这是什么查找表
- 在该叶子处插入字符
然后,我可以把每一点都读一遍,让它在树上移动。当它碰到空格时,我只会返回它到达的叶子处的字符?输入中没有/不应该有空格。您应该得到类似于
0011101
的内容
要创建树,请从每个字符的根开始,对于每个位,如果是0
,则向左,如果是1
,则向右(在需要时创建节点)。当到达某个角色的末尾时,将我们所在节点的值设置为该角色
然后,从树中的根开始遍历输入-执行与上面相同的操作,但是,不要创建节点,而是在到达叶子时停止,在该节点处输出值并返回根
.
/
a
示例:
a=0
-只需为根目录创建一个左子目录
.
/
a
b=100
-向右(对于1
),然后向左(对于0
),然后再次向左(对于0
)
c=101
-向右走,然后向左走,然后向右走
.
/ \
a .
/
.
/ \
b c
.
/ \
a .
/ \
. d
/ \
b c
d=11
-向右走,然后向右走
.
/ \
a .
/
.
/ \
b c
.
/ \
a .
/ \
. d
/ \
b c
处理输入时00100
从根开始
.
/
a
我们得到一个0
,所以向左走。我们得到一个叶子,它的值是
a
,所以输出它并返回到根
.
/
a
我们得到一个0
,所以向左走。我们得到一个叶子,它的值是
a
,所以输出它并返回到根
.
/
a
我们得到了一个1
,所以向右走。我们得到一个
0
,所以向左走。我们得到一个
0
,所以向左走。我们得到一个值为
b
的叶子,因此输出它并返回根。编写代码,看看会发生什么。用空格分隔代码消除了解码的所有复杂性,并且确实消除了代码无前缀的需要。此外,如果您对哈夫曼编码很认真,请查找基于表的解码。
.
/
a