计算机里每个字符在没有压缩的文本文件中由一个字节(如常见的ASCII码)或两个字节(如Unicode)表示。这些方案中,每个字符需要相同的位数。有很多的数据压缩的方法。对文本来说,最常用的方法是减少表示最常用字符的位数量。但有个规则:每个代码都不能是其他代码的前缀。使用哈夫曼编码可以满足条件。
创建哈夫曼树:
1、为消息中的每个字符创建一个TreeNode对象。每个节点有两个数据项:字符和字符在消息中出现的频率。
2、为这些节点创建Tree对象,这些节点就是树的根。
3、把这些树都插入到一个优先级队列中。它们按频率排序,频率最小的节点有最高的优先级。
现在做下面的事:
1、从优先级队列中删掉两棵树,并把它们作为一个新节点的子节点。新节点的频率是子节点频率的和,它的字符字段可以是空的。
2、把这个新的三节点树插回到优先级队列里。
3、反复重复第一部和第二步。树会越变越大,队列中的数据项会越来越少。当队中只有一棵树时,它就是所建的哈夫曼树了。
创建哈夫曼编码:
从哈夫曼树的根开始并顺着哈夫曼树沿一条可能的路径到达叶节点。在顺着树往下走时,记录向左和向右的顺序,向左的边用0表示,向右的边就用1表示。到达某个叶子节点后,0和1的序列就是这个字符的哈夫曼编码。把这个代码插入代码表的正确位置就可以了。
哈夫曼解码:
每个字符都从根开始。如果遇到0,就向左走到下个节点,如果遇到1,就向右。最后到叶节点,就找到这个字符了。