408数据结构-哈夫曼树 自学知识点整理

2024-05-13 18:44

本文主要是介绍408数据结构-哈夫曼树 自学知识点整理,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

前置知识:二叉树的概念、性质与存储结构


哈夫曼树

哈夫曼树的定义

首先需要明确几个概念。
路径:从树中的一个结点到另一个结点之间的分支构成这两个结点之间的路径
路径长度:路径上的分支数目称为路径长度
(值):树中结点被赋予的表现或具有某种现实含义的值,这个值称为该结点的。(就是一般存放在 T − > d a t a T->data T>data里的那玩意)
结点的带权路径长度:从树的根到一个结点的路径长度(经过的边数)与该结点上权值的乘积,称为该结点的带权路径长度
例如,对下图中的树,结点 I I I的带权路径长度为 3 × 3 = 9 3×3=9 3×3=9
在这里插入图片描述
树的带权路径长度:树中所有叶结点的带权路径长度之和称为该树的带权路径长度,记为
W P L = ∑ i = 1 ∞ w i l i WPL=\sum\limits_{i=1}^{\infty }{{{w}_{i}}{{l}_{i}}} WPL=i=1wili
式中, w i w_i wi是第 i i i个叶结点所带的权值, l i l_i li是该叶结点到根结点的路径长度。对上图中的树,其带权路径长度为 3 × ( 5 + 1 + 10 + 3 ) = 57 3×(5+1+10+3)=57 3×(5+1+10+3)=57

哈夫曼树:在含有 n n n个带权叶结点的二叉树中,其中带权路径长度( W P L WPL WPL)最小的二叉树称为哈夫曼树,也称最优二叉树

哈夫曼树的构造

给定 n n n个权值分别为 w 1 , w 2 , ⋯ , w n {{w}_{1}},{{w}_{2}},\cdots ,{{w}_{n}} w1,w2,,wn的结点,构造哈夫曼树的算法描述如下:

  1. 将这 n n n个结点分别作为 n n n棵仅含一个结点的二叉树,构成森林 F F F
  2. 构造一个新结点,从 F F F中选取两棵根结点权值最小的树作为新结点的左、右子树,并且将新结点的权值置为左右子树上根结点的权值之和。
  3. F F F中删除刚才选出的两棵树,同时将新得到的树加入 F F F中。
  4. 重复步骤 2 2 2和步骤 3 3 3,直至 F F F中只剩下一棵树为止。

简而言之,就是把所有结点看成只有根节点的二叉树,然后每次从这一坨二叉树里选两个根结点权值最小的作为兄弟结点(无顺序),构成一棵新的二叉树,新二叉树的根结点权值为这两个结点权值的和。一直重复下去直到只剩最后一棵树,就是哈夫曼树,且不唯一。

哈夫曼树的性质

从构造过程中,可以看出哈夫曼树具有如下特点:

  1. 每个初始结点最终都将成为叶结点,且权值越小的结点到根结点的路径长度越大。
  2. 构造过程中共新建了 n − 1 n-1 n1个新结点(且均为双分支结点),因此哈夫曼树的结点总数为 2 n − 1 2n-1 2n1
  3. 每次构造都选择 2 2 2棵树作为新结点的孩子,因此哈夫曼树必是二叉树,且其中不存在度为 1 1 1的结点。

(图片来自王道考研408数据结构2025)
图片来自王道考研408数据结构2025

哈夫曼编码

在数据通信中,若对每个字符用相等长度的二进制位表示,则称这种编码方式为固定长度编码。若允许对不同字符用不等长的二进制位表示,则称这种编码方式为可变长度编码。可变长度编码要比固定长度编码好得多,其特点是对频率高的字符赋以短编码,而对频率较低的字符则赋以较长一些的编码,从而可以使字符的平均编码长度减短,起到压缩数据的效果。

若没有一个编码是另一个编码的前缀,则称这样的编码为前缀编码
由哈夫曼树得到哈夫曼编码,只需将字符中的每个字符作为一个结点,各个字符出现的频度(或次数)作为结点的权值,构造出对应的哈夫曼树。然后,从根到叶结点的路径上分支标记的字符串作为该字符的编码,这样就得到了哈夫曼编码。因为哈夫曼树是不唯一的,所以哈夫曼编码同样也不唯一。
哈夫曼编码常应用在数据压缩中。


在408考研初试中,常考对于一个给定的字符集,如何设计一个哈夫曼编码,其实就是构造一棵哈夫曼树。这一块知识对编写代码不作要求,只需掌握手推即可。
以上。

这篇关于408数据结构-哈夫曼树 自学知识点整理的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/986522

相关文章

基本知识点

