数据结构【哈夫曼树】

news2025/1/12 3:58:16

哈夫曼树

  • 哈夫曼树的概念
  • 哈夫曼树的构造
  • 构造算法的实现
  • 哈夫曼树应用
    • 哈夫曼编码
    • 哈夫曼编码的算法实现

哈夫曼树的概念

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

涉及到的几个概念:
路径:
从树中一个结点到另一个结点之间的分支构成这两个结点间的路径。
结点的路径长度:
两结点间路径上的分支数。
树的路径长度:
从树根到每一个结点的路径长度之和。记作: TL。
权(weight):
将树中结点赋给一个有着某种含义的数值则这个数值称为该结点的权。
结点的带权路径长度:
从根结点到该结点之间的路径长度与该结点的权的乘积。
树的带权路径长度:
树中所有叶子结点的带权路径长度之和。
二叉树的带权路径长度 (Weighted Path Length):
二叉树的路径长度是指由根结点到所有叶子结点的路径长度之和。
如果二叉树中的所有叶子结点都具有一个特定的权值,则可将这一概念加以推广。设二叉树具有n个带权值的叶子结点,那么从根结点到各个叶子结点的路径长度与该叶子结点相应的权值的乘积之和叫做又树的带权路径长度,记为:
在这里插入图片描述
其中,wk为第k个叶子结点的权值,Lk为第k个叶子结点的路径长度。
在这里插入图片描述
最优树:带权路径长度(WPL)最短的树

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

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

因为构造这种树的算法是由哈夫曼教授于 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个新节点。

构造算法的实现

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

typedef struct (
	int weight;
	int parent, lch, rch;
)HTNode,*HuffmanTree;

