【问题标题】:What is the advantage of a full binary tree for Huffman code?对于霍夫曼代码,完整二叉树的优势是什么?
【发布时间】:2012-09-17 07:46:49
【问题描述】:

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

我想知道为什么全二叉树是这里的最佳选择?换句话说,全二叉树在这里有什么好处?

【问题讨论】:

标签: algorithm tree binary-tree huffman-code


【解决方案1】:

这不是选择,而是等价。

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

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

这相当于一棵搜索树

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

也有非最优霍夫曼码,它们具有不包含输出符号的停止状态/叶节点。这样的二叉树不会

【讨论】:

  • “每个州只有一个条目”是什么意思。您还可以提供一张图片,显示完整的二叉树满足霍夫曼代码解码的所有四个要求。
  • 对于每个节点(除了起点),只有一条边通向它(即没有两个输入符号序列通向同一状态)。
  • 二叉树总是满足前两个(“二叉树” -> 每个内部节点有两个孩子,“树” -> 无循环)。
  • 第三个从第二个开始。如果一个内部节点有一个输出符号,那么你要么需要第三个输入符号来终止这里(例如摩尔斯电码中的暂停),要么你不能从后面的状态输出任何符号而不生成较早的符号(相当于在停止状态下生成两个输出符号的树。
  • 第四个不是霍夫曼代码的要求——它是使霍夫曼代码“最佳”的原因。在最优代码中,位串要么不完整,要么生成输出符号。
【解决方案2】:

反证法:

假设树 T 不是一个完整的二叉树,它为给定的字符及其频率提供最佳的霍夫曼编码。由于 T 不是一棵完全二叉树,因此存在一个节点 N,它只有一个子 C。

让我们用C替换N来构造一个新的二叉树T'。与树T相比,C的叶子节点的深度在T'中减少了1。所以T'提供了比T更好的解决方案,这证明了T不是最优的。

  T                T'

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

【讨论】:

    【解决方案3】:

    您问为什么要使用完整的二叉树。这实际上是三个问题。

    如果您询问“完整”,那么对于任何正确生成的霍夫曼代码,它必须是完整的。

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

    但是,如果您询问的是“树”,则根本不需要将代码表示为树。与树相比,有许多表示不仅可以完整地表示代码,而且可以促进压缩流中更短的表示和更快的解码。

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-03-15
      相关资源
      最近更新 更多