概念
哈夫曼(Huffman)编码算法是基于二叉树构建编码压缩结构的,它是数据压缩中经典的一种算法。算法根据文本字符出现的频率,重新对字符进行编码。因为为了缩短编码的长度,我们自然希望频率越高的词,编码越短,这样最终才能最大化压缩存储文本数据的空间。
哈夫曼二叉树
哈夫曼二叉树是一颗带有权重的二叉树,权重为数据中每个字符出现的频率。并且哈夫曼二叉树权重有低到高遵循从左到右,从下到上(即:权重低的靠左,在最下层)。
构建哈夫曼二叉树
例如:已知一个文件中出现的各字符及其对应的频率如下表所示。
字符 | a | b | c | d | e | f |
---|---|---|---|---|---|---|
频率(%) | 45 | 13 | 12 | 16 | 9 | 5 |
一、初始队列:按字符出现的频率从左到右递增排列。
f | e | c | b | d | a |
---|---|---|---|---|---|
5 | 9 | 12 | 13 | 16 | 45 |
二、合并:由左到右进行合并,依次构建二叉树。
三、重新调整队列:每次合并完成,需对合并后的权重值从新排序,依次类推(所有二叉树叶子均为字符权重值,所有字符权重值均为二叉树叶子)。
哈夫曼编码
我们把二叉树分支中左边的支路编码为0,右边分支表示为1,依次遍历这颗二叉树获取得到所有字符的编码。