哈夫曼树、带权路径长度、前缀编码 的概念

news2025/6/9 14:43:32

文章目录

  • 一、基本概念
    • 1.1带权路径长度(WPL)
    • 1.2哈夫曼树
  • 二、哈夫曼树的构造
  • 三、哈夫曼树的应用
    • 3.1哈夫曼编码与前缀编码

一、基本概念

1.1带权路径长度(WPL)

路径长度: 经历的边数
结点的带权路径长度: 从树的根到该结点的路径长度 X 该结点上权值。

举例帮助理解
在这里插入图片描述
图中结点A的带权路径长度为: 3 × 5 = 15 3\times5=15 3×5=15
图中结点D的带权路径长度为: 2 × 2 = 4 2\times 2=4 2×2=4


1.2哈夫曼树

树的带权路径长度: 所有叶子结点的带权路径长度之和
哈夫曼树: 在含n个带权结点的二叉树中,带权路径最小的二叉树,又称最优二叉树

【注意】:哈夫曼树是最小带权二叉树,此处指树的带权路径长度(所有叶子结点WPL之和)

二、哈夫曼树的构造

给定n个权值分别为 w 1 , w 2 , w 3 , . . . , w n w_1,w_2,w_3,...,w_n w1,w2,w3,...,wn的结点,构造哈夫曼树的算法描述如下:

  1. 每次从结点集合中选择最小的两个结点,作为新结点的左右子树。
  2. 新结点的权值为被选出的两个结点权值之和。
  3. 删除旧的两个结点,将新结点加入集合
  4. 重复123步骤,直至集合中只剩一个结点

举例帮助理解:
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
至此,哈夫曼树构造完毕
W P L = 7 ∗ 1 + 3 ∗ ( 1 + 2 + 2 + 3 ) = 31 WPL=7*1+3*(1+2+2+3)=31 WPL=71+3(1+2+2+3)=31


三、哈夫曼树的应用

3.1哈夫曼编码与前缀编码

笔者在学习过程中,一直不明白,为什么哈夫曼树中,最小带权路径长度,是指所有叶子结点的WPL之和。也就是说,a,b,c,d都只能为叶子结点。
在这里插入图片描述
在此篇文章的案例中给出了答案。


可变长度编码: 允许对不同字符用不等长的二进制位表示
为了使编码的长度更短,进行可变长度编码,频率越高的码,对应的位数越少。根据我们所学的知识,可用哈夫曼树来解决。


举例帮助理解
学霸小甲答应告诉学渣小乙考试答案。他们决定用二进制编码来防止老师发现。
已知:C的出现频率为40%,A为30%,B为20%,D为10%
在这里插入图片描述
这里给出了答案。
对同一答案CAAABD
正确的哈夫曼编码应该为
0101010111110
而错误的哈夫曼编码为
01111110

只用肉眼看,是看不出问题在哪里的。一个合格的编码唯一对应一个答案。那么我们就从得到的编码逆向推导答案。

01111110得到的答案不唯一
0 11 11 11 0 = C B B B C??
0 1 1 1 1 1 1 0 = C A A A A A A C??
在读到A时,哈夫曼树仍可往下读得到B,D。(B,D的编码包含A)
因此,无法判断一个答案的范围。

0101010111110得到的答案唯一
0 10 10 10 111 110
= C A A A B D
而在正确编码中,读到A/B/C/D时,均为叶子结点,哈夫曼树不可往下读。也就实现了自动截断


总结如上,要使编码之间不冲突,则编码之间是互相独立的,没有一个编码是另一个编码的前缀。这样的编码称之为前缀编码
哈夫曼编码就是一种前缀编码

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/334275.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

创建线程的三种模式

进程,是对运行时程序的封装,是系统进行资源调度和分配的基本单位,实现了操作系统的并发。 线程,是进程的子任务,是CPU调度和分派的基本单位,实现了进程内部的并发。 线程在进程下运行。 进程之间不会影响…

从0到1一步一步玩转openEuler--09 openEuler基础配置--设置日期和时间

文章目录9 设置日期和时间9.1 使用timedatectl命令设置9.1.1 显示日期和时间9.1.2 通过远程服务器进行时间同步9.1.3 修改日期9.1.4 修改时间9.1.5 修改时区9.2 使用date命令设置9.2.1 显示当前的日期和时间9.2.2 修改时间9.2.3 修改日期9.3 使用hwclock命令设置9.3.1 硬件时钟…

QT之OpenGL深度测试

QT之OpenGL深度测试1. 深度测试概述1. 1 提前深度测试1.2 深度测试相关函数2. 深度测试精度2.1 深度冲突3. Demo4. 参考1. 深度测试概述 在OpenGL中深度测试(Depth Testing)是关闭的,此时在渲染图形时会产生一种现象后渲染的会把最先渲染的遮挡住。而在启用深度测试…

浏览器的底层运行机制

一、复习 1.进程和线程 进程:指一个程序(或浏览器打开一个页面就是开辟一个进程)* 线程:程序中具体执行任务的一个进程中可能包含一到多个线程!!* 单线程:同时只能处理一件事,上一件事处理完,…

ASEMI三相整流模块MDS55-16特征,MDS55-16应用

