数据结构历年考研真题对应知识点(哈夫曼树和哈夫曼编码)

news2024/11/14 3:17:45

目录

5.5.1哈夫曼树和哈夫曼编码

1.哈夫曼树的定义

2.哈夫曼树的构造

【分析哈夫曼树的路径上权值序列的合法性(2010)】

【哈夫曼树的性质(2010、2019)】

3.哈夫曼编码

【根据哈夫曼编码对编码序列进行译码(2017)】

【哈夫曼树的构造及相关的分析(2012、2018、2021、2023)】

【前缀编码的分析及应用(2014、2020)】

【哈夫曼编码和定长编码的差异(2022)】

5.5.2并查集(补充)

1.并查集的概念

2.并查集的存储结构

 3.并查集的基本实现

4.并查集实现的优化


5.5.1哈夫曼树和哈夫曼编码

1.哈夫曼树的定义

在介绍哈夫曼树之前,先介绍几个相关的概念:

从树中一个结点到另一个结点之间的分支构成这两个结点之间的路径

路径上的分支数目称为路径长度

在许多应用中,树中结点常常被赋予一个表示某种意义的数值,称为该结点的

从树的根到一个结点的路径长度与该结点上权值的乘积,称为该结点的带权路径长度

树中所有叶结点的带权路径长度之和称为该树的带权路径长度,记为

WPL=\sum_{i=1}^{n}w_{i}l_{i}

式中,wi是第i个叶结点所带的权值,li是该叶结点到根结点的路径长度。

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

例如,图 5.25 中的3棵二叉树都有4个叶结点 a,b,c,d,分别带权 7,5,2,4,

它们的带权路径长度分别为

(a) WPL=7x2+5x2+2x2+4x2 =36。

(b) WPL=4x2+ 7x3+5x3+ 2x1=46。

(c) WPL=7x1+5x2+2x3+4x3=35。

其中,图 5.25(c)树的 WPL 最小。可以验证,它恰好为哈夫曼树

2.哈夫曼树的构造

给定n个权值分别为w1,w2,…wn的结点,构造哈夫曼树的算法描述如下:

1) 将这n个结点分别作为n棵仅含一个结点的二叉树,构成森林F。

分析哈夫曼树的路径上权值序列的合法性(2010)

2) 构造一个新结点,从F中选取两棵根结点权值最小的树作为新结点的左、右子树,并且将新结点的权值置为左、右子树上根结点的权值之和。

3) 从F中删除刚才选出的两棵树,同时将新得到的树加入F中。

4) 重复步骤2) 和 3),直至F中只剩下一棵树为止。

哈夫曼树的性质(2010、2019)

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

1) 每个初始结点最终都成为叶结点,且权值越小的结点到根结点的路径长度越大。

2) 构造过程中共新建了n-1个结点(双分支结点),因此哈夫曼树的结点总数为2n-1。

3) 每次构造都选择2棵树作为新结点的孩子,因此哈夫曼树中不存在度为1的结点。

例如,权值{7,5,2,4}的哈夫曼树的构造过程如图 5.26 所示。

3.哈夫曼编码

在数据通信中,若对每个字符用相等长度的二进制位表示,称这种编码方式为固定长度编码。若允许对不同字符用不等长的二进制位表示,则这种编码方式称为可变长度编码

可变长度编码比固定长度编码要好得多,其特点是对频率高的字符赋以短编码,而对频率较低的字符则赋以较长一些的编码,从而可以使字符的平均编码长度减短,起到压缩数据的效果。

根据哈夫曼编码对编码序列进行译码(2017)

若没有一个编码是另一个编码的前缀,则称这样的编码为前缀编码。举例:设计字符A,B和 C对应的编码 0,10 和 110是前缀编码。

对前缀编码的解码很简单,因为没有一个编码是其他编码的前缀。所以识别出第一个编码,将它翻译为原字符,再对剩余的码串执行同样的解码操作。

例如,码串 0010110 可被唯一地翻译为A,A,B和C。另举反例:若再将字符D 的编码设计为 11,此时11是110的前缀,则上述码串的后三位就无法唯一翻译。

夫曼树的构造及相关的分析(2012、2018、2021、2023)

前缀编码的分析及应用(2014、2020)

可以利用二叉树来设计二进制前缀编码。假设为A,B,C,D四个字符设计前缀编码,可以用图 5.27 所示的二叉树来表示,4个叶结点分别表示4个字符,且约定左分支表示 0,右分支表示1,从根到叶结点的路径上用分支标记组成的序列作为该叶结点字符的编码,可以证明如此得到的必为前缀编码。

