我正在研究用于对字符流进行位编码的霍夫曼代码,并读取最佳代码将由完整的二叉树表示,其中每个不同的字符由叶子表示,并且所有内部节点恰好包含两个子节点。
我想知道为什么完整的二叉树是最佳选择?换句话说,完整的二叉树在这里有什么优势?
答案 0 :(得分:2)
这不是一种选择,而是等同。
最佳霍夫曼码由有限状态机解码,其中
这相当于搜索树
还存在非最优霍夫曼码,其具有不包含输出符号的停止状态/叶节点。这样的二叉树不会完整。
答案 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中使用。还有其他人。