最优编码树的双子性

现在看一些书,不太愿意在书上面做一些标记,也没啥特殊的原因。。哈哈。

树的定义

无环连通图,极小连通图,极大无环图。

某个节点,描述它的度,一般默认是出度,分叉的边的条数。或者说孩子的个数。孩子和后代是不一样的,注意区分。

长度

路径长度就是边数,直观上也是这样。应该不难理解。

深度和高度

规定根节点的深度为 0 ,空树的高度为 -1 .

一个问题

d e p t h ( v ) + h e i g h t ( v ) ≤ h e i g h t ( T ) depth(v) + height(v) \leq height(T) depth(v)+height(v)height(T)
什么时候取等号,v 表示的是任意一个节点, T 表示的是根节点。当 v 所在的子树的最深的叶节点是全树最深的叶节点的时候,取到等号。

内部节点

我们发现,一些定义假设不是非常清晰,实际上,自己内心是感觉没有完全掌握这些知识点的,内部节点是指除了叶节点之外的所有节点,也包括根节点。这里没有考虑极端情况。极端情况只有一个根节点,根节点是内部节点,也是叶节点。

二叉树

二叉树的定义是节点的度不超过 2 , 也就是说不一定要求严格是二叉,一叉也是二叉树,零叉也是二叉树。

有序多叉树可以转换为二叉树

也就是说,二叉树可以很简洁地刻画有序多叉树,类似,我写一万字,描述清楚一个知识点,一个大佬两百字描述清楚一个知识点,功能上面都是一致的。转换的步骤就是,首先把有序多叉树的长子保留,假设最左边的孩子就是长子,然后把其他的边的断掉,断掉边不是舍弃孩子,舍弃孩子就会损失一些重要信息。然后把长子和亲兄弟连接起来。一定是要连接亲兄弟。然后对新的二叉树做适当的旋转,注意是有序的多叉树,所以右边的孩子一般比左边的孩子更大一些,根据这个条件来进行旋转,就能得到一个我们肉眼看上去像二叉树的结构,当然实际上这个就是二叉树。

二叉树的高度

h + 1 ≤ n ≤ 2 h + 1 − 1 h + 1 \leq n \leq 2^{h + 1 } - 1 h+1n2h+11
左侧取等号是二叉树是单链的情况。右侧取等号是满二叉树的情况。单链的二叉树并不一定是左侧链或者右侧链,可以是两者的结合,只要最后是单链就好。从你的全世界路过里面不是说,只要最后是你就好,么。

练习

非常奇怪,比如说数学练习题,就只有几个,一个章节可能一二十个练习题,为什么大家的最后的成绩差距非常大呢。难道是因为天赋么,可是就这么点考试题就真的能判断一个人的天赋吗。哈哈哈。早几天看了一篇推文,说是看起来非常扎实稳的人,最后居然没有上岸。我感觉是我本人,非常慌,于是取关了那个博主。假努力,他才是假努力呢,我是真努力。

最优编码树的双子性

什么是最优编码树,什么是双子性。假设真是自己需要理解的知识点,我感觉一个字都不能复制,可能每个字都需要形成自己的理解,才能把里面的逻辑关系搞清楚。我感觉一个练习题的质量的一个重要评价标准就是能不能综合很多知识点,或者需要极多的前置知识(前置知识也属于考试范围内的,不属于超纲范围这种),我把这个部分的标题作为我这篇笔记的标题了,嘿嘿,比较高级。有些希腊字母不会读,感觉有点影响自己阅读了。谷歌的搜索貌似用不了。edge 搜出来是 sigma 。我还是习惯用搜索引擎,很多时候,大模型有时候要反应一下,我想要即时反馈。几秒钟都不太愿意等他。编码就是把一些信息转换为二进制的,非常神奇,一些非常复杂的信息,居然在电脑上能用一串 01 数字表示。

编码的过程是,首先自底向上构建 PFC 编码树,然后构建编码表,对于文本信息,查询编码表进行编码,类似于以前间谍工作,用一本书里面的字,对应真正要传递的信息。合并的次数是树的数目减去 1 .很容易理解,比如说,两棵树合并成一棵树,只需要合并一次,最后剩下一棵树就好。

下面是我之前写的一个非常经典的哈夫曼编码的题。看了一个大佬的博客,他说能体现一个人的科研素养的就是数学能力和编程能力,感觉有道理,说到底就是逻辑能力。