由图5.27 得到字符 A,B,C,D的前缀编码分别为 0,10,110,111。

哈夫曼编码和定长编码的差异(2022)

哈夫曼编码是一种非常有效的数据压缩编码。由哈夫曼树得到哈夫曼编码是很自然的过程。

首先,将每个字符当作一个独立的结点,其权值为它出现的频度(或次数),构造出对应的哈夫曼树。

然后,将从根到叶结点的路径上分支标记的字符串作为该字符的编码。

图 5.28 所示为一个由哈夫曼树构造哈夫曼编码的示例,矩形方块表示字符及其出现的次数。

这棵哈夫曼树的 WPL为

WPL=1x45+3x(13+12+16)+4x(5 +9)=224

此处的 WPL 可视为最终编码得到二进制编码的长度,共 224位。若采用3位固定长度编码,则得到的二进制编码长度为 300 位,因此哈夫曼编码共压缩了 25%的数据。

利用哈夫曼树可以设计出总长度最短的二进制前缀编码。

注意:左分支和右分支究竟是表示0还是表示1没有明确规定,因此构造出的哈夫曼树并不唯一,但各哈夫曼树的带权路径长度 WPL 相同且为最优

此外,如有若干权值相同的结点,则构造出的哈夫曼树更可能不同,但WPL 必然相同且为最优

5.5.2并查集(补充)

1.并查集的概念

并查集是一种简单的集合表示,它支持以下3种操作:

1) Initial(S):将集合S中的每个元素都初始化为只有一个单元素的子集合。

2) Union(S,Root1,Root2):把集合S中的子集合 Root2并入子集合 Root1。要求 Root1和 Root2 互不相交,否则不执行合并

3) Find(S,x):查找集合S中单元素x所在的子集合,并返回该子集合的根结点。

2.并查集的存储结构

通常用树的双亲表示作为并查集的存储结构,每个子集合以一棵树表示。所有表示子集合的树,构成表示全集合的森林,存放在双亲表示数组内。

通常用数组元素的下标代表元素名,用根结点的下标代表子集合名,根结点的双亲域为负数(可设置为该子集合元素数量的相反数)。

例如,若设有一个全集合为S=(0,1,2,3,4,5,6,7,8,9},初始化时每个元素自成一个单元素子集合,每个子集合的数组值为-1,如图5.29所示。

经过一段时间的计算后,这些子集合合并为3个更大的子集合,即S1=(0,6,7,8},S2={1,4,9},S3={2,3,5},此时并查集的树形和存储结构如图 5.30 所示。

 

为了得到两个子集合的并,只需将其中一个子集合根结点的双亲指针指向另一个集合的根结点。因此,S1 U S2(S1并S2),可以具有如图 5.31所示的表示。

 

在采用树的双亲指针数组表示作为并查集的存储表示时,集合元素的编号从0到SIZE-1。其中 SIZE 是最大元素的个数。

 3.并查集的基本实现

并查集的结构定义如下:

#define SIZE 100
int    UFSets[SIZE];    //集合元素数组(双亲指针数组)

下面是并查集主要运算的实现。

(1) 并查集的初始化操作

void Initial(int S[]){        //S即为并查集
    for(int i=0;i<SIZE;i++)   //每个自成单元素集合
        S[i]=-1;
}

(2) 并查集的 Find 操作

在并查集S中查找并返回包含元素x的树的根。

int Find(int S[],int x){
    while(S[x]>=0)        //循环寻找x的根
        x=S [x];
    return x;             //根的 s[]小于 0
}

判断两个元素是否属于同一集合,只需分别找到它们的根,再比较根是否相同即可。

(3) 并查集的 Union 操作

求两个不相交子集合的并集。若将两个元素所在的集合合并为一个集合,则需要先找到两个元素的根,再令一棵子集树的根指向另一棵子集树的根。

void Union(int S[],int Rootl,int Root2){
    if(Root1==Root2) return;     //要求 Root1与Root2 是不同的集合
    S [Root2]=Root1;             //将根 Root2连接到另一根 Root1下面
}

Find 操作和 Union 操作的时间复杂度分别为 O(d)和 O(1),其中d为树的深度。

4.并查集实现的优化

在极端情况下,n个元素构成的集合树的深度为n,则 Find 操作的最坏时间复杂度为 O(n)。

改进的办法是:在做 Union 操作之前,首先判别子集中的成员数量,然后令成员少的根指向成员多的根,即把小树合并到大树,为此可令根结点的绝对值保存集合树中的成员数量。

(1) 改进的 Union 操作

