完整二叉树对霍夫曼代码有什么好处?

时间:2012-09-17 07:46:49

标签: algorithm tree binary-tree huffman-code

我正在研究用于对字符流进行位编码的霍夫曼代码,并读取最佳代码将由完整的二叉树表示,其中每个不同的字符由叶子表示,并且所有内部节点恰好包含两个子节点。

我想知道为什么完整的二叉树是最佳选择?换句话说,完整的二叉树在这里有什么优势?

3 个答案:

答案 0 :(得分:2)

这不是一种选择,而是等同。

最佳霍夫曼码由有限状态机解码,其中

  • 每个州都有两个出口(下一位是 0 1
  • 每个州只有一个条目
  • 包含输出符号的所有状态都是停止状态,
  • 所有停止状态都包含输出符号

这相当于搜索树

  • 所有内部节点都有两个孩子
  • 所有节点都只有一个父
  • 包含输出符号的所有节点都是叶节点,
  • 所有叶节点都包含输出符号

还存在非最优霍夫曼码,其具有不包含输出符号的停止状态/叶节点。这样的二叉树不会完整

答案 1 :(得分:0)

矛盾证明:

让我们说树T不是一个完整的二叉树,它为给定的字符及其频率提供最佳的霍夫曼码。由于T不是完整的二叉树,因此存在仅具有一个子C的节点N.

让我们通过用C替换N来构造新的二叉树T'。与树T相比,C的叶节点的深度在T'中减少1。因此T'提供了更好的解T,这证明了T不是最佳的。

  T                T'

  /\              /\
 .  N            .  C
.  /            .
. C             .

答案 2 :(得分:0)

你问为什么一个完整的二叉树。这实际上是三个问题。

如果您要询问" full",那么对于任何正确生成的霍夫曼代码,它必须已满。

如果您要询问"二进制",霍夫曼代码中遇到的每个位都有两种可能性,0或1,因此每个节点必须有两个分支。

如果您要询问" tree",则根本不需要将代码表示为树。有许多表示不仅完全代表代码,而且还有助于压缩流中的较短表示和更快的解码,而不是树。

示例使用规范的霍夫曼代码,并将其简单地表示为每个比特长度的符号计数,以及相应符号的列表。这在puff.c code中使用。或者,您可以生成一组表,这些表分阶段解码多个位,这些表在zlib's inflate中使用。还有其他人。