26考研——树与二叉树_树与二叉树的应用(5)

408答疑


文章目录

  • 三、树与二叉树的应用
    • 哈夫曼树和哈夫曼编码
      • 哈夫曼树的定义
        • 概念
        • 带权路径长度(WPL)计算
        • 示例分析
      • 哈夫曼树的构造
        • 算法描述
        • 哈夫曼树的性质
        • 示例
      • 哈夫曼编码
        • Huffman树的编码规则
          • Huffman树的构建过程
          • 前缀编码
            • 前缀编码的分析及应用
        • Huffman树的构造及相关的分析
          • 压缩原理
          • 示例分析
      • 注意事项
    • 并查集(略)
  • 四、参考资料
    • 鲍鱼科技课件
    • 26王道考研书


三、树与二叉树的应用

哈夫曼树和哈夫曼编码

哈夫曼树的定义

概念
  • 哈夫曼树是带权路径长度(WPL)​最小的二叉树,又称最优二叉树。
  • 权值:树中结点被赋予的表示特定意义的数值。
  • 叶结点的带权路径长度:叶结点到根结点的路径长度与该结点权值的乘积。
  • 树的带权路径长度(WPL)​:树中所有叶结点的带权路径长度之和,计算公式为:
    W P L = ∑ i = 1 n w i l i WPL = \sum_{i=1}^{n} w_i l_i WPL=i=1nwili
    其中, w i w_i wi 为第 i i i 个叶结点的权值, l i l_i li 为该叶结点到根结点的路径长度。
带权路径长度(WPL)计算
  • 目标:构造 WPL 最小的二叉树(哈夫曼树)。
  • 路径长度:从根到某结点的路径上的边数(层数减1)。
示例分析

以下为三棵含4个叶结点(权值分别为7, 5, 2, 4)的二叉树及其 WPL 计算:

  • 二叉树(1)

    • 叶结点路径长度均为2
    • W P L = 7 × 2 + 5 × 2 + 2 × 2 + 4 × 2 = 36 WPL = 7 \times 2 + 5 \times 2 + 2 \times 2 + 4 \times 2 = 36 WPL=7×2+5×2+2×2+4×2=36
  • 二叉树(2)

    • 叶结点路径长度分别为2, 3, 3, 1
    • W P L = 4 × 2 + 7 × 3 + 5 × 3 + 2 × 1 = 46 WPL = 4 \times 2 + 7 \times 3 + 5 \times 3 + 2 \times 1 = 46 WPL=4×2+7×3+5×3+2×1=46
  • 二叉树(3)(哈夫曼树)

    • 叶结点路径长度分别为1, 2, 3, 3
    • W P L = 7 × 1 + 5 × 2 + 2 × 3 + 4 × 3 = 35 WPL = 7 \times 1 + 5 \times 2 + 2 \times 3 + 4 \times 3 = 35 WPL=7×1+5×2+2×3+4×3=35

结论:二叉树(3)的 WPL 最小,符合哈夫曼树的定义。

在这里插入图片描述

哈夫曼树的构造

算法描述

给定 n n n 个权值分别为 w 1 , w 2 , … , w n w_1, w_2, \ldots, w_n w1,w2,,wn 的结点,构造Huffman树的算法描述如下:

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

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

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

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

  • (1) 初始状态,权值分别为 7, 5, 2, 4。
  • (2) 第一次合并,将权值 2 和 4 的结点合并,新结点权值为 6。
  • (3) 第二次合并,将权值 5 和 6 的结点合并,新结点权值为 11。
  • (4) 最终态,最终哈夫曼树的权值为 18。

通过这个过程,可以验证下图(4)树的带权路径长度 (WPL) 最小,因此它恰好为哈夫曼树。

在这里插入图片描述

哈夫曼编码

Huffman树的编码规则
  • Huffman树的左树编码为0,右树编码为1,则每一个叶子结点将得到唯一的编码,即为Huffman编码。