void Union(int S[],int Rootl,int Root2){
    if(Root1==Root2) return;
    if(S[Root2]>S[Root1]){       //Root2 结点数更少
        S[Root1]+=S[Root2];      //累加集合树的结点总数
        S[Root2]=Root1;          //小树合并到大树

    }
    else{                        //Root1结点数更少
        S[Root2]+=S[Root1];      //累加结点总数
        S[Root1]=Root2;          //小树合并到大树
    }
}

采用这种方法构造得到的集合树,其深度不超过\left \lfloor log_{2}n \right \rfloor+1

随着子集逐对合并,集合树的深度越来越大,为了进一步减少确定元素所在集合的时间,还可进一步对上述 Find 操作进行优化,当所査元素x不在树的第二层时,在算法中增加一个“压缩路径”的功能,即将从根到元素x路径上的所有元素都变成根的孩子。

(2) 改进的 Find 操作

int Find(int S[],int x){
    int root=x;
    while(s[root]>=0)    //循环找到根
        root=s[root];
    while(x!=root){      //压缩路径
        int t=S[x];      //t指向x的父结点
        S[x]=root;       //x直接挂到根结点下面
        x=t;
    }
    return root;         //返回根结点编号
}

通过 Find 操作的“压缩路径”优化后,可使集合树的深度不超过 O(α(n)),其中 α(n)是一个增长极其缓慢的函数,对于常见的正整数 n,通常 α(n)<=4。

 

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

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

相关文章

全文翻译 | OWASP《LLM安全与治理检查清单》

&#x1f4a1; 摘要&#xff1a; LLM AI Cybersecurity & Governace Checklist version 1.0 发布时间&#xff1a;2024年2月19日 本文是OWASP&#xff08;开放式网络应用安全项目&#xff09;发布的《LLM AI安全与治理清单》&#xff08;以下简称“清单”&#xff09;&…

使用Django框架实现音频上传功能

数据库设计&#xff08;models.py&#xff09; class Music(models.Model):""" 音乐 """name models.CharField(verbose_name"音乐名字", max_length32)singer models.CharField(verbose_name"歌手", max_length32)# 本质…

Java二十三种设计模式-工厂方法模式(2/23)

工厂方法模式&#xff1a;设计模式中的瑞士军刀 引言 在软件开发中&#xff0c;工厂方法模式是一种常用的创建型设计模式&#xff0c;它用于处理对象的创建&#xff0c;将对象的实例化推迟到子类中进行。这种模式不仅简化了对象的创建过程&#xff0c;还提高了代码的可维护性…

数据结构day2

一、思维导图 内存分配 二、课后习题 分文件编译 //sys.h #ifndef TEST_H #define TEST_H #define MAX_SIZE 100//定义学生类型 typedef struct Stu {char name[20]; //姓名int age; //年龄double score; //分数 }stu;//定义班级类型 typedef struct Class {struct …

4.作业--Jquery,JS

目录 作业题目&#xff1a;1.使用Jquery完成点击图片变换图片颜色 A图 B代码 HTML的部分 JQ的部分 作业题目&#xff1a;2.使用JS中的DOM操作完成背景颜色渐变方向变换。点击背景&#xff0c;渐变方向发生改变。 A图 B代码 学习产出&#xff1a; 作业题目&#xff1a;1…

2014-2024年腾势D9N7N8EVDMI维修手册和电路图资料线路图接线图

经过整理&#xff0c;2014-2024年腾势汽车全系列已经更新至汽修帮手资料库内&#xff0c;覆盖市面上99%车型&#xff0c;包括维修手册、电路图、新车特征、车身钣金维修数据、全车拆装、扭力、发动机大修、发动机正时、保养、电路图、针脚定义、模块传感器、保险丝盒图解对照表…

ORA-00756 ORA-10567故障处理---惜分飞

数据库异常断电之后&#xff0c;recover 报ORA-00756 ORA-10567等错 SQL> recover database; ORA-00756: 恢复操作检测到数据块写入丢失 ORA-10567: Redo is inconsistent with data block (file# 1,block# 113855,file offset is 932700160 bytes) ORA-10564: tablespace S…

【学术会议征稿】第四届人工智能、虚拟现实与可视化国际学术会议(AIVRV 2024)

第四届人工智能、虚拟现实与可视化国际学术会议&#xff08;AIVRV 2024&#xff09; 2024 4th International Conference on Artificial Intelligence, Virtual Reality and Visualization 第四届人工智能、虚拟现实与可视化国际学术会议&#xff08;AIVRV 2024&#xff09;将…

请你谈谈:spring bean的生命周期 - 阶段2:Bean实例化阶段

