【二叉树】哈夫曼定理与原理

1、从树中一个结点到另一个结点之间的分支构成两个结点之间的路径,路径上的分支数目称作路径的长度
2、树的路径长度是从树根到每一结点的路径长度之和。
3、树的带权路径长度(WPL)是树中所有叶子结点的带权路径长度之和。
4、带权路径长度 WPL 最小的二叉树称作哈夫曼树。

哈夫曼算法描述

  1. 根据给定的 n 个权值 {w1,w2,...,wn} 构成 n 棵二叉树的集合 F={T1,T2,...,Tn},其中每棵二叉树 Ti 中只有一个带权为 wi 根结点,其左右子树均为空。
  2. F 中选取两棵根结点的权值最小的树作为左右子树构造一棵新的二叉树,且置新的二叉树的根结点的权值为其左右子树上根结点的权值之和。
  3. F 中删除这两棵树,同时将新得到的二叉树加入 F 中。
  4. 重复 2 3 步骤,直到 F 只含一棵树为止。这棵树就是哈夫曼树。

假设六个字母的频率(权值)为 A27B8C15D15E30F5 ,合起来正好是100%。
用哈夫曼算法构造哈夫曼树的过程如下:
1、先把字母按频率从小到大的顺序排列成一个有序序列,即: F5B8C15D15A27E30
2、取头两个最小权值的结点作为一个新结点 N1 的两个子结点, F N1 的左孩子, B N1 的右孩子,新结点的权值为两个叶子权值的和 13。
这里写图片描述
3、将 N1 替换 F B,插入有序序列中,保持从小到大排序。即: N113C15D15A27E30
4、重复步骤 2。将 N1 C 作为一个新结点 N2 的两个子结点。 N2 的权值为 28。
这里写图片描述
5、将 N2 替换 N1 C ,插入有序序列中,保持从小到大排序。即:D15A27N228E30
6、重复步骤 2。将 D A 作为一个新结点 N3 的两个子结点。 N3 的权值为 42。
这里写图片描述
7、将 N3 替换 D A,插入有序序列中,保持从小到大排序。即: N228E30N342
8、重复步骤 2。将 N2 E 作为一个新结点 N4 的两个子结点。 N4 的权值为 58。
这里写图片描述
7、将 N4 替换 N2 E ,插入有序序列中,保持从小到大排序。即:N342N458
8、重复步骤 2。将 N3 N4 作为一个新结点 N5 的两个子结点。 N5 的权值为 100。
这里写图片描述

哈夫曼编码

左图为构造哈夫曼树的过程的权值显示。右图为将权值左分支改为 0,右分支改为 1 后的哈夫曼树。
左图右图
此时,对六个字母用从树根到叶子所经过路径的 0 或 1 来编码,可以得到如下表所示的定义。

字母ABCDEF
二进制字符01100110100111000

而若字母用相应的二进制数据表示,则如下表所示:

字母ABCDEF
二进制字符000001010011100101

则可以对比一下将文字内容“BADCADFEED”编码后的结果串:

  • 原编码二进制串       :001000011010000011101100100011(共 30 个字符)
  • 哈夫曼编码二进制串:1001010010101001000111100(共25个字符)

若要设计长短不等的编码,则必须是任一字符的编码都不是另一个字符的编码的前缀,这种编码称作前缀编码。

  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值