代码改变世界

为什么Huffman编码不会发生冲突

2014-06-14 11:55  Lava Hammer  阅读(468)  评论(0编辑  收藏  举报

关于Huffman编码,这里有一篇漂亮的介绍 http://coolshell.cn/articles/7459.html

似乎介绍Huffman编码的都会有一句“Huffman编码不会发生冲突,即不存在某个编码是另一个编码的前缀”。但是也似乎都没有解释为什么。

细细想明白了之后,觉得似乎又没什么深奥的原理。废话少说,上图。

以上面的图为例子,我们假设这是一个生成Huffman编码的二叉树。

1)所谓的Huffman编码其实就是各个叶节点的路径编码。比如节点H就是010(用左0,右1的规则)

2)二叉树实际上可以是二进制编码的图形展开形式。如果仅考虑上图前三层,作为一个满三层二叉树,其实其所有子节点路径表示了2位二进制数字的所有可能。

3)如果Huffman编码存在冲突,即某个编码是另一个编码的前缀。那么某个编码所表示的节点一定在另一个编码的路径上,因此某个编码所表示的节点必然不是叶节点。比如F节点的编码为10,J和K节点的编码分别为100和101。

4)因为Huffman编码中表示的所有节点都一定在叶节点上,所以一定不会出现3)中所描述的情况。证毕。

仔细思考发现,其实这个道理并不复杂,为啥不能第一反应发现这个原理呢?我觉得我以前都只觉得二叉树只是一种方便查询而设计的数据结构而没有意识到其实二叉树还可以是二进制编码的图形展开形式吧。