#补充算法知识:哈夫曼树(二叉)与哈夫曼编码

318 阅读2分钟

开启掘金成长之旅!这是我参与「掘金日新计划·2月更文挑战」的第19天,点击查看活动详情

哈夫曼树(二叉)与哈夫曼编码

哈夫曼树:是基于贪心算法的思想来设计的树 哈夫曼编码:哈夫曼树的实际应用

概念

权: 树中结点相关的数值

路径长度: 从树中某个结点到另一个结点之间的分支数目(经过的边数)

带权路径长度: 从树的根节点到任意结点的路径长度(经过的边数)与改结点上权值的乘积称为该结点的带权路径长度。

树中所有叶结点的带权路径长度之和称为 该树的带权路径长度 (树的带权路径长度)      WPL=i=1nwi×li(树的带权路径长度) \;\;\;WPL=\sum_{i=1}^{n}w_i×l_i 其中 wiw_i 是第 ii 叶结点所带的权值;lil_i 是该叶结点到根结点的路径长度。

例如这颗树:

image.png

(树的带权路径长度)      WPL=5×1+15×2+40×3+30×4+10×4=315(树的带权路径长度) \;\;\;WPL = 5 × 1 + 15 × 2 + 40 × 3 + 30 × 4 + 10 × 4 = 315 (叶结点A到根结点的路径长度是1,同理叶结点B、C、D、E到根结点的路径长度分别是:2,3,4,4)

再换一种树:

image.png

(树的带权路径长度)      WPL=5×3+15×3+40×2+30×2+10×2=220(树的带权路径长度) \;\;\;WPL = 5 × 3 + 15 × 3 + 40 × 2 + 30 × 2 + 10 × 2 = 220

那么哈夫曼树的概念就是:含有N个带权叶子结点的二叉树中,其中带权路径长度(WPL)最小的二叉树,也称为:最优二叉树

哈夫曼树的建立

  1. 将这N个结点分别作为N棵仅含一个结点的二叉树,构成森林F。(森林:森林是m(m≥0)棵互不相交的树的集合)
  2. 构造一个新结点,并从F中选取 两棵根结点权值最小的树 作为 新结点的左、右子树,并且将新结点的权值置为 左、右子树上根结点的权值之和
  3. 从F中删除刚才选出的两棵树,同时将新得到的树加入F中。
  4. 重复步骤2,3,直至F中只剩下一棵树为止。

题目:设给定权集w={5, 7, 2, 3, 6, 8, 9},试构造关于w的一棵哈夫曼树,并求其加权路径长度WPL。

步骤如下

image.png

image.png

往后的步骤

image.png

image.png

WPL=6×3+7×3+2×4+3×4+5×3+8×2+9×2=108WPL = 6 × 3 + 7 × 3 + 2 × 4 + 3 × 4 + 5 × 3 + 8 × 2 + 9 × 2 = 108

总结哈夫曼树的重要性质

  1. 每个初始结点最终都成为了叶结点,并且权值越小的结点到根结点的路径长度越大
  2. 构造过程中共新建了N-1个结点(双分支结点),因此哈夫曼树中结点总数为:2N-1
  3. 每次构造都选择2棵树作为新结点的孩子,因此哈夫曼树不存在 度(结点的分支数) 为1的结点。

哈夫曼编码

哈夫曼编码最早用于解决远距离电报通信的数据传输最优化问题。