比如我们有一段文字"EDEFABAC..."要进行网络传输,一般我们都会选择二进制方式传输,这段文字只包含6个字母:ABCDEF,那么用二进制表示每个字母需要用3位表示,如图:
字母 A B C D E F二进制表示 000 001 010 011 100 101
这段文字中各字母出现频率分别为A 20, B 10, C 15, D 15, E 25, F 15,正好100%。
这样就可以按照赫夫曼树思想来重新规划各个字母的编码,频率即是各个字母的权重,构建赫夫曼树, 并且将左孩子权重改为0,右孩子改为1,得到下图:
然后我们对各个字母重新编码,编码规则为:从根结点到叶子结点经过路径的0和1来编码,重新编码后如下:
字母 A B C D E F二进制表示 10 11110 11111 1110 0 110
将"EDEFABAC"这段文字进行编码的前后比较:
原编码:100011100101000001000010 (24个字符)
新编码:01110011010111101011111 (23个字符)
编码后数据被压缩了,这里大家可以觉得才减少一个字符啊,实际情况不可能只有这几个字符的,一个文本会包含很多的字符,这样就可以被压缩很多空间,更利于数据的传输。
五、总结
以上介绍了赫夫曼树以及其使用场景之一(数据的压缩),赫夫曼树原理还有很多其余用处,学习赫夫曼树更多的是要体会其思想,好了,本篇到此为止,下一篇二叉排序树的介绍以及java代码的实现。