2013年的某个下午,某老师再一次提到哈夫曼编码的问题,而我也再一次想到如何证明哈夫曼编码正确性的问题,我想啦又想,想出来一半,查阅资料后一切OK啊!现总结一下,如果有错误呢,请您温柔的指出来。
先看个实际问题,比如有 A ,B, C, D 4个字母,现在要用它们发送信息,首先就要对它们进行二进制编码,而它们在信息中出现的频度分别为0.5,0.1,0.2,0.2,问:我们应该怎样编码,使得发送的数据量是最小的。
我们把问题转换一下,其实问题就是求构造一颗带权的二叉树,使得各个叶子节点的深度乘以权的和f为最小值。首先假设M是最优的的那颗二叉树,总共有{A,B,C….}n个叶子节点,对应的权为{a,b,c….},F(A,B,C…..)为各个叶子节点的深度乘以权的和为最小值的最优解。
A,B是其中最深的节点,假设它们的权值是所有的权中最小的和第二小的。如果不是,我们可以把C和A对换,显然此时的f会增大a-c,同理我们证得B为第二小。当然我们可能会脑子一热想,为什么A的兄弟就一定是叶子节点呢? 显然如果不是的话,它便不是深度最大啦。
然后我们把AB节点向上合并成AB节点得到树N,此时有等式
F(A,B,C…)=a+b+f(N)
看到这里你是否会想到很像动态规划,或者是贪心法里的最优子结构呢???
那f(n)是不是以节点{AB,C…},权为{a+b,c….}的最优解F(AB,C…)呢?
答案是肯定的!
如果不是的话,则我们取最优解F(AB,C…)的树结构Y,把其中的AB节点点向下分出两个权为a和b的子节点,显然这样的一颗树是原问题的一个解,而且值为a+b+F(AB,C)小于
a+b+f(N),则F(A,B,C…)不是最优解,矛盾!!! 所以f(n)是不是以节点(AB,C…),权为{a+b,c….}的最优解F(AB,C…)。
最后我们可以反复用这两个结论,合并最小的的两个节点,再把两个最小节点的和加入剩下的节点中重复操作,是不是就是和霍夫曼编码的步骤完全吻合呢?
通读下我发现,偶的第一篇博文写的实在不咋地,将就下哈。。。