示例
3 2 5 5
a b c d
加入前两个
5 | 5 5
3 2 | c d
a b |
我必须将五棵新树放入队列中 我有义务像这样把它放在最后吗?
5 5 5
c d / \
3 2
a b
或者我可以放在开头吗?
5 5 5
3 2 c d
a b
甚至在'c'和'd'中间
是我的选择还是有规则?
答案 0 :(得分:0)
这不是您的选择,需要始终对Queue进行排序(根据出现的次数进行排序,并且如果出现的次数等于树的深度,则进行排序)。因此,需要将其插入到订单所属的位置。
需要这样做以选择出现次数最少的子树,如果可以选择,则只需弹出它们即可选择其中最浅的子树。
如果您只是在每次插入后都求助(这是低效率的,不应该这样做),则位置显然无关紧要。
答案 1 :(得分:0)
是的,这是您的选择。无论哪种方式,即使两个结果代码可能明显不同,您都将获得最佳的霍夫曼代码。
您可以获得:
a - 00
b - 01
c - 10
d - 11
或者您可以获得:
a - 111
b - 110
c - 10
d - 0
现在,如果我将每个符号中的位数乘以出现次数,就会得到第一个代码:2 * 3 + 2 * 2 + 2 * 5 + 2 * 5 = 30位。对于第二个代码:3 * 3 + 3 * 2 + 2 * 5 + 1 * 5 = 30位。因此,这两种代码都可以将原始消息精确地编码为30位。