#include<iostream>
#include<queue> 
#include<vector>using namespace std;int n;
priority_queue<int, vector<int>, greater<int>> heap;int main() {cin >> n;for ( int i = 0; i < n; i++ ) {int x;cin >> x;heap.push( x );}long long ans = 0;while ( heap.size() > 1 ) {int a = heap.top(); heap.pop();int b = heap.top(); heap.pop();ans += a + b;heap.push( a + b );}cout << ans << endl;return 0;
}

然后我们来解答前面的问题,最优编码树就是让平均编码长度最小的二叉树。最优二叉编码树一定是真二叉树,真二叉树的定义是任一节点的度数都是偶数。也就是说要么没有孩子,有孩子就一定有两个。二叉树要求没有那么严格,只要不超过两个孩子就行了,仅有一个孩子也是可以接受并且是严格接受的。这个就是双子性。就是真二叉树的定义呀。原来。

双子性更加优雅的定义:内部节点的左右孩子双全。(内部节点就是除了叶节点的节点,叶节点没有孩子,考虑一般的情况,内部节点一定是有孩子的,有孩子就一定是有两个孩子,一个左孩子,一个右孩子)

最优编码树的构造

最优编码树的叶节点只能出现在最低两层。假设不是出现在最低两层,手绘的图片,好像显示不在博客里面
可以把左下方的子树移动到右上方。也不是移动,是交换这两个部分的节点。平均编码长度是取决于叶节点的深度的,所以叶节点的深度是越小越好,体现在二叉树里面是二叉树越低越好,但是在人类世界里面,貌似正好相反。

完全二叉树

几种二叉树的定义,感觉一直有点绕不清楚。。但是今天可能也绕不清楚,但是可以努力区分一下,我现在不认为有一劳永逸的方法。

二叉树是分叉不能大于二,小于等于二都是可以接受的。满二叉树是每一层都铺满,每个有孩子的节点都是有两个孩子,叶节点只出现在最下面一层。完全二叉树是叶节点可以出现在最下面两层。完全二叉树把最下面一层去掉,就是满二叉树,当然满二叉树是特殊的完全二叉树。真二叉树是任一节点的度是偶数。可能列表描述更加清晰一些。(我自己看自己的笔记发现还是图和表格会让自己理解起来更加轻松,大片的文字,哪怕是自己写的,阅读起来也是比较费劲的了,哪怕作者非常卖力地阐述和分析这里面的逻辑,这可能就是我看不懂专业书籍的原因,阅读大段的文字本身就是一件比较困难的事情。所以以后做笔记,我可以尽量用图片,表格,各种形式来进行。加深自己对于知识点的理解。)

分类描述
二叉树任一节点的度小于等于二
完全二叉树除了最后一层,上面的部分是满二叉树,最后一层可能是满的,可能不是满的,每个节点的度都是偶数,应该不会出现内部节点只有一个孩子的情况。
满二叉树每一层都铺满
真二叉树 proper binary tree每个节点的度都是偶数

我太喜欢表格了,非常清晰。以后写笔记多写一些表格。

考虑实际情况的优化

考虑实际情况,我们对一些知识点,或者一些网站,或者一些书籍,或者一些文字,肯定是有使用频率的差异的。比如说,考试,考察算法,基础算法,数据结构,搜索与图论,数学,动态规划,贪心,这些板块的出现频率一定是不一样的,就像一本书有它的重点,重点我们要多花时间复习,非重点我们可以少花一些时间。全面发展等于全面平庸。也就是说我们要发挥长板思维,不要当一个六边形战士,因为我们的时间和精力是有限的,只能做好少部分事情。所以,不要平均用力,要有重点地用力,重点的部分,可以多用用力,不重点的部分,可以少用力甚至不用力。哈夫曼树对编码问题的解决,就是让出现频率最高的字母排列在哈夫曼树的靠近根节点的部分,尽可能让它的深度比较小,这样代价就比较小。类似于我们把一些常用的网站收藏在浏览器首页,虽然我担心别人看到我经常访问的网站把收藏夹隐藏了,但是我记住了一些常用网站的域名,或者编辑了收藏的备注,搜一下就有了。学习也是,经常用的书放在手边,尽可能减小我们做这件事情的代价,我们才能更多地做这件事情。假设要去健身房锻炼,需要走很远的路,通过很多道安检,然后要带很多装备,要花很长的一段完整的时间,很可能就会劝退很多人。小事很多人可以轻松地坚持,就是这个道理。降低门槛就是减小代价。更快进入状态是最重要的。一些专业的书籍还是太深入了。看一遍根本理解不了里面的意思。。

二叉树的遍历的迭代形式

这块大佬可能认为比较简单,但是对我来说,属于绝对的门槛。需要付出巨大努力都不一定能跨越的门槛。我需要把我的精力都贯注到这个知识点上面。

