贪婪技术之 huffman编码树

      不同于对字符使用定长编码,huffman编码法使用“频繁出现的字符占用更短的位数,不频繁出现的字符占用更长的位数”的方法,来实现编码压缩。

      首先对于text中的所有字符,我们统计每个字符出现的频率,例如:

      huffman算法描述:

      第一步,初始化n个单节点的树(森林),为它们标上字母表中的字符,并把每个字符的频率都记在树的根中,用来指出树的权重。

      第二步,重复以下步骤,当森林中只剩下一颗树时,算法结束。找到两棵权重最小的树,把它们作为左右子树,构建一棵新的树,然后新的树的权重为两棵子树权重之和。

      画图表示:

 

      至此,我们就构造出了一颗二叉huffman树。现在我们让每个节点的左边子树为0,右边子树为1,则当一个字符在某一个叶子时,huffman树根到该叶子的路径所构成的编码,就是该字符的huffman编码。

      例子中每个字符对应的编码为

 

      明显,在huffman编码下,每个字符的编码都不可能是另一个字符的编码的前缀。因此,只要保存了huffman编码树,就能保证在变长编码下,能顺利解码。从而,huffman编码能有效实现文本信息的压缩。

      因为huffman编码树建树的过程,选择的都是最小的频率的两个字符,因此huffman编码方法是一种使编码长度最短的方法。

posted @ 2015-11-13 09:56  斑鱼  阅读(374)  评论(0编辑  收藏  举报