先初始化再构造
1.初始化HT[1…2n-1]: lch=rch=parent=0;
2. 输入初始n个叶子结点: 置HT[1…n]的weight值;
在这里插入图片描述
3.进行以下n-1次合并,依次产生n-1个结点HT[i],i=n+1…2n-1:
a) 在HT[1.i-1]中选两个未被选过(从parent ==_0 的结点中选)的weight最小的两个结点HT[s1]和HT[s2],s1、s2为两个最小结点下标;
修改HT[s1]和HT[s2]的parent值: HT[s1] .parent=i; HT[s2] .parent=i;b)修改新产生的HT[i]:
HT[il.weight=HT[s1].weight + HT[s2].weight
HT[i]. lch=s1; HT[i]. rch=s2;
在这里插入图片描述

哈夫曼树应用

哈夫曼编码

在这里插入图片描述

哈夫曼编码的算法实现

在这里插入图片描述
示例:
在这里插入图片描述

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

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

相关文章

c++ 拷贝构造

我们思考一下这个问题&#xff1a; 观察以下代码&#xff0c;在运行的时候会崩溃 想一想为什么 #include<iostream> using namespace std;//栈类 typedef int DataType; class Stack { public://默认构造&#xff1a;Stack(size_t capacity 3){_array (DataType*)ma…

在广告宣传领域,PS透明屏有哪些优点表现?

PS透明屏是一种新型的显示技术&#xff0c;它将传统的显示屏幕与透明材料相结合&#xff0c;使得屏幕能够同时显示图像和透过屏幕看到背后的物体。 这种技术在商业展示、广告宣传、产品展示等领域有着广泛的应用前景。 PS透明屏的工作原理是利用透明材料的特性&#xff0c;通…

iTOP-i.MX8MM开发板添加 isb 转串口设备驱动

对于通过 USB 接口访问的模块&#xff0c;在 Linux 内核中集成 USB 驱动程序。我们需要配置内核选中支持 GSM 和 CDMA 模块的 USB 转串口驱动 > Device Drivers -> USB support (USB_SUPPORT [y]) -> USB Serial Converter support (USB_SERIAL [y]) -> USB dr…

计算机网络(7) --- UDP协议和TCP协议

计算机网络&#xff08;6&#xff09; --- https协议_哈里沃克的博客-CSDN博客https协议https://blog.csdn.net/m0_63488627/article/details/132112683?spm1001.2014.3001.5501 目录 1.补充知识 1.PORT端口号 2.端口号范围划分 3.知名端口号 2.UDP协议 1.UDP报头 2.U…

EVE-NG MPLS 静态 LSP

1 拓扑 2 配置步骤 2.1 配置接口IP 和路由 LER1 interface GigabitEthernet1/0ip address 10.1.1.1 255.255.255.0quitinterface GigabitEthernet2/0ip address 11.1.1.1 255.255.255.0quitip route-static 21.1.1.0 24 10.1.1.2VPC1 ip 11.1.1.100/24 11.1.1.1 配置完成后…

LeetCode--HOT100题(22)

目录 题目描述&#xff1a;160. 相交链表&#xff08;简单&#xff09;题目接口解题思路代码 PS: 题目描述&#xff1a;160. 相交链表&#xff08;简单&#xff09; 给你两个单链表的头节点 headA 和 headB &#xff0c;请你找出并返回两个单链表相交的起始节点。如果两个链表…

gradle项目Connection timed out,build时先下载gradle问题download gradle-x.x-bin.zip

IDEA 导入 Gradle 项目&#xff0c;编译的时候会默认下载 配置版本的Gradle.zip问题&#xff0c;一般会下载失败&#xff0c;提示Connection timed out&#xff0c;连接超时。 解决办法&#xff1a; 修改项目根目录下gradle目录下的gradle-wrapper.properties文件&#xff0c;…

小红书投放复盘怎么做,达人流量统计

作为众多品牌进行产品宣推与传播的重要阵地&#xff0c;红薯一直以来都备受关注。而随着平台投放成本的水涨船高&#xff0c;如何优化投放结果&#xff0c;就成了关键问题。所以&#xff0c;今天就来分享一下&#xff0c;小红书投放复盘怎么做&#xff0c;达人流量统计&#xf…

《操作系统真象还原》学习笔记:第六章 完善内核

一.函数调用约定简介 调用约定&#xff0c;calling conventions&#xff0c;从字面上理解&#xff0c;它是调用函数时的一套约定&#xff0c;是被调用代码的接口&#xff0c;它体现在&#xff1a; 参数的传递方式&#xff0c;是放在寄存器中&#xff1f;栈中&#xff1f;还是…

JavaSE知识点整理---集合篇

文章目录 1、数组与集合的区别?2、List、Set、Map的区别&#xff1f;3、ArrayList、LinkedList、Vector的区别&#xff1f;4、Java集合的快速失败机制【fail-fast】5、List接口常用方法6、List的三种遍历方式 1、数组与集合的区别? 在Java中&#xff0c;数组和集合都是容器&a…

如何使用 reqwest 包

GET 请求 向连接发起一个 GET 请求&#xff1a;https://hacker-news.firebaseio.com/v0/topstories.json&#xff0c;并解析返回的内容。 尝试发起请求 因为是 GET 请求&#xff0c;可以先在浏览器中进行查看&#xff0c;浏览器可以正常显示一个 id 列表&#xff0c;如下所示…

24届华东理工大学近5年自动化考研院校分析

今天给大家带来的是华东理工大学控制考研分析 满满干货&#xff5e;还不快快点赞收藏 一、华东理工大学 学校简介 华东理工大学原名华东化工学院&#xff0c;1956年被定为全国首批招收研究生的学校之一&#xff0c;1960年起被中共中央确定为教育部直属的全国重点大学&#…

【Winform学习笔记(七)】Winform无边框窗体拖动功能

Winform无边框窗体拖动功能 前言正文1、设置无边框模式2、无边框窗体拖动方法1、通过Panel控件实现窗体移动2、通过窗体事件实现窗体移动3、调用系统API实现窗体移动4、重写WndProc()实现窗体移动 前言 在本文中主要介绍 如何将窗体设置成无边框模式、以及实现无边框窗体拖动功…

Java中的enum枚举类型

知识介绍 在Java中&#xff0c;enum&#xff08;枚举&#xff09;是一种特殊的数据类型&#xff0c;用于定义一组命名的常量。枚举类型允许你在代码中创建一个固定的、预定义的值集合&#xff0c;这些值可以在整个程序中使用。使用枚举可以使代码更加清晰、可读&#xff0c;并…

Bootload U-Boot分析

Bootloader是在操作系统运行之前执行的一段小程序。通过这段小程序可以初始化硬件设备、建立内存空间的映射表&#xff0c;从而建立适当的系统软硬件环境&#xff0c;为最终调用操作系统内核做好准备。 对于嵌入式系统&#xff0c;Bootloader是基于特定硬件平台来实现的。因此…

【Hystrix技术指南】(5)Command创建和执行实现

创建流程 构建HystrixCommand或者HystrixObservableCommand对象 *使用Hystrix的第一步是创建一个HystrixCommand或者HystrixObservableCommand对象来表示你需要发给依赖服务的请求。 若只期望依赖服务每次返回单一的回应&#xff0c;按如下方式构造一个HystrixCommand即可&a…

FreeRTOS(vTaskList与vTaskGetRunTimeStats)

目录 1、Cube配置 ①配置SYS ②配置TIM3 ③配置USART2 ④配置FreeRTOS ⑤配置中断优先级 2、代码添加改动 ①在main函数合适位置开启TIM3中断 ②修改HAL_TIM_PeriodElapsedCallback函数 ③完善两个相关函数 ④vTaskList与vTaskGetRunTimeStats的使用 vTaskList&#xff…

C# 有效的字母异位词

242 有效的字母异位词 给定两个字符串 和 &#xff0c;编写一个函数来判断 是否是 的字母异位词。stts 注意&#xff1a;若 和 中每个字符出现的次数都相同&#xff0c;则称 和 互为字母异位词。stst 示例 1: 输入: s “anagram”, t “nagaram” 输出: true 示例 2: 输…

探索国产嵌入式Python解决方案的方法(开源)

大家好&#xff0c;今天我们要介绍一款适用于单片机的嵌入式Python开源项目 -- PikaPython。 第一&#xff1a;嵌入式Python的发展趋势 在嵌入式领域软硬件的发展趋势中&#xff0c;硬件的成本日益降低&#xff0c;性能逐渐提升。这种趋势使得Python在芯片上的运行难度已经大大…

学python的心得体会1000字,学python的心得体会2000字

这篇文章主要介绍了学python的心得体会2000字&#xff0c;具有一定借鉴价值&#xff0c;需要的朋友可以参考下。希望大家阅读完这篇文章后大有收获&#xff0c;下面让小编带着大家一起了解一下。 1. 初学者应该从简单的练习开始&#xff0c;先掌握基本的语法和概念&#xff0c;…