数据结构【哈夫曼树】

哈夫曼树

哈夫曼树的概念

最优二叉树也称哈夫曼 (Huffman) 树,是指对于一组带有确定权值的叶子结点,构造的具有最小带权路径长度的二叉树。权值是指一个与特定结点相关的数值。哈夫曼树是带权路径长度最短的树,权值较大的结点离根较近。

涉及到的几个概念:
路径:

从树中一个结点到另一个结点之间的分支构成这两个结点间的路径。
结点的路径长度:

两结点间路径上的分支数。
树的路径长度:

从树根到每一个结点的路径长度之和。记作: TL。
权(weight):

将树中结点赋给一个有着某种含义的数值则这个数值称为该结点的权。
结点的带权路径长度:

从根结点到该结点之间的路径长度与该结点的权的乘积。
树的带权路径长度:

树中所有叶子结点的带权路径长度之和。
二叉树的带权路径长度 (Weighted Path Length):

二叉树的路径长度是指由根结点到所有叶子结点的路径长度之和。

如果二叉树中的所有叶子结点都具有一个特定的权值,则可将这一概念加以推广。设二叉树具有n个带权值的叶子结点,那么从根结点到各个叶子结点的路径长度与该叶子结点相应的权值的乘积之和叫做又树的带权路径长度,记为:

其中,wk为第k个叶子结点的权值,Lk为第k个叶子结点的路径长度。

最优树:带权路径长度(WPL)最短的树

cpp 复制代码
注:
"带权路径长度最短"是在"度相同"的树中比较而得的结果,因此有最优二叉树、最优三叉树之称等等。

最优二叉树:带权路径长度(WPL)最短的二叉树

cpp 复制代码
因为构造这种树的算法是由哈夫曼教授于 1952 年提出的所以被称为哈夫曼树,相应的算法称为哈夫曼算法。

哈夫曼树的构造

哈夫曼算法(构造哈夫曼树的四句口诀)

(1)根据n个给定的权值{ w1、w2、...、wn}构成n棵二叉树的森林F=(T1、T2、...、Tn},其中Ti只有一个带权为 wi的根结点。
构造森林全是根

(2)在F中选取两棵根结点的权值最小的树作为左右子树,构造一棵新的二叉树,且设置新的二叉树的根结点的权值为其左右子树上根结点的权值之和。
选用两小造新树

(3)在F中删除这两棵树,同时将新得到的二又树加入森林中。
删除两小添新人

(4)重复(2)和(3),直到森林中只有一棵树为止,这棵树即为哈夫曼树。
重复 2、3 剩单根

可以得出:

1)哈夫曼树的节点的度为0或2,没有度为1的节点。

2)包含n个叶子节点的哈夫曼树中共有2n-1个节点。

3)包含n棵树的森林要经过n-1次合并才能形成哈夫曼树,共产生n-1个新节点。

构造算法的实现

顺序结构存储--一维结构数组

cpp 复制代码
typedef struct (
	int weight;
	int parent, lch, rch;
)HTNode,*HuffmanTree;

先初始化再构造

1.初始化HT1...2n-1: lch=rch=parent=0;

  1. 输入初始n个叶子结点: 置HT1...n的weight值;

3.进行以下n-1次合并,依次产生n-1个结点HTi,i=n+1...2n-1:

a) 在HT1.i-1中选两个未被选过(从parent ==_0 的结点中选)的weight最小的两个结点HTs1和HTs2,s1、s2为两个最小结点下标;

修改HTs1和HTs2的parent值: HTs1 .parent=i; HTs2 .parent=i;b)修改新产生的HTi:

HTil.weight=HT\[s1.weight + HTs2.weight

HTi. lch=s1; HTi. rch=s2;

哈夫曼树应用

哈夫曼编码

哈夫曼编码的算法实现

示例:

相关推荐
土司大王3 小时前
LeetCode hot100——对称二叉树
算法·leetcode·职场和发展
sali-tec3 小时前
C# 基于OpenCv的视觉工作流-章106-差值追踪
图像处理·人工智能·opencv·算法·计算机视觉
Navigator_Z3 小时前
LeetCode //C - 1208. Get Equal Substrings Within Budget
c语言·算法·leetcode
手写码匠4 小时前
Dify 多 Agent 工具权限与安全沙箱实战:让智能体“有能力,但不越权“
人工智能·深度学习·算法·aigc
黎阳之光4 小时前
打破堆场感知黑盒:黎阳之光视频孪生,构建港口码头网格化透明管控新体系
大数据·人工智能·算法·安全·数字孪生
大模型码小白4 小时前
AI 对话流性能调优:万级消息的虚拟滚动落地
java·大数据·前端·javascript·人工智能·算法·机器学习
sel_95 小时前
【多轮对话论文导读(三)】多轮对话与Agent论文阅读笔记:用户模拟、轨迹生成与长期记忆
论文阅读·人工智能·笔记·深度学习·算法·机器学习
Asize5 小时前
438. 找到字符串中所有字母异位词
算法
Asize5 小时前
283. 移动零
算法
船厂电气自动化ai大模型7 小时前
AI大模型与数学·第57课 傅里叶全套工具链综合实战:串联级数/连续变换/DFT/FFT,图像、音频、扩散模型完整例题
数据结构·人工智能·深度学习·算法·机器学习