编辑-Z ASEMI三相整流模块MDS55-16参数: 型号:MDS55-16 最大重复峰值反向电压(VRRM):1600V 最大RMS电桥输入电压(VRMS):1700V 最大平均正向整流输出电流(IF&#xf…

MySQL架构图

MySQL架构图 Mysql逻辑架构图主要分三层: 1) 第一层负责连接处理,授权认证,安全等等 每个客户端连接都会在服务器进程中拥有一个线程,服务器维护了一个线程池,因此不需要为每一个新建的连接创建或者销毁线程。 当客户…

看板管理对项目管理有什么帮助?

在目前市面上的项目管理工具中,项目看板功能基本上成为了标配。看板作为敏捷的项目管理工具,可以帮助我们将项目工作可视化展现。项目看板的作用1,提高团队信息流动性:看板工具可以及时的传递项目工作中的最新讯息,保证…

Mapper文件注入问题

Mapper文件注入问题UserMapper that could not be found.原因分析解决方案程序正常运行,但是注入类爆红问题原因分析解决方法UserMapper’ that could not be found. 原因分析 撰写了mapper文件,但是没有注入spring容器 解决方案 添加mybatis.mapper-…

DVWA—CSRF-Medium跨站请求伪造中级

注意: 1、这里对XSS(Stored)关卡不熟悉的可以从这里去看http://t.csdn.cn/ggQDK 2、把难度设置成 Medium 一、这一关同样我们需要埋下伏笔,诱使用户点击来提交,首先从XSS(Stored)入手。 注意:在前面介绍…

黑马】后台项目171集

将近一个月没有练习了,找到之后果然打不开出了问题【问题】运行代码打开网页后,发现不能正常登录,一开始还以为是密码记错了,后来发现是数据库没有正常启动,phpstudy中的数据库一直是启动状态,关闭不了。【…

这个神器,让 Python 爬虫如此简单

相信大家应该都写过爬虫,简单的爬虫只需要使用 requests 即可。遇到复杂的爬虫,就需要在程序里面加上请求头和参数信息。类似这种: 我们一般的步骤是,先到浏览器的网络请求中找到我们需要的请求,然后将请求头和参数信…

【运筹优化】带时间窗约束的车辆路径规划问题(VRPTW)详解 + Python 调用 Gurobi 建模求解

文章目录一、概述1.1 VRP 问题1.2 CVRP 问题1.3 VRPTW 问题二、VRPTW 的一般模型三、Python 调用 Gurobi 建模求解3.1 Solomn 数据集3.2 完整代码3.3 运行结果展示3.3.1 测试案例:c101.txt3.3.2 测试案例:r101.txt一、概述 1.1 VRP 问题 车辆路径规划问…

一场深度的IT效率革命:低代码市场加速嬗变

尽管IT技术支撑了全球的信息化浪潮,然而困扰行业已久的软件开发效率却难以像摩尔定律一样快速提升,甚至已经成为了一种瓶颈,在困扰着行业的继续发展。一边是码农们高喊着996的境况,另一边是程序员的生产力并没有用在更具价值的生产…

Qml学习——布局

最近在学习Qml,但对Qml的各种用法都不太熟悉,总是会搞忘,所以写几篇文章对学习过程中的遇到的东西做一个记录。 学习参考视频:https://www.bilibili.com/video/BV1Ay4y1W7xd?p1&vd_source0b527ff208c63f0b1150450fd7023fd8 目…

C++ 浅谈之 STL List

C 浅谈之 STL List HELLO,各位博友好,我是阿呆 🙈🙈🙈 这里是 C 浅谈系列,收录在专栏 C 语言中 😜😜😜 本系列阿呆将记录一些 C 语言重要的语法特性 🏃&am…

如何在Visual Studio、Clion、Msys2中安装和使用vcpkg

首先事情是在安装了Msys2之后,想在Clion中使用安装在Msys2中的vcpkg。但是折腾了很久还是无法解决。于是就折腾出了这篇文章,和下一篇如何在Clion使用vcpkg的文章。 不过,由于我电脑上已近配置好了vcpkg以及环境变量,要是重新删除…

【C】ASCII 的十六进制字符转文件

概述 本项目是我自己使用的 来源于用串口传文件数据到电脑进行分析的时候,需要转换成可以打开的文件 而常用的串口助手大都没有直接保存为二进制文件的功能 也完全可以当作c语言初学者的练习项目(很简单) 需求 用串口传来的文件是如下格式(ASCII字符) 需要将其转化为二进制数据…

Netty相关面试题

文章目录TCP、UDP的区别?同步与异步、阻塞与非阻塞的区别?BIO、NIO、AIO分别是什么?Netty跟Java NIO有什么不同,为什么不直接使用JDK NIO类库?Netty的粘包/拆包是怎么处理的,有哪些实现?说说Net…

网络安全的就业及发展前景如何?

网络空间安全专业简称“网络安全专业”,主要以信息构建的各种空间领域为主要研究对象,包括网络空间的组成、形态、安全、管理等。该专业致力于培养“互联网”时代能够支撑和引领国家网络空间安全领域的具有较强的工程实践能力,系统掌握网络空…

完美!终于有人把《数据结构与算法》讲透彻了(附源码笔记),复杂的问题变简单了

开篇 数据结构是计算机科学与技术专业非常重要的一门核心基础课,计算机科学各个领域以及各种应用软件都要使用相关的数据结构和算法。 本篇的主要目的不是提供关于数据结构和算法的定理及证明。本书采用的模式是利用不同的复杂度改善问题的解决(对于每个问题&…