哈夫曼树和哈夫曼编码

哈夫曼树

哈夫曼树是一种带权路径长度最短的二叉树,也称最优二叉树:

哈夫曼树和哈夫曼编码_第1张图片
哈夫曼树和哈夫曼编码_第2张图片
它们的带权路径长度为:
图a:WPL = 5 * 2 + 7 * 2 + 2 * 2 + 13 * 2 = 54 图b:WPL = 5 * 3 + 2 * 3 + 7 * 2 + 13 * 1 = 48
可见,图b的带权路径长度较小,图b就是哈夫曼树(最优二叉树)

构建哈夫曼树

  1. 将所有左、右子树都为空的节点作为根节点。
  2. 在森林中选出两棵根节点的权值最小的树作为一棵新树的左、右子树,并更新新树的附加节点的权值为左、右子树上根节点的权值之和。(左子树权值应小于右子树权值)
  3. 从森林中删除这两棵树,同时把新树加入到森林中。
  4. 重复2、3步,直到森林中只有一棵树为止,此树便是哈夫曼树。
    图解建树过程
    哈夫曼树和哈夫曼编码_第3张图片
    哈夫曼树和哈夫曼编码_第4张图片
    哈夫曼树和哈夫曼编码_第5张图片
    哈夫曼树和哈夫曼编码_第6张图片

哈夫曼编码

利用哈夫曼树求得的用于通信的二进制编码称为哈夫曼编码. 树中,从根到每个叶子节点都有一条路径,对路径上各分支约定指向左子树的分支表示“0”码,指向右子树的分支表示“1”码,取每条路径上的“0”或“1”的序列作为各个叶子节点对应的字符编码,称为哈夫曼编码. 用上图的例子来说:
哈夫曼树和哈夫曼编码_第7张图片 A,B,C,D对应的哈夫曼编码分别为:111,10,110,0

哈夫曼编码&压缩

哈夫曼在通信领域有很多的用途,将需要传输的数据转换01串,相比直接传输极大提高了传输的速率,同时还是数据压缩的重要方法。

哈夫曼压缩思路

假设一字符串为:“abcabcabcabcabcabcddddddddd”,统计各字符出现次数:
字符 出现次数
a 6
b 6
c 6
d 9
按照一般存储方法,一个字符占用一个字节,共占用空间 (6 + 6 + 6 + 9) * sizeof(char) = 27字节,27字节确实不算什么,但是如果是海量数据的话,就必须考虑存储空间的问题了。 我们试着建立哈夫曼树:
把出现次数当做权重,出现次数越多的话就越靠近根节点,编码也就越短:
哈夫曼树和哈夫曼编码_第8张图片

上面的字符串就转换成了“0001,1000,0110,0001,1000,0110,0001,1000,0110,1111,1111,1111,1111,11”,按位储存。之前的27字节的字符串就转化成了7字节(不足补零),这就达到了压缩的效果。

小结:利用哈夫曼树的特点,权重越大越靠近根节点,编码也就越短,将字符出现次数作为权重,文本中出现次数最多的字符就被压缩成了很短的编码.

你可能感兴趣的:(数据结构)