最优二叉树(霍、赫、哈夫曼树)
路 径: 由一结点到另一结点间的分支所构成。
路径长度: 路径上的分支数目。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
另一种结果表示: