重新插入队列时-Huffman代码

时间:2018-12-14 20:55:58

标签: huffman-code

示例

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'中间

是我的选择还是有规则?

2 个答案:

答案 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位。