1、c++的输入加上ios::sync_with_stdio(false);  等价于 c的输入,读取速度会加快(但是在字符串的题里面和容易出现问题) 2、lower_bound()和upper_bound() iterator lower_bound( const key_type &key ): 返回一个迭代器,指向键值>= key的第一个元素。 iterator upper_bou

【数据结构】——原来排序算法搞懂这些就行,轻松拿捏

前言:快速排序的实现最重要的是找基准值,下面让我们来了解如何实现找基准值 基准值的注释:在快排的过程中,每一次我们要取一个元素作为枢纽值,以这个数字来将序列划分为两部分。 在此我们采用三数取中法,也就是取左端、中间、右端三个数,然后进行排序,将中间数作为枢纽值。 快速排序实现主框架: //快速排序 void QuickSort(int* arr, int left, int rig

数论入门整理(updating)

一、gcd lcm 基础中的基础,一般用来处理计算第一步什么的,分数化简之类。 LL gcd(LL a, LL b) { return b ? gcd(b, a % b) : a; } <pre name="code" class="cpp">LL lcm(LL a, LL b){LL c = gcd(a, b);return a / c * b;} 例题:

6.1.数据结构-c/c++堆详解下篇(堆排序,TopK问题)

上篇:6.1.数据结构-c/c++模拟实现堆上篇(向下,上调整算法,建堆,增删数据)-CSDN博客 本章重点 1.使用堆来完成堆排序 2.使用堆解决TopK问题 目录 一.堆排序 1.1 思路 1.2 代码 1.3 简单测试 二.TopK问题 2.1 思路(求最小): 2.2 C语言代码(手写堆) 2.3 C++代码(使用优先级队列 priority_queue)

《数据结构(C语言版)第二版》第八章-排序(8.3-交换排序、8.4-选择排序)

8.3 交换排序 8.3.1 冒泡排序 【算法特点】 (1) 稳定排序。 (2) 可用于链式存储结构。 (3) 移动记录次数较多,算法平均时间性能比直接插入排序差。当初始记录无序,n较大时, 此算法不宜采用。 #include <stdio.h>#include <stdlib.h>#define MAXSIZE 26typedef int KeyType;typedef char In

两个月冲刺软考——访问位与修改位的题型(淘汰哪一页);内聚的类型;关于码制的知识点;地址映射的相关内容

1.访问位与修改位的题型(淘汰哪一页) 访问位:为1时表示在内存期间被访问过,为0时表示未被访问;修改位:为1时表示该页面自从被装入内存后被修改过,为0时表示未修改过。 置换页面时,最先置换访问位和修改位为00的,其次是01(没被访问但被修改过)的,之后是10(被访问了但没被修改过),最后是11。 2.内聚的类型 功能内聚:完成一个单一功能,各个部分协同工作,缺一不可。 顺序内聚:

STL经典案例(四)——实验室预约综合管理系统(项目涉及知识点很全面,内容有点多,耐心看完会有收获的!)

项目干货满满,内容有点过多,看起来可能会有点卡。系统提示读完超过俩小时,建议分多篇发布,我觉得分篇就不完整了,失去了这个项目的灵魂 一、需求分析 高校实验室预约管理系统包括三种不同身份:管理员、实验室教师、学生 管理员:给学生和实验室教师创建账号并分发 实验室教师:审核学生的预约申请 学生:申请使用实验室 高校实验室包括:超景深实验室(可容纳10人)、大数据实验室(可容纳20人)、物联网实验

rtmp流媒体编程相关整理2013(crtmpserver,rtmpdump,x264,faac)

转自:http://blog.163.com/zhujiatc@126/blog/static/1834638201392335213119/ 相关资料在线版(不定时更新,其实也不会很多,也许一两个月也不会改) http://www.zhujiatc.esy.es/crtmpserver/index.htm 去年在这进行rtmp相关整理,其实内容早有了,只是整理一下看着方

笔记整理—内核!启动!—kernel部分(2)从汇编阶段到start_kernel

kernel起始与ENTRY(stext),和uboot一样,都是从汇编阶段开始的,因为对于kernel而言,还没进行栈的维护,所以无法使用c语言。_HEAD定义了后面代码属于段名为.head .text的段。         内核起始部分代码被解压代码调用,前面关于uboot的文章中有提到过(eg:zImage)。uboot启动是无条件的,只要代码的位置对,上电就工作,kern

C++语法知识点合集:11.模板

文章目录 一、非类型模板参数1.非类型模板参数的基本形式2.指针作为非类型模板参数3.引用作为非类型模板参数4.非类型模板参数的限制和陷阱:5.几个问题 二、模板的特化1.概念2.函数模板特化3.类模板特化(1)全特化(2)偏特化(3)类模板特化应用示例 三、模板分离编译1.概念2.模板的分离编译 模版总结 一、非类型模板参数 模板参数分类类型形参与非类型形参 非类型模板