前序遍历的迭代版本,需要用到辅助栈存右子树,栈有先进后出,后进先出的特点,先尽可能地遍历左子树,哦这个叫做先序遍历啊,我还以为是前序遍历呢。。查了一下,好像是一个意思。先序遍历的迭代版本的辅助栈,入栈的时候可以对右子树判空进行优化,判断确认不是 NULL 之后才允许入栈,NULL 不用入栈,节省了空间,判断这个操作增加了判断时间,可能可以减少入栈和出栈的时间。考虑两个极端情况。

情况分析
几乎都有右孩子增加了判断的时间
几乎都没有右孩子增加了判断的时间,节省了空间,节省了入栈出栈的时间
总结综合来看,大概率是节省时间和空间的

最后

感觉专业课还有很远的路要走,心态最重要,然后慢慢学一些知识点吧。

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

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

相关文章

MiB和MB

本文来自腾讯元宝 MiB 和 ​MB 有区别&#xff0c;尽管它们都用于表示数据存储的单位&#xff0c;但它们的计算方式不同&#xff0c;分别基于不同的进制系统。 1. ​MiB&#xff08;Mebibyte&#xff09;​ ​MiB 是基于二进制的单位&#xff0c;使用1024作为基数。1 MiB 102…

Labview和C#调用KNX API 相关东西

叙述:完全没有听说过KNX这个协议...................我这次项目中也是简单的用了一下没有过多的去研究 C#调用示例工程链接(labview调用示例在 DEBUG文件夹里面) 通过网盘分享的文件&#xff1a;KNX调用示例.zip 链接: https://pan.baidu.com/s/1NQUEYM11HID0M4ksetrTyg?pwd…

损失函数理解(二)——交叉熵损失

损失函数的目的是为了定量描述不同模型&#xff08;例如神经网络模型和人脑模型&#xff09;的差异。 交叉熵&#xff0c;顾名思义&#xff0c;与熵有关&#xff0c;先把模型换成熵这么一个数值&#xff0c;然后用这个数值比较不同模型之间的差异。 为什么要做这一步转换&…

Kubernetes的Replica Set和ReplicaController有什么区别

ReplicaSet 和 ReplicationController 是 Kubernetes 中用于管理应用程序副本的两种资源&#xff0c;它们有类似的功能&#xff0c;但 ReplicaSet 是 ReplicationController 的增强版本。 以下是它们的主要区别&#xff1a; 1. 功能的演进 ReplicationController 是 Kubernete…

信息系统运行管理员教程3--信息系统设施运维

第3章 信息系统设施运维 信息系统设施是支撑信息系统业务活动的信息系统软硬件资产及环境。 第1节 信息系统设施运维的管理体系 信息系统设施运维的范围包含信息系统涉及的所有设备及环境&#xff0c;主要包括基础环境、硬件设备、网络设备、基础软件等。 信息系统设施运维…

如何通过Python实现自动化任务:从入门到实践

在当今快节奏的数字化时代,自动化技术正逐渐成为提高工作效率的利器。无论是处理重复性任务,还是管理复杂的工作流程,自动化都能为我们节省大量时间和精力。本文将以Python为例,带你从零开始学习如何实现自动化任务,并通过一个实际案例展示其强大功能。 一、为什么选择Pyt…

Spring Boot 与 MyBatis Plus 整合 KWDB 实现 JDBC 数据访问

​ 引言 本文主要介绍如何在 IDEA 中搭建一个使用 Maven 管理的 Spring Boot 应用项目工程&#xff0c;并结合在本地搭建的 KWDB 数据库&#xff08;版本为&#xff1a;2.0.3&#xff09;来演示 Spring Boot 与 MyBatis Plus 的集成&#xff0c;以及对 KWDB 数据库的数据操作…

Java锁等待唤醒机制

在 Java 并发编程中&#xff0c;锁的等待和唤醒机制至关重要&#xff0c;通常使用 wait()、notify() 和 notifyAll() 来实现线程间的协调。本文将详细介绍这些方法的用法&#xff0c;并通过示例代码加以说明。 1. wait()、notify() 与 notifyAll() 在 Java 中&#xff0c;Obj…

 UNIX网络编程笔记:TCP客户/服务器程序示例

服务器实例 有个著名的项目&#xff0c;tiny web&#xff0c;本项目将其改到windows下&#xff0c;并使用RAII重构&#xff0c;编写过程中对于内存泄漏确实很头疼&#xff0c;还没写完&#xff0c;后面会继续更&#xff1a; #include <iostream> #include <vector&g…

