哈夫曼树与哈夫曼编码

article/2025/8/25 9:28:45

哈夫曼树

给定n个权值作为n个叶子结点,构造一棵二叉树,若带权路径长度达到最小,称这样的二叉树为最优二叉树,也称为哈夫曼树(Huffman Tree)。哈夫曼树是带权路径长度最短的树,权值较大的结点离根较近。

树节点间的边相关的数叫做权。从树中的一个节点到另一个节点之间的分支构成两个点之间的路径,路径上的分支数目称作路径长度。

例如,如下图:

从根结点100到C3的路径长度为4,也就是图中的根结点100到达C3的路径长度为4。

树的路径长度就是从树根到每一个节点的路径长度之和。二叉树的路径长度就为1+1+2+2+2+2+3+3+3+3+4+4+4+4=38。如果考虑带权的节点,节点的带权的路径长度就是从该节点到树根之间的路径长度乘该节点的权。数的带权路径长度就是所有叶子节点的带权路径长度之和。带权路径长度(WPL)最小的二叉树称作哈夫曼树。

如何构造哈夫曼树

下面我们以【3、4、5、6、10、25、36、11】为例来画出哈夫曼树(数字大小代表权重大小,越大的权重越大)

第一步:按从小到大排序。

【3、4、5、6、10、25、36、11】→【3、4、5、6、10、11、25、36】

第二步:选最小两个数画出一个树,最小数为3和4。

构成第一个二叉树,根结点为7,左子树为3,右子树为4。

之后一直重复第一、第二步:排序然后取两个最小值。实际就是一个递归过程

排序:

取两个最小数5和6,构成另一个二叉树,根结点11,左子树为5,右子树为6。

再取两个最小数第一个二叉树的根结点7和未取出的数10,组成一个新的二叉树如图:

再取一个数11,和另一个根结点相结合,组成一个新的二叉树:

再取出两个最小数字,现在两个最小数字是两个二叉树的根结点,所以如下图:

再取两个最小数25和36,组成新的二叉树:

再取两个最小数的根结点,如下图所示,组成新的二叉树:

这个过程就是构造哈夫曼树的过程,也是最小二叉树。

哈夫曼编码

哈夫曼研究这种最优树的目的是为了解决当年远距离通信(主要是电报)的数据传输的最优化问题。

比如我们继续用上边的图来做这个,正好图片上有编码了。不管是以前还是现在,网络的数据传输都是用的计算机最基础的语言,0和1,图上的C1到C8八个字符串,和图上附带的它们自带的权值,带表了它们在数据中出现次数的量,如何才能用最少的数据存储,传出最大的数据信息呢,这就是哈夫曼编码的作用。

根据上边的构造哈夫曼树,我们把左子树的边用0表示,把右子树的边用1表示,那就得到如下的二进制编码。

C1:0100

C2:10

C3:0000

C4:0101

C5:001

C6:011

C7:11

C8:0001

用到的次数越少,那么编码则就越长,用到的次数越多,则编码就越短,当这个次数足够多的时候,差距才会比较明显。

如果用字母表示,可能会更明显,看下边的一个例子:

字母表示:

比如我们有一段文字“BADCADFEED”,显然用二进制数字(0和1)表示是很自然的想法。

图示

这样真正传输的数据就是“001000011010000011101100100011”,对方接收时同样按照3位一组解码。如果一篇文章很长,这样的二进制串也非常的可怕。而且事实上,每个字母或者汉字的出现频率是不同的。

假设六个字母的频率为A 27,B 8, C 15, D 15 , E 30, F 5,合起来正好是100%,那就意味着我们完全可以用哈夫曼树来规划它们。

左图为构造哈夫曼树的过程的权值显示。右图为将权值左分支改为0,右分支改为1后的哈夫曼树。

图示

我们对这六个字母用其从树根到叶子所经过的路径的0或1来编码,可以得到下表:

图示

图示

也就是说我们的数据被压缩了,节约了大概17%的存储或传输成本。随着字符的增加和多字符权重的不同,这种压缩会更显出优势来。

上例子,摘自diligentyang

好的,总结来说,哈夫曼树在一定程度上缓解了传输数据量过大,大大节省了传输成本。


http://chatgpt.dhexx.cn/article/DMYPpv33.shtml

相关文章

【例题】哈夫曼树

【例1】由五个分别带权值为9,2,3,5,14的叶子结点构成的一棵哈夫曼树,该树的带权路径长度为_______________。 A、60 B、66 C、67 D、50 答案:C 解析: 关键点在于要学会如何构造哈夫曼树 已知有5…

哈夫曼树以及哈夫曼算法

目录 一、哈夫曼树的定义 二、哈夫曼树的特点 三、哈夫曼算法(构造哈夫曼树的方法) 四、哈夫曼树的构造过程 五、哈夫曼树构造算法的实现 一、哈夫曼树的定义 1、哈夫曼树:最优树即带权路径长度(WPL)最短的树 “带权路径长度最短”是在"度相同”的树中比较而得的结果…

哈夫曼树的绘制

数据结构之哈夫曼树绘制 本人还是一个年轻的程序猿(还是个学生),请大家多多指教! 哈夫曼树 已知权重绘制哈夫曼树 开始我的表演 Step 1. 已知权重:2,3,3,4,7,6 Step 2. 选取其中…

哈夫曼树 哈夫曼编码

