哈夫曼树和哈夫曼编码

哈夫曼树

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

基本概念

哈夫曼树(霍夫曼树)又称为最优树.

1、路径和路径长度

在一棵树中,从一个结点往下可以达到的孩子或孙子结点之间的通路,称为路径。通路中分支的数目称为路径长度。若规定根结点的层数为1,则从根结点到第L层结点的路径长度为L-1。

2、结点的权及带权路径长度

若将树中结点赋给一个有着某种含义的数值,则这个数值称为该结点的权。结点的带权路径长度为:从根结点到该结点之间的路径长度与该结点的权的乘积。

3、树的带权路径长度

树的带权路径长度规定为所有叶子结点的带权路径长度之和,记为WPL。

哈夫曼树的构造

哈夫曼树的构造

假设有n个权值,则构造出的哈夫曼树有n个叶子结点。 n个权值分别设为 w1、w2、…、wn,则哈夫曼树的构造规则为:

(1) 将w1、w2、…,wn看成是有n 棵树的森林(每棵树仅有一个结点);

(2) 在森林中选出两个根结点的权值最小的树合并,作为一棵新树的左、右子树,且新树的根结点权值为其左、右子树根结点权值之和;

(3)从森林中删除选取的两棵树,并将新树加入森林;

(4)重复(2)、(3)步,直到森林中只剩一棵树为止,该树即为所求得的哈夫曼树。

举例

简易的理解就是,假如我有A,B,C,D,E五个字符,出现的频率(即权值)分别为5,4,3,2,1,那么我们第一步先取两个最小权值作为左右子树构造一个新树,即取1,2构成新树,其结点为1+2=3,如图:

这里写图片描述

虚线为新生成的结点,第二步再把新生成的权值为3的结点放到剩下的集合中,所以集合变成{5,4,3,3},再根据第二步,取最小的两个权值构成新树,如图:

这里写图片描述

再依次建立哈夫曼树,如下图:
这里写图片描述

其中各个权值替换对应的字符即为下图:

哈夫曼编码

这里写图片描述

所以各字符对应的编码为:A->11,B->10,C->00,D->011,E->010

霍夫曼编码是一种无前缀编码。解码时不会混淆。其主要应用在数据压缩,加密解密等场合。

我的微信二维码如下,欢迎交流讨论

这里写图片描述

欢迎关注《IT面试题汇总》微信订阅号。每天推送经典面试题和面试心得技巧

微信订阅号二维码如下:

这里写图片描述

<script type="text/javascript"> $(function () { $('pre.prettyprint code').each(function () { var lines = $(this).text().split('\n').length; var $numbering = $('<ul/>').addClass('pre-numbering').hide(); $(this).addClass('has-numbering').parent().append($numbering); for (i = 1; i <= lines; i++) { $numbering.append($('<li/>').text(i)); }; $numbering.fadeIn(1700); }); }); </script>
构造哈夫曼树和生成哈夫曼编码 一、什么是哈夫曼树? 哈夫曼树是一种带权路径长度最短的二叉树,也称为最优二叉树。用一幅图来说明: 它们的带权路径长度分别为: 图a: WPL=5*2+7*2+2*2+13*2=54 图b: WPL=5*3+2*3+7*2+13*1=48 可见,图b的带权路径长度较小,可以证明图b就是哈夫曼树(也称为最优二叉树)。 二、如何构建哈夫曼树 一般按下面步骤构建: 1,将所有左,右子树... 阅读详情

相关推荐

哈夫曼树与哈夫曼编码——c语言详解

本文目录:哈夫曼编码c语言实现1. 前言2. 定义数据结构3. 构建哈夫曼树4. 构造哈夫曼编码5. 输出哈夫曼编码6. 测试程序7. 程序汇总 哈夫曼编码c语言实现 1. 前言 本学期数据结构课程使用的教材为清华大学出版社的《 数据结构(c语言版)》,由于书中采用了很多伪码,使得对c语言掌握不是很熟悉的同学有学习上的困难。所以二叉树章节中,我尝试编写出更适合新手的哈夫曼编码的c语言程序,一方面帮...

