我们刚刚在课堂上开始使用霍夫曼树,我遇到了一些问题。首先给出数据和频率......
Data % / - + *
Frequencies 5 10 25 30 50
创建自定义Huffman树。
我创造了......
120
/ \
50 70
/ \
30 40
/ \
15 25
/ \
5 10
然后用相应的数据替换频率,但我的室友收到了不同的答案?我在这里错了吗?
另外,我似乎无法解决这个问题,
What would the Huffman code look like if all symbols in the alphabet had
equal frequency?
非常感谢任何和所有帮助!
P.S。这些只是学习指导问题,而不是与家庭作业有关。
编辑:我是如何得出答案的:
在树的底部取了5
和10
,将它们加在一起以获得一个"鬼"节点15
。在其右侧添加了25
,因为它更大,然后通过将它们加在一起创建了一个鬼节点40
。将30
放在40
的左侧,因为它较小,然后通过添加两个来创建鬼节点70
。最后将50
添加到70
的左侧,因为它较小,然后通过添加两个来创建最终的鬼节点120
。
答案 0 :(得分:2)
这是我的Huffman.pm
提出的:
0 -- *
10 -- +
110 -- -
1110 -- /
1111 -- %
以上是编码输入字符串的最短符号。 它是一棵树,具有隐含的根:
Root
/ \
0(*) 1
/ \
0(+) 1
/ \
0(-) 1
/ \
0(/) 1(%)
有不同的编码方式,但必须保持一致。 根据{{3}}:
表示某个特定符号的位串永远不是表示任何其他符号的位串的前缀
你的树
120
/ \
50(*) 70
/ \
30(+) 40
/ \
15 25(-)
/ \
5(%) 10(/)
满足这一点,尽管使用不同的编码:
0 *
10 +
1100 %
1101 /
111 -
我们树木不同的原因是因为我的树是wikipedia,这意味着我只需列出其编码(或路径)的符号和长度,以便任何人能够重建霍夫曼代码/树:
*: 1
+: 2
-: 3
/: 4
%: 4
这是因为0
总是终止代码,1
总是意味着至少还会有一个节点,除了最外面的叶子(%
,{{1} }),这是可能的,因为我们知道最大代码长度(树的最大深度)。
答案 1 :(得分:1)
您正确应用了霍夫曼算法,您的树很好,并且它是唯一可能具有这些频率的树。可能有不同的绘制方式,但这些频率的所有正确树将具有完全相同的拓扑。左侧或右侧的内容无关紧要。重要的是每个符号有多少个分支。
有16种不同的方法可以为分支分配位(每个分支0可以在左侧或右侧),因此您可以获得许多不同的代码。然而,它们都是最佳的。如果你的室友代码对于每个符号具有相同的位数,那么无论你如何绘制树木或者如何分配0和1,你都是正确的。