【发布时间】:2015-04-12 17:08:35
【问题描述】:
我真的在为在霍夫曼编码中合并具有相同“权重”的树的顺序而苦苦挣扎。我查看了很多资料,但所有资料似乎都只涵盖“简单案例”,即不超过两个具有相同权重的元素,或者根本不涵盖整个主题。
假设我有以下要编码的字符串:ABCDEE。 (样式基于this website)
所以我有:
FREQUENCY VALUE
--------- -----
1 A
1 B
1 C
1 D
2 E
我现在开始用两个最小的元素构建树:
问题 1) 我必须使用 A & B 还是我如何决定应该使用哪些值?我知道他们必须是最小的,但除此之外呢?例如。 A & D ?
这很重要,因为最后(可以说我做了以下事情:)
2:[A&B] 2:[B&C]
/ \ / \
1:A 1:B 1:B 1:C
还有下表:
FREQUENCY VALUE
--------- -----
2 [A&B]
2 [C&D]
2 E
问题 2) 再次...我应该按什么顺序合并树?例如。 [A&B]&E 或 [A&B]&[C&D]
因为,如果我先合并[A&B]&E,树会是这样的:
4:[A&B&E]
/ \
2:[A&B] 2:E
/ \
1:A 1:B
(问题3)以及如何判断2:E应该在左边还是右边?)
加入[C&D] 后,最终的树看起来像这样:
6:[A&B&C&D&E]
/ \
2:[C&D] 4:[A&B&E]
/ \ / \
1:C 1:D 2:[A&B] 2:E
/ \
1:A 1:B
但是如果我从加入[A&B]&[C&D]开始:
4:[A&B&C&D]
/ \
2:[A&B] 2:[C&D]
/ \ / \
1:A 1:B 1:C 1:D
然后加入E,最终的树是这样的:
6:[A&B&C&D&E]
/ \
E:2 4:[A&B&C&D]
/ \
2:[A&B] 2:[C&D]
/ \ / \
1:A 1:B 1:C 1:D
所以在第一个变体中E 将是11,在第二个变体中0。或者作为另一个例子,C 是 00 而不是 110...
我认为这里一定缺少一条基本规则,因为霍夫曼编码必须是确定性的(才能正确解码),不是吗!?
【问题讨论】:
-
所有问题的一般答案:合并顺序并不重要,您可以选择任何顺序,这只会影响分配给这个或那个符号的位序列,但是:a)压缩文件将有大小相同。 b) 解压后的文件与原始文件相同(压缩前)。
-
...所以你必须用编码字符串给出确切的树?因为否则很多树“可能”用于解码并给出错误的结果,对吧?
-
最简单的解决方案:在编码和解码端使用相同的算法。由于所有计算机算法都是确定性的,因此您将从相同的输入数据向量在两侧生成相同的树。
标签: algorithm encoding tree compression huffman-code