yuckai的博客 5935

哈夫曼树最优性的证明(思考良久)

哈夫曼树为什么就是最优树??怎么去证明!!?? 证明围绕着两个东西(一定要先看,而且要能够认同): 1. 现在还不知道树长什么模样,但不管怎样,可以确定:最小的两个权值是在整棵树的最下段的两片叶子,而且这两片叶子是兄弟关系 2.承认上面这句话,那么你就是认同最小的两个权值是是叶子而且是兄弟关系,由此,这两个叶子必定是连接于同一个节点即他们的父节点,该父节点一定是内节点,不是叶子节点。

Zetaa的博客 1万+

数据结构与算法 -- 哈夫曼树&哈夫曼编码

数据结构与算法 -- 哈夫曼树&哈夫曼编码前言1. 哈夫曼树2. 哈夫曼编码3. 哈夫曼树 & 哈夫曼编码 的实现 前言   上一篇了解学习了线索化二叉树的一些知识,这一篇,对哈夫曼树和哈夫曼编码来做一个了解学习。 首先,我们先看一个经典的问题, 等级 优秀 良好 中等 及格 不及格 考分 90 <= 分数 <= 100 80 <= 分数 <...

LiangliangSpeak的博客 3195

Huffman coding —— 优先队列

以一道题引入: 题目给出的样例和提示: 总结下题意: 利用哈夫曼编码给各个字符编码,求出最小的总字节数,即每个字符的编码数乘以字符的权重(这里是指字符出现的次数),得到每个字符的字节数,再对所有字符的字节数求和。思路: 哈夫曼编码每次都是取权值最小的两个合并,因此每次都需要排序,这可以用到优先队列(priority_queue)。 提到哈夫曼编码,可能最先想到的最建一棵树,然后算出每个叶子

CJX_up的博客 788

构造哈夫曼树和哈夫曼编码的算法实现

1、实验内容: 统计下面一段英文的不同字符个数和每个字符的出现频率,利用统计数据构造构造哈夫曼树和哈夫曼编码 The Chinese official said he viewed the Trump Presidency not as an aberration but as the product of a failing political system. This jibes with o...

weixin_44008781的博客 2678

哈夫曼编码和哈夫曼树

哈夫曼编码通过构建最优二叉树实现高效压缩,是经典的数据压缩算法之一。理解其核心思想(贪心算法)和实现步骤(构建树、生成编码),是掌握数据压缩技术的基础。

m0_66655785的博客 1158

哈夫曼编码的理解(Huffman Coding)

哈夫曼编码(Huffman Coding),又称霍夫曼编码,是一种编码方式,可变字长编码(VLC)的一种。Huffman于1952年提出一种编码方法,该方法完全依据字符出现概率来构造异字头的平均长度最短的码字,有时称之为最佳编码,一般就叫做Huffman编码(有时也称为霍夫曼编码)。 哈夫曼编码,主要目的是根据使用频率来最大化节省字符(编码)的存储空间。 简易的理解就是,假如我有A,B,C,D...

随风而逝的博客 1220

哈夫曼树、哈夫曼编码详解

哈夫曼树、哈夫曼编码,也就这么一回事,一文搞懂!

bigsai 1万+

【数据结构与算法】-哈夫曼树(Huffman Tree)与哈夫曼编码

超详细讲解哈夫曼树(Huffman Tree)以及哈夫曼编码的构造原理、方法,并用代码实现。

闪耀大叔的博客 8万+

【脑电分析系列】第7篇:频域分析基石 — 功率谱密度(PSD)的计算与常见方法对比

本文探讨了脑电图(EEG)频域分析的核心方法——功率谱密度(PSD)。通过对比基于快速傅里叶变换的周期图法和更稳健的Welch's方法,指出后者通过分段、加窗和平均处理,能有效降低估计方差,更适合分析非稳态的脑电信号。文章详细解析了关键参数设置对频率分辨率和统计稳定性的影响,并提供了Python计算实现。PSD分析将复杂的脑电信号转换为直观的频域特征,为研究认知功能和神经疾病提供重要依据。

