开启掘金成长之旅!这是我参与「掘金日新计划·2月更文挑战」的第19天,点击查看活动详情
哈夫曼树(二叉)与哈夫曼编码
哈夫曼树:是基于贪心算法的思想来设计的树 哈夫曼编码:哈夫曼树的实际应用
概念
权: 树中结点相关的数值
路径长度: 从树中某个结点到另一个结点之间的分支数目(经过的边数)
带权路径长度: 从树的根节点到任意结点的路径长度(经过的边数)与改结点上权值的乘积称为该结点的带权路径长度。
树中所有叶结点的带权路径长度之和称为 该树的带权路径长度 其中 是第 叶结点所带的权值; 是该叶结点到根结点的路径长度。
例如这颗树:
(叶结点A到根结点的路径长度是1,同理叶结点B、C、D、E到根结点的路径长度分别是:2,3,4,4)
再换一种树:
那么哈夫曼树的概念就是:含有N个带权叶子结点的二叉树中,其中带权路径长度(WPL)最小的二叉树,也称为:最优二叉树
哈夫曼树的建立
- 将这N个结点分别作为N棵仅含一个结点的二叉树,构成森林F。(森林:森林是m(m≥0)棵互不相交的树的集合)
- 构造一个新结点,并从F中选取 两棵根结点权值最小的树 作为 新结点的左、右子树,并且将新结点的权值置为 左、右子树上根结点的权值之和
- 从F中删除刚才选出的两棵树,同时将新得到的树加入F中。
- 重复步骤2,3,直至F中只剩下一棵树为止。
题目:设给定权集w={5, 7, 2, 3, 6, 8, 9},试构造关于w的一棵哈夫曼树,并求其加权路径长度WPL。
步骤如下
往后的步骤
总结哈夫曼树的重要性质
- 每个初始结点最终都成为了叶结点,并且权值越小的结点到根结点的路径长度越大
- 构造过程中共新建了N-1个结点(双分支结点),因此哈夫曼树中结点总数为:2N-1
- 每次构造都选择2棵树作为新结点的孩子,因此哈夫曼树不存在 度(结点的分支数) 为1的结点。
哈夫曼编码
哈夫曼编码最早用于解决远距离电报通信的数据传输最优化问题。