哈夫曼树 哈夫曼树的定义:设二叉树具有 n 个带权值的叶节点,那么从根节点到各个叶节点的路径长度与相应叶节点权值的乘积的和,叫作二叉树的带权路径长度 WPL (Weighted Path Length)。具有最小带权路径长度的二叉树称为哈夫曼树 (Huffman Tr…

哈夫曼树(Huffman Tree)

定义 哈夫曼树又称最优二叉树,是一种带权路径长度最短的二叉树。所谓树的带权路径长度,就是树中所有的叶结点的权值乘上其到根结点的路径长度(若根结点为0层,叶结点到根结点的路径长度为叶结点的层数)。树的路径长度是…

哈夫曼树详解

一、哈夫曼树的介绍 Huffman Tree,中文名是哈夫曼树或霍夫曼树,它是最优二叉树。 定义:给定n个权值作为n个叶子结点,构造一棵二叉树,若树的带权路径长度达到最小,则这棵树被称为哈夫曼树。 这个定义里面涉…

哈夫曼树(Huffmantree)

1.基本概念 哈夫曼树又称为最优树,是一类带权路径长度最短的树。 一些概念的定义: (1)路径:树的两个结点之间的连线称为路径。 (2)路径长度:路径上的分支数目称作路径长度。若规定…

哈夫曼树详解及其应用(哈夫曼编码)

一,哈夫曼树的基本概念 路径:从树中一个结点到另一个结点之间的分支构成这两个结点间的路径 结点的路径长度:两结点之间路径上的分支数 树的路径长度:从树根到每一个结点的路径长度之和.记作:&#xff3…

哈夫曼树编码的实现+图解(含全部代码)

目录 哈夫曼树的基本概念 ------------哈夫曼树的构造方法 ------------------------哈夫曼编码 ------------------------------------全部代码 哈夫曼树的基本概念 哈夫曼树通常以二叉树的形式出现,所以也称最优二叉树,是一类带权路径长度最短的树…

哈夫曼树(C语言实现)

文章目录 哈夫曼树的基本概念哈夫曼树的构建构建思路代码实现 哈夫曼编码的生成编码生成思路代码实现 完整代码展示以及代码测试 哈夫曼树的基本概念 在认识哈夫曼树之前,你必须知道以下几个基本术语: 1、什么是路径? 在一棵树中&#xff0c…

打开VS2010提示:产品密钥框

打开VS2010提示:产品密钥框,如下图: …

VS 2017 产品密钥

个人分类: vs2010 Visual Studio 2017(VS2017) 企业版 Enterprise 注册码:NJVYC-BMHX2-G77MM-4XJMR-6Q8QF Visual Studio 2017(VS2017) 专业版 Professional 激活码key:KBJFW-NXHK6-W4WJM-CRM…

vs++2010学习版的注册密钥

6VPJ7-H3CXH-HBTPT-X4T74-3YVY7 欢迎使用Markdown编辑器 你好! 这是你第一次使用 Markdown编辑器 所展示的欢迎页。如果你想学习如何使用Markdown编辑器, 可以仔细阅读这篇文章,了解一下Markdown的基本语法知识。 新的改变 我们对Markdown编辑器进行…

存储过程入门

参考文章 Oracle Database concepts guide(11g2) By Thomas KyteStored Procedure Wiki 先修知识 数据库的基本概念SQL 什么是存储过程(Stored Procedure): 一段存储在数据库的“子程序”,下面对这两个…

【MySQL存储过程】创建一个简单的存储过程

什么是存储过程和函数 存储过程和函数是在数据库中定义的一些SQL语句的集合,然后直接调用这些存储过程和函数来执行已经定义好的SQL语句。存储过程和函数可以避免开发人员重复编写相同的SQL语句。而且,存储过程和函数是在MySQL服务器中存储和执行的&…

什么是存储过程

什么是存储过程:存储过程可以说是一个记录集吧,它是由一些T-SQL语句组成的代码块,这些T-SQL语句代码像一个方法一样实现一些功能(对单表或多表的增删改查),然后再给这个代码块取一个名字,在用到…

MySQL-存储过程

文章目录 存储过程一. 存储过程的创建和使用1. 创建存储过程2. 删除存储过程3. 查看存储过程4. 调用存储过程5. 例题 二. 变量1. 系统变量1.1 全局变量1.2 会话变量 2. 自定义变量2.1 用户变量2.2 局部变量 三. 存储过程参数3.1 说明:3.2 例题 四. 流程控制1. IF语句…

存储过程怎么使用

1.什么是存储过程? 存储过程是封装了一条或多条SQL的集合。它的好处是简单、高性能、安全。2.为什么要使用存储过程? 简化复杂的操作,把SQL封装起来容易使用。 如果所有开发人员和应用程序都使用同一存储过程,则所有使用的代码都…

SQL创建存储过程

创建SQL存储过程需要使用到的语法 - 创建存储过程 CREATE 存储过程的名称(参数) BEGIN ...需要执行的SQL语句 END- 调用 CALL 存储过程的名称(参数)个人看法,这就是一个函数...无参数 CREATE PROCEDURE p_student_select() BEGIN SELECT * FROM student; ENDCALL …

4.3.1 存储过程的简要介绍

4.3.1 存储过程的简要介绍 1、什么是存储过程? 存储过程是一种命名的PL/SQL代码块。它既可以没有参数,也可以有若干输入、输出参数,甚至可以有多个既作输入又作输出的参数,但他通常没有返回值。 存储过程被保存在数据库中&#x…