Dotcpp  >  编程教程  >  数据结构  >  简述霍夫曼树

简述霍夫曼树

点击打开在线编译器,边学边练

1. 树的带权路径长度

设二叉树具有 n 个带权叶结点,从根结点到各叶结点的路径长度与相应叶节点权值的乘积之和称为 树的带权路径长度(Weighted Path Length of Tree,WPL)。

w为二叉树第 i 个叶结点的权值,li为从根结点到第 i 个叶结点的路径长度,则WPL计算公式如下:

WPL计算公式

 WPL计算公式

如上图所示,其 WPL 计算过程与结果如下:

WPL计算过程与结果

2. 结构

对于给定一组具有确定权值的叶结点,可以构造出不同的二叉树,其中,WPL 最小的二叉树称为霍夫曼树(Huffman Tree)。

对于霍夫曼树来说,其叶结点权值越小,离根越远,叶结点权值越大,离根越近,此外其仅有叶结点的度为 0,其他结点度均为 2。


3. 霍夫曼算法

霍夫曼算法用于构造一棵霍夫曼树,算法步骤如下:

(1)初始化:由给定的 n 个权值构造 n 棵只有一个根节点的二叉树,得到一个二叉树集合F

(2)选取与合并:从二叉树集合F中选取根节点权值最小的两棵二叉树分别作为左右子树构造一棵新的二叉树,这棵新二叉树的根节点的权值为其左、右子树根结点的权值和。

(3)删除与加入:从F中删除作为左、右子树的两棵二叉树,并将新建立的二叉树加入到F。

(4)重复 2、3 步,当集合中只剩下一棵二叉树时,这棵二叉树就是霍夫曼树。

霍夫曼算法


4. 霍夫曼编码

在进行程序设计时,通常给每一个字符标记一个单独的代码来表示一组字符,即编码

在进行二进制编码时,假设所有的代码都等长,那么表示 n 个不同的字符需要等长编码位,称为等长编码

如果每个字符的使用频率相等,那么等长编码无疑是空间效率最高的编码方法,而如果字符出现的频率不同,则可以让频率高的字符采用尽可能短的编码,频率低的字符采用尽可能长的编码,来构造出一种 不等长编码,从而获得更好的空间效率。

在设计不等长编码时,要考虑解码的唯一性,如果一组编码中任一编码都不是其他任何一个编码的前缀,那么称这组编码为前缀编码,其保证了编码被解码时的唯一性。

霍夫曼树可用于构造最短的前缀编码,即霍夫曼编码(Huffman Code),其构造步骤如下:

(1)设需要编码的字符集为:字符集,他们在字符串中出现的频率为:字符集

(2)以叶结点作为叶结点,叶结点作为叶结点的权值,构造一棵霍夫曼树。

(3)规定哈夫曼编码树的左分支代表 0,右分支代表 1,则从根结点到每个叶结点所经过的路径组成的 0、1序列即为该叶结点对应字符的编码。

霍夫曼编码


知识点标签:数据结构


本文固定URL:https://www.dotcpp.com/course/1088

算法竞赛教程
第一章 算法基础
第二章 搜索算法
第三章 排序算法
第四章 字符串相关
第五章 数学相关
第六章 动态规划
第七章 数据结构
第八章 图论
第九章 计算几何
第十章 其他算法
Dotcpp在线编译      (登录可减少运行等待时间)