博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
算法导论16.3-7
阅读量:4614 次
发布时间:2019-06-09

本文共 1188 字,大约阅读时间需要 3 分钟。

假设某一数据文件包含一系列的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,这三个概念确实很绕人,想了解更多请看的解释),这样最后其实和定长编码树是一样的,因此效率也就一样了

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

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

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

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

 

转载于:https://www.cnblogs.com/fstang/archive/2012/12/08/2809011.html

你可能感兴趣的文章
那些年我们扔过的漂流瓶
查看>>
javascript:巧用eval函数组装表单输入项为json对象
查看>>
2.grep、awk、sed、cut处理文本
查看>>
为什么我们叫雪狼队
查看>>
wpf button变成圆角
查看>>
测试开发学习进阶教程 视频&PDF
查看>>
C#基础-连接Access与SQL Server
查看>>
autofac
查看>>
MacOS 系统终端上传文件到 linux 服务器
查看>>
Excel导出POI
查看>>
兼容性
查看>>
自动执行sftp命令的脚本
查看>>
转 Merkle Tree(默克尔树)算法解析
查看>>
网络编程基础之socket编程
查看>>
[转] 利用shell创建文本菜单与窗口部件的方法
查看>>
各种浏览器的user-agent和
查看>>
Restful levels
查看>>
Phonegap移动开发:布局总结(一) 全局
查看>>
Java 变参函数的实现
查看>>
Spring重温(四)--Spring自动组件扫描
查看>>