第6章 哈夫曼树及哈夫曼编码(手工分析)

更详细的讲解:点击这里

【Huffman树的构造】

步骤:

① 根据 n n 个权值 { w 1 , w 2 , , w n } \left\{w_1, w_2, ⋯ , w_n\right\} ,构造成 n n 棵二叉树的集合 F = { T 1 , T 2 , , T n } F = \left\{T_1, T_2, ⋯ , T_n\right\} ,其中每棵二叉树只有一个权值为 w i w_i 的根结点,没有左、右子树;

② 在 F F 中选取两棵根结点权值最小的树作为左、右子树构造一棵新的二叉树,且新的二叉树根结点权值为其左、右子树根结点的权值之和;

③ 在 F F 中删除这两棵树,同时将新得到的树加入 F F 中;

④ 重复②、③,直到 F F 只含一颗树为止。

注意:如果选出的两个数字都不是已经构造好的二叉树里面的结点,则要另外开一棵二叉树。
详细来说就是,如果两个数的和正好是下一步的两个最小数的其中的一个,那么这个树直接往上生长就可以了;如果这两个数的和比较大,不是下一步的两个最小数的其中一个,那么就并列生长

注意:对同一组叶子结点来说,哈夫曼树可以是不唯一的,但是最小带权路径长度一定是唯一的。

约定:构造Huffman树时,为了规范,规定F = {T1, T2, ⋯ , Tn}中权值小的二叉树作为新构造的二叉树的左子树,权值大的二叉树作为新构造的二叉树的右子树;在取值相等时,深度小的二叉树作为新构造的二叉树的左子树,深度大的二叉树作为新构造的二叉树的右子树。

【Huffman编码方法】

规定Huffman树中左分支代表“0”,右分支代表“1” 。从根结点到每个叶子结点所经历的路径分支上的“0”或“1”所组成的字符串,为该结点所对应的编码,称之为Huffman编码。

【例题】

假设用于通信的电文是由字符集 { a , b , c , d , e , f , g , h } \left\{a, b, c, d, e, f, g, h\right\} 中的字符构成, 这 8 8 个字符在电文中出现的概率分别为 { 0.07 , 0.19 , 0.02 , 0.06 , 0.32 , 0.03 , 0.21 , 0.10 } \left\{0.07, 0.19, 0.02, 0.06, 0.32, 0.03, 0.21, 0.10\right\}

(1)请画出对应的huffman树 (按左子树根结点的权小于等于右子树根结点的权的次序构造)。

(2) 求出每个字符的huffman编码。

发布了674 篇原创文章 · 获赞 103 · 访问量 11万+

猜你喜欢

转载自blog.csdn.net/qq_42815188/article/details/103792216