如何在霍夫曼树下找到权重

问题描述

霍夫曼算法在给定符号权重的情况下得出一棵树。我要相反:给定一棵树,找出一组符号权重,这些符号权重将生成该树一棵树,每个符号的位长相同。

我知道生成同一棵树的有多个权重集,因此我想可以将权重指定为2的幂,并且可以将最长的代码分配为权重1。

(与问题无关,但目的是微调LZ77型压缩算法在内部使用的固定树,以编码偏移量和长度,检查当前位长是否合理,如果不可以,则进行调整)

解决方法

您的想象正确。但是,在执行霍夫曼算法时,两者的幂会导致很多联系。根据关系的确定方式,返回的树的拓扑结构可能与开始的树不同。但是位长都一样。

这里是一个例子:

我将这些频率用于字母:

817     A
145     B
248     C
431     D
1232    E
209     F
182     G
668     H
689     I
10      J
80      K
397     L
277     M
662     N
781     O
156     P
9       Q
572     R
628     S
905     T
304     U
102     V
264     W
15      X
211     Y
5       Z

那给了我这棵树:

original Huffman tree

然后,我根据符号在树中的深度为其分配两个幂的频率:

64      A
16      B
32      C
32      D
128     E
16      F
16      G
64      H
64      I
2       J
8       K
32      L
32      M
64      N
64      O
16      P
1       Q
64      R
64      S
128     T
32      U
16      V
32      W
4       X
32      Y
1       Z

将霍夫曼应用于这一点,我得到了一棵非常不同的树,但是其中的所有符号都具有与以前相同的深度:

new boring,imbalanced Huffman tree

我非常确定,有一种方法可以从下往上分配频率,使接下来的事情增加得足够大,以确保选择正确。这也将导致总体权重低于两个乘方的权重,更接近斐波那契数列。这是一个有趣的问题,所以现在我很想玩这个游戏。

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...