Huffman树的构建过程
  1. 先以字符串中每个字符出现的次数为权值构建Huffman树。
  2. 从根结点开始对分支进行编码,左分支为0,右分支为1。
  3. 所有权值结点都在叶子结点位置,遍历从根到叶子结点的每条路径,将获得对应字符的Huffman编码。
前缀编码
  • 若没有一个编码是另一个编码的前缀,则称这样的编码为前缀编码。
  • 对前缀编码的解码很简单,因为没有一个编码是其他编码的前缀。所以识别出第一个编码,将它翻译为原字符,再对剩余的码串执行同样的解码操作。
  • 例如,码串 0010110 可被唯一地翻译为 A, A, B 和 C。另举反例:若再将字符 D 的编码设计为 11,此时 11 是 110 的前缀,则上述码串的后三位就无法唯一翻译。
前缀编码的分析及应用
  • Huffman编码可以利用二叉树来设计二进制前缀编码。假设为 A, B, C, D 四个字符设计前缀编码,可以用下图所示的二叉树来表示,4 个叶结点分别表示 4 个字符,且约定左分支表示 0,右分支表示 1,从根到叶结点的路径上用分支标记组成的序列作为该叶结点字符的编码,可以证明如此得到的必为前缀编码。由下图得到字符 A, B, C, D 的前缀编码分别为 0, 10, 110, 111。

在这里插入图片描述

Huffman树的构造及相关的分析
压缩原理
  • 在未压缩之前一个字符占一个字节,现在对字符进行二进制编码之后,一个字节8个比特位列现在可以表示多个字符,所以说一次压缩,就会节省很多字节,也就起到了压缩的作用。
  • Huffman编码是一种非常有效的数据压缩编码。由Huffman树得到Huffman编码是很自然的过程。首先,将每个字符当作一个独立的结点,其权值为它出现的频度(或次数),构造出对应的Huffman树。然后,将从根到叶结点的路径上分支标记的字符串作为该字符的编码。
示例分析
  • 例如,下图所示为一个由Huffman树构造Huffman编码的示例,矩形方块表示字符及其出现的次数。这棵哈夫曼树的 WPL 为 W P L = 1 × 45 + 3 × ( 13 + 12 + 16 ) + 4 × ( 5 + 9 ) = 224 WPL = 1 \times 45 + 3 \times (13 + 12 + 16) + 4 \times (5 + 9) = 224 WPL=1×45+3×(13+12+16)+4×(5+9)=224。此处的 WPL 可视为最终编码得到二进制编码的长度,共 224 位。若采用 3 位固定长度编码,则得到的二进制编码长度为 300 位,因此 Huffman编码共压缩了 25% 的数据。利用 Huffman树可以设计出总长度最短的二进制前缀编码。

在这里插入图片描述

注意事项

  • 左分支和右分支究竟是表示 0 还是表示 1 没有明确规定,因此构造出的哈夫曼树并不唯一,但各哈夫曼树的带权路径长度 WPL 相同且为最优。此外,如有若干权值相同的结点,则构造出的哈夫曼树更可能不同,但 WPL 必然相同且为最优。

并查集(略)

四、参考资料

鲍鱼科技课件

b站免费王道课后题讲解:
在这里插入图片描述

网课全程班:
在这里插入图片描述

26王道考研书

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

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

相关文章

【VUE】day06 动态组件 插槽 自定义指令 ESlint

【VUE】day06 动态组件 & 插槽 & 自定义指令 1. 动态组件1.1 通过不同的按钮展示不同的组件1.1.1回顾click 1.2 keep-alive的使用1.3 keep-alive对应的生命周期函数1.3.1 keep-alive的include属性1.3.2 exclude 1.4 组件注册名称和组件声明时name的区别1.4.1 组件声明时…

nodejs-原型污染链