qq_32516809的博客 1801

绕过限制?实测修改UA在PC端运行微信小程序的可行性及风险

本文探讨了通过修改User-Agent(UA)在PC端运行微信小程序的技术可行性及风险。分析了小程序设备限制的技术原理,包括`wx.getSystemInfo`API和UA检测机制,并提供了多种修改方案及其局限性。同时强调了潜在的安全和法律风险,推荐使用官方模拟器或安卓模拟器等更安全的替代方案。

weixin_30879169的博客 362

哈夫曼树(Huffman Tree)及哈夫曼编码(Huffman Coding)

哈夫曼树(Huffman Tree)又称最优二叉树,给定N个权值作为N个叶子结点,构造一棵二叉树,使该树的带权路径长度达到最小。哈夫曼树是带权路径长度最短的树,权值较大的结点离根较近。 哈夫曼编码(Huffman Coding),又称霍夫曼编码,是一种编码方式,哈夫曼编码是可变字长编码(VLC)的一种。该方法完全依据字符出现概率来构造异字头的平均长度最短的码字,有时称之为最佳编码,一般就叫做Huffman编码(有时也称为霍夫曼编码)。 本文所有概念性描述及图示均来自王道考研数据结构。...

lranqi的博客 1万+

手把手教你用西门子博图V18配置阿特拉斯PF6000拧紧枪PN通讯(附完整GSD文件与ToolsTalk配置文件)

本文详细介绍了如何使用西门子博图V18配置阿特拉斯PF6000拧紧枪的PN通讯,包括硬件连接、网络参数规划、ToolsTalk软件配置及博图工程设置。通过完整的GSD文件和配置文件,帮助工程师快速实现高精度拧紧设备与PLC的高效通讯,适用于汽车装配和电子制造等工业自动化场景。

weixin_42662293的博客 601

哈夫曼树,哈夫曼编码及解码详解

给定报文中26个字母a-z及空格的出现频率{64, 13, 22, 32, 103, 21, 15, 47, 57, 1, 5, 32, 20, 57, 63, 15, 1, 48, 51, 80, 23, 8, 18, 1, 16, 1, 168},构建哈夫曼树并为这27个字符编制哈夫曼编码,并输出。模拟发送端,从键盘输入字符串,以%为结束标记,在屏幕上输出输入串的编码;模拟接收端,从键盘上输入0-1哈夫曼编码串,翻译出对应的原文。

princekin 9738

Cygwin安装教程

简介 cygwin是一个在windows平台上运行的unix模拟环境,是cygnus solutions公司开发的自由软件 Cygwin就是一个windows软件,该软件就是在windows上仿真linux操作系统 简言之,cygwin是一个在windows平台上运行的 linux模拟环境,使用一个Dll(动态链接库)来实现 这样,我们可以开发出Cygwin下的UNIX工具,使用这个DLL运行在W...

Errol's Blog 13万+

Qt Creator牵手DeepSeek,开启AI开发新征程

Qt Creator 是一款功能强大的跨平台集成开发环境(IDE),专为 Qt 应用程序开发量身定制。它支持在编程过程中使用 GitHub Copilot 等编码助手,能帮助开发者为桌面、移动端和嵌入式平台创建软件。在代码编辑方面,Qt Creator 具备代码补全、语法突出显示、重构等功能,内置文档也随手可得,极大提高了代码编写的效率和准确性。

远程部署调试 运行安装 项目调试 二次开发 项目技术新 持续迭代 部分源码免费分享 7185

C++实现哈夫曼树与哈夫曼编码

