哈夫曼编码

来源:互联网 发布:东方财富通软件 编辑:程序博客网 时间:2024/06/04 01:16

今天看到一些有关树的知识,又想起了哈夫曼树,但是又忘了具体的,真是让人惆怅。于是翻开《大话数据结构》这本书重温一遍,跟着作者重温哈夫曼树和哈夫曼编码。

哈夫曼树的定义:带权路径长度的 WPL 最小的二叉树称为哈夫曼树。
假设我们现在有 A B C D E ,权值分别为 5,15,40,30,10
什么是带权路径长度?我们先看两张图:

图一二叉树

图二二叉树

我们先看一下什么叫路径长度:从树的一个结点到另一个结点之间的分支构成两个结点之间的路径,路径上的分支数目称作路径长度。
图一中根节点到结点D的路径长度为 4,二叉树的路径长度为 :
1 + 1 + 2 + 2 + 3 + 3 + 4 + 4 = 20 。
图二中根节点到结点 D 的路径长度为 2 ,二叉树的长度为 :
1 + 1 + 2 + 2 + 2 + 2 + 3 + 3 = 16 。
带权路径长度就是对应的路径长度跟结点上权值的积。
图一根结点 到 结点D 的带权路径值为 5*4 = 20,图二根节点到结点D的带权路径值为 5*2 = 10。

我们现在可以分别计算图一跟图二带权路径的长度,图一:
WPL = 5*1 + 15*2 + 40*3 + 30*4 + 10*4 = 315 。
图二:WPL = 5*3 + 15*3 + 40*2 + 30*2 + 10*2 = 220 。
图二的带权路径长度明显比普通二叉树小。我们要做的就是构造一棵使得WPL最小的二叉树。

接下来就是该如何去构造哈夫曼树:
1.我们把带权值的子节点按权值 递增排序,如上面的例子,可以排序:
A5 , E10 , B15 , D30 , C40 。
2.取头两个权值最小的节点 A 和 E 作为一个新节点 N1 的两个子节点,权值小的位左子节点,大的为由子节点
3. 用 N1 代替 A 和 E 插入序列中,变成 N1,B,D,C
4. 重复步骤2 和 3

最终得到哈夫曼树!
这里写图片描述
WPL = 5*4 + 10*4 + 15*3 + 30*2 + 40*1= 205

哈夫曼树的主要应用则是哈夫曼编码,主要是为了解决当年的远程通信优化问题,使用哈夫曼编码可以缩减文本文件的大小。

原创粉丝点击