对霍夫曼树感到困惑

时间:2010-06-08 01:10:28

标签: java huffman-code

A quick tutorial on generating a huffman tree

对霍夫曼树感到困惑。在上面的链接的末尾附近,它显示剩下2个元素的树,然后是完成的树。我对它的分支方式感到困惑。霍夫曼树需要分支的特定方式吗?

例如,57:*及其右子35:*分支到右侧。它可能是35分支到左边,22分支到右边?另外,为什么不是22:*与15:4配对 - 它只是与20:5配对以创建一棵新树。

从最初的观察开始,似乎树不需要平衡或具有任何特定顺序,除了叶子的频率加起来父节点的值。创建具有相同数据的霍夫曼树的两个人最终会得到不同的编码值吗?

3 个答案:

答案 0 :(得分:6)

到目前为止,这些帖子都是错误的和误导性的:选择具有相同权重的树叶很重要,它们确实会改变它们压缩数据的程度。

这是一个反例,演示了不同的选择如何导致不同的压缩率: ABBBCCCDDDDEEEEEEEE

A:1,B:3,C:3,D:4,E:8。 第一步:取A和B组成一个权重为4的节点。 第二步:

如果你在C的第一步中使用新创建的节点,那么你得到了 (19 (11 (7 (4 (1-A) (3-B)) (3-C)) (4-D)) (8-E)),它提供37位压缩数据。

另一方面,如果你拿D,它也有重量4,而不是新创建的节点,你得到 (19 (11 (4 (1-A) (3-B)) (7 (3-C) (4-D))) (8-E)),它提供41位压缩数据。

答案 1 :(得分:4)

霍夫曼树的关键是:

  

按频率对此列表进行排序,并将两个最低元素放入树叶

如果您有两个以上具有最低频率的元素(例如3,4,4 ...),则任何两个元素都会执行(3和4s中的任何一个 - 而不是两个4)。此外,将这些最低元素中的哪一个指定为0并且哪个为1并不重要。这两个事实允许从相同数据产生不同但有效的霍夫曼编码。

霍夫曼树应该通过频率而不是节点数来平衡。因此,以下是平衡的:

(100 (50 (25 (12 (12 1)))))

而这不是:

(((100 50) 25) ((12 12) 1)))

特别是在你的问题中,15与20而不是22配对,因为15和20是两个最低的剩余值(均低于22)。分支(左或右)可以很好,只要它是一致的(在同一算法中总是小 - 左或总是小 - 右,以便可以在另一端重建编码)。

答案 2 :(得分:2)

页面上解释了所有内容。 22:*未与15:4配对,因为在每个步骤中,组合了具有最低元素的两个节点。这会创建一个独特的订单。

霍夫曼代码可以不同(如果您有多个具有相同频率的值或交换0和1左/右表示),但霍夫曼长度不能。

分支左/右只是如何绘制树或代表它的图形,所以这没关系。