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)仍然成立)。

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

  • 相关阅读:
    火狐浏览器看哪些地方加nofollow
    2017.6.14-网站分析
    2017.6.11-目标关键词优化 三个方面内容
    2017-6-9长尾关键词优化
    2017.6.7seowhy学习笔记---seo知识总纲
    使用 WordPress 自定义字段功能为文章添加下载按钮
    xftp和xshell有什么区别
    决定网站排名的6个干货
    转载:如何在wordpress主题中添加设置页面
    win10+ubuntu双系统安装方案
  • 原文地址:https://www.cnblogs.com/fstang/p/2809011.html
Copyright © 2011-2022 走看看