2018.1.18 Thur
如何构建哈夫曼树
- 先将给出的序列从小到大排序。
- 将最小数和次小数作为子结点,并将两数的和作为根结点,再将和放入序列中。(左右结点顺序随意,后续步骤都是,最后会说明原因)
- 再从序列中取出最小和次小数,重复步骤2。(序列中出现相等的数,有的是原序列中的,有的是求和得到的,可以任意取,所以哈夫曼树不是唯一的,但WPL相等)
- 重复上述步骤,直到序列中只剩下一个数,构建完成。
如何理解哈夫曼树及其应用:
序列中的数就是权重。数值越大表示权重越高,越应该出现在树的上层。同层上的带权路径长度相等,不区分左右子树。可能出现权重相等而带权路径长度不相等的情况。
同一组权重值构造出的哈夫曼树不是唯一的,但带权路径长度WPL是相等的。也就是说哈夫曼树是WPL值最小的二叉树,因此也称为最优二叉树。一棵哈夫曼树确定了每一个权重值所代表字符的编码。如果是同一组权重值构造出的不同的哈夫曼树,就带表:编码的形态可以不同,但同样是长度最优解。(我们的目的只是最短,并不要求编码唯一)
每个权重值都有唯一的带权路径(不会是其他权重的前缀),这样就保证了编码过程中不会因为长度不同而出现编码不唯一的情况(编码二义性)。
例:
(https://zhidao.baidu.com/question/336804990.html?qbl=relate_question_7&word=%CD%AC%D2%BB%D7%E9%C8%A8%D6%D8%B9%FE%B7%F2%C2%FC%CA%F7)
求由一组权值 8,2,5,3,2,17,4生成的哈夫曼树
解法一:
①2,2,3,4,5,8,17
②2+2=4。3,4,4,5,8,17
4
/ \
2 2
③3+4=7。4,5,7,8,17
7
/ \
4 3
/ \
2 2
④4+5=9。7,8,9,17(两颗树现在还不知道层级关系)
7
/ \ 9
4 3 / \
/ \ 4 5
2 2
⑤7+8=15。9,15,17
15
/ \
7 8
/ \ 9
4 3 / \
/ \ 4 5
2 2
⑥9+15=24。17,24
24
/ \
15 9
/ \ / \
7 8 4 5
/ \
4 3
/ \
2 2
⑦17+24=41。41
41
/ \
24 17
/ \
15 9
/ \ / \
7 8 4 5
/ \
4 3
/ \
2 2
解法二:
①2,2,3,4,5,8,17
②2+2=4。3,4,4,5,8,17
4
/ \
2 2
③3+4=7。4,5,7,8,17
4 7
/ \ / \
2 2 3 4
④4+5=9。7,8,9,17
9
/ \ 7
4 5 / \
/ \ 3 4
2 2
⑤7+8=15。9,15,17
15
9 / \
/ \ 7 8
4 5 / \
/ \ 3 4
2 2
⑥9+15=24。17,24
24
/ \
9 15
/ \ / \
4 5 7 8
/ \ / \
2 2 3 4
⑦17+24=41。41
41
/ \
24 17
/ \
9 15
/ \ / \
4 5 7 8
/ \ / \
2 2 3 4