霍夫曼树问题

时间:2015-11-20 20:08:49

标签: tree theory huffman-code alphabet

我们刚刚在课堂上开始使用霍夫曼树,我遇到了一些问题。首先给出数据和频率......

 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。这些只是学习指导问题,而不是与家庭作业有关。

编辑:我是如何得出答案的:

在树的底部取了510,将它们加在一起以获得一个"鬼"节点15。在其右侧添加了25,因为它更大,然后通过将它们加在一起创建了一个鬼节点40。将30放在40的左侧,因为它较小,然后通过添加两个来创建鬼节点70。最后将50添加到70的左侧,因为它较小,然后通过添加两个来创建最终的鬼节点120

2 个答案:

答案 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,你都是正确的。