哈夫曼树的存储表示 typedef char ElemType; typedef struct { ElemType data; //结点存的数据 int weight; //结点的权值 int parent,lchild,rchild; //结点的双亲、左孩子、右孩子的下标 } HTNode,*HuffmanT...

WYJ的博客 1万+

optee技术简介

OP-TEE(Open Portable Trusted Execution Environment)是一种开源的可信执行环境(TEE),专为ARM TrustZone架构设计。TEE是一种独立的执行环境,运行在主操作系统之外,为敏感任务提供安全的计算空间,如加密、身份验证、密钥管理等。

baron-周贺贺-代码改变世界ctw 1279

详解哈夫曼树和哈夫曼编码

哈哈夫曼树一、初始化函数init()二、合并操作unite()三、查询树根函数find()四、改进后的合并操作unite()五、改进后的find()六、判断是否属于同一集合same()并查集的复杂度并查集的实现代码 哈夫曼树 并查集是一种用来管理元素分组情况的数据结构,可以高效地进行查询、合并操作,但无法进行分割操作。 1.查询元素a和元素b是否属于同一组 2.合并元素a和元素b所在的组 并查集使用树形结构实现,但不是二叉树。 在并查集中,无需关注元素的兄弟、父亲是谁或树的结构如何,只需要关注元.

qq_45929428的博客 9407

Video Diffusion Models:基于扩散模型的视频生成

Diffusion Models专栏文章汇总:入门与实战 前言:扩散模型已经被广泛运用到图像生成、image-to-image转换、时间序列生成、3D点云生成、文本生成、音频生成等领域,谷歌研究院最新的研究成果成功将diffusion models运用到视频生成领域。 目录 模型结构 分解时空体系联合训练 梯度条件法 恐怖的实验结果 论文和代码 个人启发 个人疑问? 模型结构 在前面的博文中,我详细介绍了为什么绝大部分的diffusion models都使用Unet结构.

沉迷单车的追风少年 6670

Outlook Express 6 (OE6) for Win7/Win8/Win10

英文版 Outlook Express6.0, 兼容Win7/Win10/WinXP,解压就可用。

哈夫曼树及哈夫曼编码 C++

用C++实现哈夫曼树以及哈夫曼编码。 代码说明: 1.读取文件中需进行哈夫曼编码的数据信息 2.构造生成单节点二叉树组 -> 森林 3.构造哈夫曼树 4.进行哈夫曼编码 5.输出对应数据及其编码

J.Anson的博客 1万+

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

数据结构C++——哈夫曼树及哈夫曼编码

数据结构(C++)——哈夫曼树及哈夫曼编码 文章目录数据结构(C++)——哈夫曼树及哈夫曼编码一、哈夫曼树的介绍及概念二、哈夫曼树的构造及打印①哈夫曼树的存储结构②构造哈夫曼树③Select()函数的代码实现④打印哈夫曼树⑤测试的完整代码二、哈夫曼编码①哈夫曼编码的相关概念②哈夫曼编码的算法实现③输出哈夫曼编码④测试的完整代码三、总结 一、哈夫曼树的介绍及概念 哈夫曼(Huffman)树又称最优树,是一类带权路径长度最短的树,在实际中有广泛的用途。 (1) 路径:从树中一个结点到另一个结点之间的分支构成这两

qq_54162207的博客 7802

温度PID控制PLC程序

温度PID稳定控制程序,适用于欧姆龙PLC,对其他PLC也具有很大参考价值

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

PTA 哈夫曼树与哈夫曼编码

输入格式: 输入有3行。 第1行:符号个数n(2~20)。 第2行:一个不含空格的字符串。记录着本题的符号表。我们约定符号都是单个的小写英文字母,且从字符‘a’开始顺序出现。也就是说,如果 n 为 2 ,则符号表为 ab ;如果 n 为 6,则符号为 abcdef;以此类推。 第3行:各符号出现频率(用乘以100后的整数),用空格分隔。 输出格式: 先输出构造的哈夫曼树带权路径长度。 接下来输出n行,每行是一个字符和该字符对应的哈夫曼编码。字符按字典顺序输出。字符和哈夫曼编码之间以冒号分隔。 例如: a:.

不导翁的博客 5643

【数据结构】哈夫曼树和哈夫曼编码

本篇文章围绕哈夫曼树进行讲解,包含哈夫曼树的概念、构造和哈夫曼编码

Eristic0618的博客 2519
上一篇: 操作系统基础(一)
下一篇: 二叉树的性质
fengsehng2000
博客等级 码龄10年 2粉丝 2原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值