算法导论16.3-7

假设某一数据文件包含一系列的8位字符,且所有256个字符频度都差不多:最大字符频度小于最小字符频度的2倍。证明:这种情况下,赫夫曼编码的效率与普通定长编码就差不多了(原文是:Prove that Huffman coding in this case is no more efficient than using an ordinary 8-bit fixed-length code,这个翻译的……都不像证明题了)

构造一个最小优先队列,将各个字符作为一个只有根结点的子树,加入到队列中,设这个时候各个子树最大频度为MAX,最小的两个频度为MIN1, MIN2(MIN1 <= MIN2),由已知条件,MAX<2 * MIN1,生成的新树频度为MIN1+MIN2 >= 2 * MIN1 > MAX,即新生成的树具有最大的频度,加入优先队列时会被排到队尾。

然后我们考察,“最大字符频度小于最小字符频度的2倍”这个性质在做完这一操作后还是否成立。是的,还是成立的!因为合并后,最小频度变为原来第三小的MIN3,其中MIN3>=MIN2>=MIN1,这时最大频度为MIN1+MIN2,显然MIN1+MIN2<=MIN3+MIN3=2*MIN3

然后我们就在想像这个过程,每次从队头删除两个子树,构成新的子树加到队列末尾,然后就看到,最后生成的赫夫曼树是perfect binary tree(每个结点要么有2个孩子要么没有孩子,且每个叶结点都在同一层。我的理解是:既是full binary tree,又是complete binary tree,这三个概念确实很绕人,想了解更多请看wiki的解释),这样最后其实和定长编码树是一样的,因此效率也就一样了

直觉上,这很容易想,但是要严格证明,还是挺困难的。感觉要用数学归纳法,命题怎么叙述呢?

可以考虑证明下面五个命题:

(1)队列中所有元素都是perfect binary tree

(2)队列中具有最小高度的树的个数是偶数

(3)队列中两个树T1和T2,如果T1的高度H(T1)<T2的高度H(T2),则T1的频度<T2的频度

(4)每次合并操作生成的树具有最大关键字(大于队列中的所有的树)

(5)队列中树的最大频度小于或等于最小频度的2倍

 

表面上,我们只需要证明最后生成的树是perfect binary tree,为什么要证明这么多无关的东西呢?

因为加强归纳假设对于归纳法的递推步骤很有利,这样就有很多可用的资源(因为你可以假设第i次合并之前(1-5)都成立,然后再证合并操作后(1-5)仍然成立)。

说是挺简单,实际证明起来,还是有很多细节要推敲,要给出一个没有缺陷的证明还是很困难的

 

posted @ 2012-12-08 16:08  ttang  阅读(1232)  评论(0编辑  收藏  举报