在Spring框架中&#xff0c;Bean的实例化是Bean生命周期中的一个重要阶段。这个过程包括两个关键的子阶段&#xff1a;Bean实例化前阶段和Bean实例化阶段本身。 BeanFactoryPostProcessor&#xff1a;BeanFactoryPostProcessor是容器启动阶段Spring提供的一个扩展点&#xff0…

科技出海|百分点科技智慧政务解决方案亮相非洲展会

近日&#xff0c;华为非洲全联接大会在南非约翰内斯堡举办&#xff0c;吸引政府官员行业专家、思想领袖、生态伙伴等2,000多人参会&#xff0c;百分点科技作为华为云生态合作伙伴&#xff0c;重点展示了智慧政务解决方案&#xff0c;发表《Enable a Smarter Government with Da…

Transformer系列专题(四)——Swintransformer

文章目录 九、SwinTransformer9.1 整体网络架构9.2 Transformer Blocks9.3 Patch Embedding&#xff08;将图像切割成小块&#xff08;Patch&#xff09;&#xff09;9.4 window_partition9.5 W-MSA&#xff08;Window Multi-head Self Attention&#xff09;9.6 window_revers…

LinuxShell编程2——shell搭建Discuzz论坛网站

目录 一、环境准备 ①准备一台虚拟机 ②初始化虚拟机 1、关闭防火墙 2、关闭selinux 3、配置yum源 4、修改主机名 二、搭建LAMP环境 ①安装httpd(阿帕奇apache&#xff09;服务器 查看是否安装过httpd 启动httpd 设置开机启动 查看状态 安装网络工具 测试 ②安装…

Android C++系列:Linux线程(三)线程属性

linux下线程的属性是可以根据实际项目需要,进行设置,之前我们讨论的线程都是采用线程的默认属性,默认属性已经可以解决绝大多数开发时遇到的问 题。如我们对程序的性能提出更高的要求那么需要设置线程属性,比如可以通过设置线程栈的大小来降低内存的使用,增加最大线程个数…

数据结构——栈和队列(C语言实现)

写在前面&#xff1a; 栈和队列是两种重要的线性结构。其也属于线性表&#xff0c;只是操作受限&#xff0c;本节主要讨论的是栈和队列的定义、表示方法以及C语言实现。 一、栈和队列的定义与特点 栈&#xff1a;是限定仅在表尾进行插入和删除的线性表。对栈来说&#xff0c;表…

【Elasticsearch7.11】reindex问题

参考博文链接 问题&#xff1a;reindex 时出现如下问题 原因&#xff1a;数据量大&#xff0c;kibana的问题 解决方法&#xff1a; 将DSL命令转化成CURL命令在服务上执行 CURL命令 自动转化 curl -XPOST "http://IP:PORT/_reindex" -H Content-Type: application…

防洪墙的安全内容检测+http请求头

1、华为的IAE引擎&#xff1a;内部工作过程 IAE引擎主要是针对2-7层进行一个数据内容的检测 --1、深度检测技术 (DPI和DPF是所有内容检测都必须要用到的技术) ---1、DPI--深度包检测&#xff0c;针对完整的数据包&#xff0c;进行内容的识别和检测 1、基于特征子的检…

Spark算子--take(访问量前十网站)

1.题目需求 利用数据集SogouQ2012.mini.tar.gz 将数据按照访问次数进行排序&#xff0c;求访问量前10的网址&#xff0c;每一行数据代表一个url被访问1次 2.代码 from pyspark import SparkContext, SparkConfdef main():conf SparkConf().setMaster("local[*]").s…

【操作系统】文件管理——文件存储空间管理(个人笔记)

学习日期&#xff1a;2024.7.17 内容摘要&#xff1a;文件存储空间管理、文件的基本操作 在上一章中&#xff0c;我们学习了文件物理结构的管理&#xff0c;重点学习了操作系统是如何实现逻辑结构到物理结构的映射&#xff0c;这显然是针对已经存储了文件的磁盘块的&#xff0…

连锁零售门店分析思路-人货场 数据分析

连锁零售门店分析思路 以下是一个连锁零售门店的分析思路&#xff1a; 一、市场与竞争分析 二、门店运营分析&#xff08;销售分析&#xff09; 三、销售与财务分析 四、客户分析 五、数字化与营销分析 最近帮一个大学生培训&#xff0c;就门店销售分析 &#xff0c;说到门店…

尚品汇-(二十)

目录&#xff1a; 一&#xff1a;商品详情页面优化 &#xff08;1&#xff09;思路 &#xff08;2&#xff09;整合redis到工程 &#xff08;3&#xff09;使用redis进行业务开发相关规则 &#xff08;4&#xff09;缓存常见问题 二&#xff1a;分布式锁 本地锁的局限性…