数据结构入门----赫夫曼Huffman树及其应用

最优二叉树(霍、赫、哈夫曼树)

路    径: 由一结点到另一结点间的分支所构成。

路径长度: 路径上的分支数目。a→e的路径长度=2

树的路径长度: 从树根到每一结点的路径长度之和。树长度=10

带权路径长度: 结点到根的路径长度与结点上权的乘积。

树的带权路径长度: 树中所有叶子结点的带权路径长度之和。

哈 夫 曼 树:带权路径长度最小的二叉树。

Huffman树简介

树的带权路径长度Weighted Path Length

哈夫曼树则是:WPL 最小的二叉树。

有n个权值分别为w1、w2…、wn,构造一颗有n个叶子结点的二叉树,每个叶子结点带的权值为wi,其中WPL最小的二叉树叫做最优二叉树

哈夫曼树的特点:

1. 权值越大的叶子结点越靠近根结点,而权值越小的叶子结点越远离根结点。

2. 只有度为0(叶子结点)和度为2(分支结点)的结点,不存在度为1的结点.

构造哈夫曼树的基本思想:

权值大的结点用短路径,权值小的结点用长路径。

构造Huffman树的步骤(即Huffman算法):

(1) 由给定的 n 个权值{w0, w1, w2, …, wn-1},构造具有 n 棵扩充二叉树的森林F = { T0, T1, T2, …, Tn-1 },其中每一棵扩充二叉树 Ti 只有一个带有权值 wi 的根结点,其左、右子树均为空。  

(2) 重复以下步骤, 直到 F 中仅剩下一棵树为止:    

① 在 F 中选取两棵根结点的权值最小的扩充二叉树, 做为左、右子树构造一棵新的二叉树。置新的二叉树的根结点的权值为其左、右子树上根结点的权值之和。    

② 在 F 中删去这两棵二叉树。    

③ 把新的二叉树加入 F。

操作要点: 合并、删除与替换

哈夫曼树的应用:哈夫曼编码

设有4个字符d,i,a,n,出现的频度分别为7,5,2, 4,怎样编码才能使它们组成的报文在网络中传得最快?

等长编码,例如用二进制编码来实现。    取 d=00,i=01,a=10,n=11

不等长编码,例如用哈夫曼编码来实现。    取  d=0; i=10, a=110,  n=111

最快的编码是非等长的Huffman码!

实现Huffman编码先要构造Huffman树!

构造Huffman树的步骤:

操作要点1:对权值的合并、删除与替换 ——在权值集合{7,5,2,4}中,总是合并当前值最小的两个权

注:方框表示外结点(叶子,字符对应的权值),     圆框表示内结点(合并后的权值)。

操作要点2:按左0右1对Huffman树的所有分支编号!

将                Huffman树                             与                             Huffman编码                              挂钩。

                       

Huffman编码结果:d=0,  i=10,  a=110,  n=111,WPL=1bit×7+2bit×5+3bit(2+4)=35

特点:每一码都不是另一码的前缀,绝不会错译! 称为前缀码

霍夫曼编码的基本思想是:概率大的字符用短码,概率小的用长码。由于霍夫曼树的WPL最小,说明编码所需要的比特数最少。这种编码已广泛应用于网络通信中。

对应的哈夫曼编码(左0右1):

Huffman码WPL=2(0.19+0.32+0.21) + 4(0.07+0.06+0.10) +5(0.02+0.03)  =1.44+0.92+0.25=2.61

二进制码WPL=3(0.19+0.32+0.21+0.07+0.06+0.10+0.02+0.03)=3

另一种结果表示:

 

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值