还是老规矩,边写边学,先分享两篇文章 深入理解 JavaScript Prototype 污染攻击 | 离别歌 《JavaScript百炼成仙》 全书知识点整理-CSDN博客 Ctfshow web入门 nodejs篇 web334-web344_web334 ctfshow-CSDN博客 334-js审计 var express require(expr…

Oracle 数据库通过exp/imp工具迁移指定数据表

项目需求:从prod数据库迁移和复制2个表(BANK_STATE,HBS)的数据到uat数据库环境。 数据库版本:Oracle Database 19c Enterprise Edition Release 19.0.0.0.0 迁移工具:客户端exp/imp工具 -- 执行命令 从Prod数据库导出数据exp us…

企业级基于SpringBoot的MQTT的构建和使用

基于SpringBoot的MQTT配置及使用 首先要使用EMQX搭建一个MQTT服务器&#xff0c;参考文档&#xff1a;EMQX快速开始 本着开源分享的观点&#xff0c;闲话不多说&#xff0c;直接上代码 导入Maven <dependency><groupId>org.springframework.integration</gro…

26考研——图_图的代码实操(6)

408答疑 文章目录 五、图的代码实操图的存储邻接矩阵结构定义初始化插入顶点获取顶点位置在顶点 v1 和 v2 之间插入边获取第一个邻接顶点获取下一个邻接顶点显示图 邻接表结构定义初始化图插入顶点获取顶点位置在顶点 v1 和 v2 之间插入边获取第一个邻接顶点获取下一个邻接顶点…

开源webmail邮箱客户端rainloop的分支版本SnappyMail 设置发件人允许多重身份

RainLoop已多年未更新&#xff0c;SnappyMail 是 RainLoop 的分支&#xff0c;由社区维护。SnappyMail 不仅修复了漏洞&#xff0c;还增加了更多功能和优化。对 IMAP 支持更好&#xff0c;移动端体验也比 RainLoop 更细致。 安装过程和设置跟RainLoop一样&#xff1a; 以宝塔面…

海量数据场景题--查找两个大文件的URL

查找两个大文件共同的URL 给定 a、b 两个文件&#xff0c;各存放 50 亿个 URL&#xff0c;每个 URL 各占 64B&#xff0c;找出 a、b 两个文件共同的 URL。内存限制是 4G。 操作逻辑&#xff1a; 使用哈希函数 hash(URL) % 1000​ 将每个URL映射到0-999的编号 文件A切割为a0, a1…

简单ELK框架搭建

简介 ELK 框架是一套开源的日志管理和分析工具&#xff0c;由 Elasticsearch、Logstash 和 Kibana 三个主要组件组成&#xff0c;现在新增了Filebeat组件&#xff0c;可以更高效的收集数据。 Elasticsearch&#xff1a;是一个分布式、高可扩展的开源搜索引擎&#xff0c;能快速…

VS Code 中 .history`文件的来源与 .gitignore`的正确使用

引言 在使用 VS Code 进行 Git 版本控制时&#xff0c;有时会发现项目中多出一个 .history 目录&#xff0c;并被 Git 识别为未跟踪文件。本文将解释 .history 的来源&#xff0c;并提供 .gitignore 的正确配置方法&#xff0c;确保开发环境的整洁性。 1. .history 文件的来源…

网络之数据链路层

数据链路层 数据链路层目标 TCP/IP提供了一种能力, 将数据可靠的从 B 跨网络送到 C 主机, 这期间是由无数次局域网转发构成的, 比如 主机B 到 路由器F 就是一次局域网通信的问题, 而数据链路层就是研究数据是如何在局域网内部转发的. 也就是说, 应用层是进行数据的处理, 传输…

A Brief History: from GPT-1 to GPT-3

This is my reading notes of 《Developing Apps with GPT-4 and ChatGPT》. In this section, we will introduce the evolution of the OpenAI GPT medels from GPT-1 to GPT-4. GPT-1 In mid-2018, OpenAI published a paper titled “Improving Language Understanding …

基于大数据的各品牌手机销量数据可视化分析系统(源码+lw+部署文档+讲解),源码可白嫖!

摘要 时代在飞速进步&#xff0c;每个行业都在努力发展现在先进技术&#xff0c;通过这些先进的技术来提高自己的水平和优势&#xff0c;各品牌手机销量数据可视化分析系统当然不能排除在外。基于大数据的各品牌手机销量数据可视化分析系统是在实际应用和软件工程的开发原理之…

人工智能-群晖Docker部署DB-GPT

人工智能-群晖Docker部署DB-GPT 0 环境及说明1 获取dbgpt的docker镜像2 下载向量模型3 下载配置文件4 修改配置文件5 创建dbgpt容器并运行6 访问dbgpt0 环境及说明 环境项说明DSM版本DSM 7.2.1-69057 update 3Container Manager版本24.0.2-1535当前 hub.docker.com 镜像仓库中的…

Netty——TCP 粘包/拆包问题

文章目录 1. 什么是 粘包/拆包 问题&#xff1f;2. 原因2.1 Nagle 算法2.2 滑动窗口2.3 MSS 限制2.4 粘包的原因2.5 拆包的原因 3. 解决方案3.1 固定长度消息3.2 分隔符标识3.3 长度前缀协议3.3.1 案例一3.3.2 案例二3.3.3 案例三 4. 总结 1. 什么是 粘包/拆包 问题&#xff1f…

JavaScript Fetch API

简介 fetch() API 是用于发送 HTTP 请求的现代异步方法&#xff0c;它基于 Promise&#xff0c;比传统的 XMLHttpRequest 更加简洁、强大 示例 基本语法 fetch(url, options).then(response > response.json()).then(data > console.log(data)).catch(error > con…

UMI-OCR Docker 部署

额外补充 Docker 0.前置条件 部署前&#xff0c;请检查主机的CPU是否具有AVX指令集 lscpu | grep avx 输出如下即可继续部署 Flags: ... avx ... avx2 ... 1.下载dockerfile wget https://raw.githubusercontent.com/hiroi-sora/Umi-OCR_runtime_linux/main/Do…

C++ --- 二叉搜索树

1 二叉搜索树的概念 ⼆叉搜索树⼜称⼆叉排序树&#xff0c;它或者是⼀棵空树&#xff0c;或者是具有以下性质的⼆叉树: 1 若它的左⼦树不为空&#xff0c;则左⼦树上所有结点的值都⼩于等于根结点的值 2 若它的右⼦树不为空&#xff0c;则右⼦树上所有结点的值都⼤于等于根结点…

跨语言语言模型预训练

摘要 最近的研究表明&#xff0c;生成式预训练在英语自然语言理解任务中表现出较高的效率。在本研究中&#xff0c;我们将这一方法扩展到多种语言&#xff0c;并展示跨语言预训练的有效性。我们提出了两种学习跨语言语言模型&#xff08;XLM&#xff09;的方法&#xff1a;一种…

文件描述符,它在哪里存的,exec()后还存在吗

学过计系肯定了解 寄存器、程序计数器、堆栈这些 程序运行需要的资源。 这些是进程地址空间。 而操作系统分配一个进程资源时&#xff0c;分配的是 PCB 进程控制块。 所以进程控制块还维护其他资源——程序与外部交互的资源——文件、管道、套接字。 文章目录 文件描述符进程管…

Slidev使用(一)安装

文章目录 1. **安装位置**2. **使用方式**3. **适用场景**4. **管理和维护** 全局安装1. **检查 Node.js 和 npm 是否已安装**2. **全局安装 Slidev CLI**3. **验证安装是否成功**4. **创建幻灯片文件**5. **启动 Slidev**6. **实时编辑和预览**7. **构建和导出&#xff08;可选…