zoukankan      html  css  js  c++  java
  • 算法导论16.37

    假设某一数据文件包含一系列的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)仍然成立)。

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

  • 相关阅读:
    深入浅出进程与线程的基本概念
    python中with的用法
    浮点型数据在内存中存储的表示
    自问问题列表以及网络答案整理
    看java源代码
    【设计模式】工厂方法
    SQL实现递归及存储过程中 In() 参数传递解决方案
    app与server联系
    添加service到SystemService硬件服务
    noproguard.classes-with-local.dex
  • 原文地址:https://www.cnblogs.com/fstang/p/2809011.html
Copyright © 2011-2022 走看看