哈夫曼树简单应用

182 阅读2分钟

定义:

哈夫曼树就是最优二叉树,带权路径长度达到最小的二叉树。

之前读软工本科时,我一直不理解这玩意有啥用,直到我看了电影《天才枪手》。

image.png

如何压缩传递数据?

女主传递答案,用的是不同钢琴手势传递ABCDE。如果换成声音二进制呢?敲桌子是1,踩地板是0。如何通过最小的敲击属来传递答案呢?假设ABCDE的频次按上所描。

image.png

方法一:

如果我把每个字母定义为等长3位那么ABCDE 分别是000 001 010 011 100

image.png

需要17*3 = 51 敲51下。

方法二:

如果我省略掉0呢?那么就是不等长位,传递频次高的编码肯定要短。这样的情况才是传递最少的。 image.png。 ABCDE 分别是0 1 10 11 100 image.png

但这样在传递的过程中,会出现 101是BAB还是CA呢?这个呢就是二义性,信息有误。当然你再设计一个终止符就是另外一个事情了。

方法三:

我又想尽量少地传值,又不想有二义性。那么该咋办呢?首先,传递频次高的编码肯定要短。这样的情况才是传递最少的。

哈夫曼树就是最优二叉树,带权路径长度达到最小的二叉树。那么同时为了避免二义性。

image.png 所有的字符都在叶子节点避免了二义性,ABCDE 分别是0 10 110 1111 1110。

哈夫曼树的构造方式:

每次把权值最小的两二叉树合并,左节点比右节点小。

那么传递数量为81+42+23+14+2*4=8+8+6+4+8=34

总结

哈夫曼树就是用来解决无二义性的最小带权长度问题的。