AI Agent开发大全第四课-提示语工程:从简单命令到AI对话的“魔法”公式

什么是提示语工程&#xff1f;一个让AI“听话”的秘密 如果你曾经尝试过用ChatGPT或者其他大语言模型完成任务&#xff0c;那么你一定遇到过这样的情况&#xff1a;明明你的问题是清晰的&#xff0c;但答案却离题万里&#xff1b;或者你认为自己提供的信息足够详尽&#xff0c…

系统架构设计知识体系总结

1.技术选型 1.什么是技术选型&#xff1f; 技术选型是指评估和选择在项目或系统开发中使用的最合适的技术和工具的过程。这涉及考虑基于其能力、特性、与项目需求的兼容性、可扩展性、性能、维护和其他因素的各种可用选项。技术选型的目标是确定与项目目标相符合、能够有效解…

基于3DMax与Vray引擎的轻量级室内场景渲染实践

欢迎踏入3DMAX室内渲染的沉浸式学习之旅!在这个精心设计的实战教程中,我们将携手揭开3DMAX与Vray这对黄金搭档在打造现实室内场景时的核心奥秘。无论您是渴望入门的3D新手,还是追求极致效果的专业设计师,这里都将为您呈现从场景蓝图构建到光影魔法施加的完整技术图谱。我们…

逻辑卷,vdo,(阿里加速器)

一、逻辑卷 10 20 30 1.逻辑卷的2个特点 &#xff08;1&#xff09;逻辑卷可以将多个分区或者磁盘整合成一个更大的逻辑磁盘&#xff0c;然后可以从逻辑磁盘上划分出分区&#xff08;逻辑磁盘的大小等于整合的物理磁盘大小之和。&#xff09; &#xff08;2&#xff09;能…

检索增强生成(2)本地PDF 本地嵌入模型

from langchain_community.document_loaders import PyPDFLoader from pathlib import Pathdef load_local_pdf(file_path):if not Path(file_path).exists():raise FileNotFoundError(f"文件 {file_path} 不存在&#xff01;")loader PyPDFLoader(file_path)try:do…

安全守护:反光衣检测技术的革新之路

视觉分析助力船上工人反光衣检测 在现代工业生产与作业环境中&#xff0c;安全始终是首要考虑的因素。对于水上作业&#xff0c;如船舶维护、海上施工等场景&#xff0c;工人穿戴反光衣是预防事故、提高可见性的重要措施。然而&#xff0c;传统的人工检查方式不仅效率低下&…

【Scrapy】Scrapy教程8——处理子链接

通过前面几篇文章,已经了解了如何去爬取网页内容并存储到数据库,但是目前只是存储了一个页面的内容,现在想要获取每篇文章链接内的文章内容,我们来看看怎么获取。 生成新请求 首先我们肯定要先拿到链接,所以第一步都获取文章标题和链接肯定少不了,然后再爬取获取到到子…

Centos6配置yum源

Centos6配置yum源 为Centos6配置CentOS Vault源—防止yum源过期为Centos6配置epel源为Centos6配置ELRepo源---已ELRepo被官方清空Centos6安装dockerdocker配置国内镜像加速 为Centos6配置CentOS Vault源—防止yum源过期 参考&#xff1a;https://mirrors.ustc.edu.cn/help/cen…

“智改数转”新风口,物联网如何重构制造业竞争力?

一、政策背景 为深化制造业智能化改造、数字化转型、网络化联接&#xff0c;江苏省制定了《江苏省深化制造业智能化改造数字化转型网络化联接三年行动计划&#xff08;2025&#xff0d;2027年&#xff09;》&#xff0c;提出到2027年&#xff0c;全省制造业企业设备更新、工艺…

制作Oracle11g Docker 镜像

基于Linux系统&#xff0c;宿主主机要设置如下环境变量&#xff0c;oracle为64位版本 dockerfile中需要的数据库安装包可从csdn下载内找到 #!/bin/bash # 在宿主机上运行以设置Oracle所需的内核参数 # 这些命令需要root权限cat > /etc/sysctl.d/99-oracle.conf << EO…

从GTC2025首次量子日看英伟达量子AI融合算力网络前景与趋势

GTC2025 Quantum Day 最新内容全部汇总: 技术名称描述合作伙伴/开发者应用场景/目标量子模拟器优化方案NVIDIA与IonQ、D-Wave合作,针对量子模拟器进行性能优化,提升量子计算任务效率。IonQ、D-Wave量子算法开发、复杂系统模拟混合量子-经典计算架构结合量子计算与经典GPU加速…