2013年的某个下午,某老师再一次提到哈夫曼编码的问题,而我也再一次想到如何证明哈夫曼编码正确性的问题,我想啦又想,想出来一半,查阅资料后一切OK啊!现总结一下,如果有错误呢,请您温柔的指出来。

   先看个实际问题,比如有 A B C D 4个字母,现在要用它们发送信息,首先就要对它们进行二进制编码,而它们在信息中出现的频度分别为0.50.1,0.2,0.2,问:我们应该怎样编码,使得发送的数据量是最小的。

   我们把问题转换一下,其实问题就是求构造一颗带权的二叉树,使得各个叶子节点的深度乘以权的和f为最小值。首先假设M是最优的的那颗二叉树,总共有{A,B,C….}n个叶子节点,对应的权为{a,b,c….}FA,B,C…..)为各个叶子节点的深度乘以权的和为最小值的最优解。

AB是其中最深的节点,假设它们的权值是所有的权中最小的和第二小的。如果不是,我们可以把CA对换,显然此时的f会增大a-c,同理我们证得B为第二小。当然我们可能会脑子一热想,为什么A的兄弟就一定是叶子节点呢? 显然如果不是的话,它便不是深度最大啦。


哈夫曼编码正确性证明_哈夫曼编码

然后我们把AB节点向上合并成AB节点得到树N,此时有等式

FA,B,C…=a+b+f(N)

看到这里你是否会想到很像动态规划,或者是贪心法里的最优子结构呢???

fn)是不是以节点{AB,C…},权为{a+b,c….}的最优解FAB,C…)呢?

答案是肯定的!

如果不是的话,则我们取最优解FAB,C…)的树结构Y,把其中的AB节点点向下分出两个权为ab的子节点,显然这样的一颗树是原问题的一个解,而且值为a+b+FAB,C)小于

a+b+f(N),则FA,B,C…)不是最优解,矛盾!!! 所以fn)是不是以节点(AB,C…),权为{a+b,c….}的最优解FAB,C…)。

           

哈夫曼编码正确性证明_哈夫曼编码_02哈夫曼编码正确性证明_哈夫曼编码_03

最后我们可以反复用这两个结论,合并最小的的两个节点,再把两个最小节点的和加入剩下的节点中重复操作,是不是就是和霍夫曼编码的步骤完全吻合呢?

 通读下我发现,偶的第一篇博文写的实在不咋地,将就下哈。。。