【13】数据结构之树结构篇章
目录标题
- 树Tree
- 树的定义
- 树的基本概念
- 树的存储结构
- 双亲表示法
- 孩子表示法
- 孩子兄弟表示法
- 二叉树
- 二叉树与度不超过2的普通树的不同之处
- 二叉树的基本形态
- 二叉树的分类
- 二叉树的性质
- 二叉树的顺序存储
- 二叉树的链式存储
- 二叉树的链式存储的结点结构
- 树的遍历
- 先序遍历
- 中序遍历
- 后序遍历
- 输出二叉树的叶子结点
- 输出二叉树叶子结点的个数
- 输出二叉树的高度
- 链表存储的调试与代码集合
树Tree
- 数据结构中具有层次关系的非线性结构.
- 生活中常见各种树结构的应用
- 家谱树
- Windows文件系统
- 家谱树
树的定义
-
树为n个结点的有限集合T.
- n=0,没有结点,称为空树.
- n>0,必有一根.
- 根root结点,没有前驱结点.
- 其余n-1个结点可以划分成m棵根的子树.
-
特点
- 如下图,A为根结点,B、C、D为根结点的子树.
- 子树又有多棵子树组成.
- 每棵子树除根节点外,其余每个结点有且仅有一个直接前驱,但可以有0个或多个直接后继.
- 形成树的递归特性.
树的基本概念
- 结点:包含一个数据元素及若干指向其他结点的分支信息.
- 结点分类:根结点、叶子结点、非叶子结点、孩子结点、双亲结点、兄弟结点以及堂兄弟结点.
- 结点的度:一个结点的子树个数.
- 树的度:树中所有结点的度的最大值.
- 叶子结点:度为0的结点.
- 分支结点:度不为0的结点.
- 结点的层次:从根结点开始定义,根结点的层次为1,根的直接后继的层次为2,以此类推.
- 结点的层序编号:将树中的结点按从上到下、同层按从左到右的次序排成一个线性序列,依次给他们编以连续的自然数.
- 森林:m棵互不相交的树的集合.
- 孩子结点:相邻的两层之间用直线连接的层数更下面的结点.
- 双亲结点:相邻的两层之间用直线连接的层数更上面的结点.
- 兄弟结点:同一层的结点之间为兄弟结点.
- 堂兄弟结点:同一层的双亲不同的结点.
- 祖先结点:当前结点中所有上面层级与之链接的一脉结点.
- 子孙结点:当前结点中所有下面层级且与之链接的一脉结点.
- 前辈结点:当前结点以上层级的所有结点.
- 后辈结点:当前结点以下层级的所有结点.
- 有序树:如果在树的每一组兄弟结点之间定义一个从左到右的次序,则得到一颗有序树.
树的存储结构
双亲表示法
- 定义:用一组连续的存储单元存储树的每个结点,每个结点设置指针域parent指向双亲.
- 根结点指针域设置为-1.
- 按层序将每个结点编号.
- 按结点的层序编号,依次在列表中对应单元存储一个结点(data, parent).
- data:存储树结点中的数据元素.
- parent:存储该结点的双亲结点的列表下标值.
- 存储代码定义
class Node(object):def __init__(self, data, parent):self.data = dataself.parent = parent
- 树的示意图
- 双亲表示存储图
孩子表示法
- 定义:把每个结点的孩子结点排列起来,以单链表为存储结构.
- 存储结构将所有结点按层序编号顺序存储在列表中,用单链表的存储结构表示该结点的孩子结点.
- 树的示意图
- 存储结构表
孩子兄弟表示法
- 定义:树的左孩子右兄弟表示法指的是左边的孩子结点接管右边的孩子结点,链表中每个结点的两个链域分别指向该结点的左孩子和右兄弟.
- 采用孩子兄弟表示法进行转换的流程示意图:
二叉树
- 作为一类非常重要的特殊的树状结构.
- 特点每个结点至多有2个孩子结点,并且有左右之分.
- 左边的孩子成为左孩子结点,位于右边的孩子结点称为右孩子结点.
二叉树与度不超过2的普通树的不同之处
- 在普通树中,若结点只有一个孩子结点,无左右之分.
- 二叉树为有序数,左子树和右子树的次序不能颠倒,即使树中某个结点只有一棵子树,也要区别是左子树还是右子树.
- 在有序树中,虽然一个结点的孩子结点之间是有左右次序之分的,但是若该结点只有一个孩子结点,则无须区分其左右次序.
- 在二叉树中,即使是一个孩子结点也要做出左右孩子结点.
二叉树的基本形态
- 1.空二叉树
- 2.仅有根结点的二叉树
- 3.仅有一棵左子树的二叉树
- 4.仅有一棵右子树的二叉树
- 5.有两棵子树的二叉树
二叉树的分类
-
满二叉树:一棵高度为k且有2^k-1个结点的二叉树
- 叶子结点只能出现在最后一层,
- 非叶子结点都在左右子树,
- 在同样高度的二叉树中,满二叉树的结点数最多,叶子数最多.
-
完全二叉树:若满二叉树最后一层的结点,从右向左连续缺若干结点,就是完全二叉树
- 叶子结点只能出现在最下两层,
- 最下层的叶子结点一定集中在左边连续位置,
- 如果结点的度为1,那么该结点只有左孩子结点,不存在只有右孩子结点的情况,
- 有同样结点数的二叉树,完全二叉树的高度最小.
-
联系与区别
- 若某个结点没有左孩子的结点,那么它一定没有右孩子结点
- 满二叉树除叶子结点外,其中每个结点都有两个孩子结点,每层的结点数都达到最大
- 满二叉树一定也是完全二叉树,但完全二叉树不一定为满二叉树.
二叉树的性质
- 1.若二叉树的层次从1开始计数,则在二叉树的第i层最多有2^(i-1)个结点.
- 2.高度为k的二叉树最多有(2^k)-1个结点.
- 3.高度为k的二叉树最少有k个结点.
- 4.具有n个结点的二叉树的高度最多为n.
- 5.具有n个结点的二叉树的高度最少为 log 2 n + 1 \mathcal{}\log_2 n+1 log2n+1
- 6.对于任何一棵二叉树,如果其叶子结点有a个,度为2的结点有b个,则有a=b+1.
- 7.n个结点可以组成 1 n + 1 ⋅ ( 2 n ) ! n ! ⋅ n ! \frac{1}{n+1} \cdot \frac{(2n)!}{n! \cdot n!} n+11⋅n!⋅n!(2n)!种不同构的二叉树.
- 8.具有n个结点的完全二叉树的高度为 log 2 n + 1 \mathcal{}\log_2 n+1 log2n+1
- 9.如果完全二叉树各层次结点从1开始编号,即1,2,3,…,n,那么则可得以下关系:
- 仅当i=1时,结点i为根结点;
- 当i>1时,结点i的双亲结点编号为i/2(取整);
- 结点i的左孩子结点编号为2i;
- 结点i的右孩子结点编号为2i+1;
- 若2i>n,则结点i无左孩子结点;
- 若2i+1>n,则结点i无右孩子结点.
二叉树的顺序存储
-
顺序存储实现
- 层序编号 = 列表下标值+1
- 层序编号 = 列表下标值+1
-
顺序存储的初始化
def __init__(self, array):self.array = array # 顺序存储的数组(完全二叉树形式)
- 前序遍历
def preOrder(self):"""前序遍历:根 -> 左 -> 右"""result = []def _preorder(index):if index >= len(self.array) or self.array[index] is None:returnresult.append(self.array[index])_preorder(2 * index + 1) # 左子节点_preorder(2 * index + 2) # 右子节点_preorder(0) # 从根节点开始return result
- 中序遍历
def midOrder(self):"""中序遍历:左 -> 根 -> 右"""result = []def _inorder(index):if index >= len(self.array) or self.array[index] is None:return_inorder(2 * index + 1)result.append(self.array[index])_inorder(2 * index + 2)_inorder(0)return result
- 后序遍历
def postOrder(self):"""后序遍历:左 -> 右 -> 根"""result = []def _postorder(index):if index >= len(self.array) or self.array[index] is None:return_postorder(2 * index + 1)_postorder(2 * index + 2)result.append(self.array[index])_postorder(0)return result
- 顺序存储的调试与代码集合
class SeqTree:def __init__(self, array):self.array = array # 顺序存储的数组(完全二叉树形式)def preOrder(self):"""前序遍历:根 -> 左 -> 右"""result = []def _preorder(index):if index >= len(self.array) or self.array[index] is None:returnresult.append(self.array[index])_preorder(2 * index + 1) # 左子节点_preorder(2 * index + 2) # 右子节点_preorder(0) # 从根节点开始return resultdef midOrder(self):"""中序遍历:左 -> 根 -> 右"""result = []def _inorder(index):if index >= len(self.array) or self.array[index] is None:return_inorder(2 * index + 1)result.append(self.array[index])_inorder(2 * index + 2)_inorder(0)return resultdef postOrder(self):"""后序遍历:左 -> 右 -> 根"""result = []def _postorder(index):if index >= len(self.array) or self.array[index] is None:return_postorder(2 * index + 1)_postorder(2 * index + 2)result.append(self.array[index])_postorder(0)return result# 测试案例
if __name__ == "__main__":print('PyCharm')# 测试树结构:# 1# / \# 2 3# \ / \# 4 5 6arr = [1, 2, 3, None, 4, 5, 6]tree = SeqTree(arr)print("前序遍历:", tree.preOrder()) # 输出: [1, 2, 4, 3, 5, 6]print("中序遍历:", tree.midOrder()) # 输出: [2, 4, 1, 5, 3, 6]print("后序遍历:", tree.postOrder()) # 输出: [4, 2, 5, 6, 3, 1]
- 顺序存储的缺点:
- 由于必须按完全二叉树的形式来存储树中的结点,因此将造成存储空间的浪费,
- 在最坏的情况下,一个只有k个结点的仅有右孩子结点的二叉树缺需要2^(k-1)个结点的存储空间.
- 因此,满二叉树和完全二叉树适合使用顺序存储结构实现.
二叉树的链式存储
二叉树的链式存储的结点结构
- 两个指针域left和right,分别指向左孩子和右孩子结点的指针
- 一个数据域data用于存储该结点的数据元素
- 二叉树链式存储结点
class Node(object):def __init__(self, data):self.data = dataself.left = Noneself.right = None
- 三叉树链式存储结点
class Node(object):def __init__(self, data):self.data = dataself.parent = Noneself.left = Noneself.right = None
树的遍历
- 树的遍历按某种次序访问树中的结点,要求树中每个结点被访问一次且仅被访问一次.
先序遍历
- 最先访问根结点,然后访问树的左子树,最后访问树的右子树.
def preOrder(self, node):"""先序遍历:param node:树结点"""if node != None:print(node.data, end=",")self.preOrder(node.left)self.preOrder(node.right)
中序遍历
- 最先访问树的左子树,然后访问根结点,最后是访问树的右子树.
- 案例
- 遍历过程:
- 1.A有左子树,先访问左子树.
- 2.B没有左子树,输出B.
- 3.D有左子树,访问其左子树.
- 4.F没有左子树,输出F.
- 5.F也没有右子树,返回F的根结点D,输出D.
- 6.输出D之后,A的整个左子树遍历完毕,返回根结点A,输出A.
- 7.C有左子树,先访问左子树.
- 8.E无左子树,输出E.
- 9.E无左右子树,返回根结点C,输出C.
- C无右子树,则A的右子树遍历完毕.
def midOrder(self, node):"""中序遍历:param node::return:"""if node != None:self.midOrder(node.left)print(node.data, end=",")self.midOrder(node.right)
后序遍历
- 最先访问树的左子树,然后访问树的右子树,最后访问根结点.
def postOrder(self, node):"""后序遍历:param node::return:"""if node != None:self.postOrder(node.left)self.postOrder(node.right)print(node.data, end=",")
输出二叉树的叶子结点
def getLeaf(self, node):"""输出叶子结点:param node::return:"""if node != None:if node.left == None and node.right == None:print(node.data, end=" ")self.getLeaf(node.left)self.getLeaf(node.right)
输出二叉树叶子结点的个数
- 递归方法实现:
- 如果树为空,叶子结点个数为0
- 如果只有1个结点,则为1
- 否则,叶子结点个数 = 左子树叶子结点个数+右子树叶子结点个数
def getLeafCount(self, node):"""输出叶子结点的个数:param node::return:"""if node == None:leafCount = 0elif node.left == None and node.right == None:leafCount = 1else:leafCount = self.getLeafCount(node.left) + self.getLeafCount(node.right)return leafCount
输出二叉树的高度
- 递归实现
- 若树为空树,则高度为0
- 若树非空,高度应为其左右子树高度中的最大值加1.
def height(self, node):"""求二叉树的高度:param node::return:"""if node != None:leafHeight = self.height(node.left)rightHeight = self.height(node.right)if leafHeight > rightHeight:max = leafHeightelse:max = rightHeightreturn max+1else:return 0
链表存储的调试与代码集合
class Node(object):def __init__(self, data):self.data = dataself.left = Noneself.right = Noneclass BinaryTree:def __init__(self, root = None):self.root = rootdef preOrder(self, node):"""先序遍历:param node:树结点"""if node != None:print(node.data, end=" ")self.preOrder(node.left)self.preOrder(node.right)def midOrder(self, node):"""中序遍历:param node::return:"""if node != None:self.midOrder(node.left)print(node.data, end=" ")self.midOrder(node.right)def postOrder(self, node):"""后序遍历:param node::return:"""if node != None:self.postOrder(node.left)self.postOrder(node.right)print(node.data, end=" ")def getLeaf(self, node):"""输出叶子结点:param node::return:"""if node != None:if node.left == None and node.right == None:print(node.data, end=" ")self.getLeaf(node.left)self.getLeaf(node.right)def getLeafCount(self, node):"""输出叶子结点的个数:param node::return:"""if node == None:leafCount = 0elif node.left == None and node.right == None:leafCount = 1else:leafCount = self.getLeafCount(node.left) + self.getLeafCount(node.right)return leafCountdef height(self, node):"""求二叉树的高度:param node::return:"""if node != None:leafHeight = self.height(node.left)rightHeight = self.height(node.right)if leafHeight > rightHeight:max = leafHeightelse:max = rightHeightreturn max+1else:return 0if __name__ == "__main__":# 构建示例树# 1# / \# 2 3# \ / \# 4 5 6root = Node('1')root.left = Node('2')root.right = Node('3')root.left.right = Node('4')root.right.left = Node('5')root.right.right = Node('6')tree = BinaryTree(root)print("前序遍历:")tree.preOrder(root)print("\n中序遍历:")tree.midOrder(root)print("\n后序遍历:")tree.postOrder(root)print("\n树的叶子结点:")tree.getLeaf(root)print("\n输出叶子结点的个数:")print(tree.getLeafCount(root))print("输出二叉树的高度:")print(tree.height(root))
相关文章:
【13】数据结构之树结构篇章
目录标题 树Tree树的定义树的基本概念树的存储结构双亲表示法孩子表示法孩子兄弟表示法 二叉树二叉树与度不超过2的普通树的不同之处二叉树的基本形态二叉树的分类二叉树的性质 二叉树的顺序存储二叉树的链式存储二叉树的链式存储的结点结构树的遍历先序遍历中序遍历…...
SAP GUI 显示SAP UI5应用,并实现SSO统一登陆
想用SAP UI5 做一写界面,又不想给用户用标准的Fiori APP怎么办?我觉得可以用可配置物料标准功能的思路,在SAP GUI中显示UI5界面,而不是跳转到浏览器。 代码实现后的效果如下: 1、调用UI5应用,适用于自开发…...
Linux环境变量详解
引言 在Linux系统中,环境变量是一种非常重要的概念,它影响着系统的运行方式和应用程序的行为。无论你是Linux新手还是经验丰富的管理员,深入理解环境变量都能帮助你更高效地使用和管理Linux系统。本文将从基础概念到高级应用,全面…...
【antd + vue】Tree 树形控件:默认展开所有树节点 、点击文字可以“选中/取消选中”节点
一、defaultExpandAll 默认展开所有树节点 1、需求:默认展开所有树节点 2、问题: v-if"data.length"判断的层级不够,只判断到了物理那一层,所以只展开到那一层。 3、原因分析: 默认展开所有树节点, 如果是…...
专题三——二分查找
目录 一、二分查找 1、题目 2、解题思路 3、代码实现 4、时间复杂度 5、朴素二分法的模板总结 二、在排序数组中查找元素的第一个和最后一个位置 1、题目 2、题目解析 3、代码实现 4、 模板总结(重点) 三、x的算法平方根 1、题目 2、 题目解…...
从零实现HTTP服务器
响应: 第一部分测试代码,读取请求 Makefile binhttpserver #生成的可执行程序 ccg #编译器名称 LD_FLAGS-stdc11 -lpthread #-DDEBUG1 #链接选项 srcmain.cc$(bin):$(src)$(cc) -o $ $^ $(LD_FLAGS).PHONY:clean clean:rm -f $(bin) 1111111 main.cc…...
智能检索知识库
一、智能检索知识库作用 1. 提升信息检索效率,降低人力成本 快速获取精准答案:员工无需手动翻阅大量文档(如产品手册、合同、技术文档),直接通过自然语言提问获取答案。 减少重复性工作:HR、客服、技…...
北斗导航 | 接收机自主完好性监测(RAIM)算法学习思路总结及其算法研究:理论、实现与验证
===================================================== github:https://github.com/MichaelBeechan CSDN:https://blog.csdn.net/u011344545 ===================================================== 接收机自主完好性监测学习思路 壹、学习思路贰、理论、实现与验证1. 引…...
无法读取库伦值文件节点解决方案
读取库伦值的目的是为了换算成电流,量化场景功耗用途 1.报错日志 /power_log/debuglogger$ adb shell dmesg | grep -Ei "avc..system_server"[ 79.942272] logd.auditd: type1400 audit(1744279324.832:7149): avc: denied { read } for comm"…...
OCR API识别对比
OCR 识别DEMO OCR识别 demo 文档由来 最开始想使用百度开源的 paddlepaddle大模型 研究了几天,发现表格识别会跨行,手写识别的也不很准确。最终还是得使用现成提供的api。。 文档说明 三个体验下来 腾讯的识别度比较高,不论是手写还是识别表…...
高速电路设计概述
1.1 低速设计和高速设计的例子 本节通过一个简单的例子,探讨高速电路设计相对于低速电路设计需要考虑哪些不同的问题。希望读者通过本例,对高速电路设计建立一个表象的认识。至于高速电路设计中各方面的设计要点,将在后续章节展开详细的讨论…...
Keil C51中32位变量赋值异常问题分析与解决
Keil C51中32位变量赋值异常问题分析与解决 问题描述 在使用Keil5对51单片机进行编程时,遇到一个32位变量赋值不正确的问题。具体代码如下: typedef unsigned long uint32;g_Flow_Time (uint32)Storage[2] << 24 | Storage[3] << 16 | S…...
python工程中的包管理(requirements.txt)
pip install -r requirements.txtpython工程通过requirements.txt来管理依赖库版本,上述命令,可以一把安装依赖库,类似java中maven的pom.xml文件。 参考 [](...
用Python修改字体字形与提取矢量数据:fontTools实战指南
字体设计与分析是NLP和视觉领域的交叉应用,而**fontTools** 是一款强大的Python库,可以让我们直接操作字体文件的底层结构。本文将通过两个实用函数,展示如何修改特定字形和提取所有字形的矢量数据,帮助开发者快速上手字体编辑与分…...
数据库守护神-WAL机制
什么是WAL机制? WAL(Write-Ahead Logging,预写日志)是一种保证数据库操作原子性和持久性的核心机制。其核心原则可概括为: 任何数据修改操作,必须在对应的日志记录持久化到磁盘之后,才能将实际…...
[MySQL]数据库与表创建
欢迎来到啾啾的博客🐱。 这是一个致力于构建完善 Java 程序员知识体系的博客📚。 它记录学习点滴,分享工作思考和实用技巧,偶尔也分享一些杂谈💬。 欢迎评论交流,感谢您的阅读😄。 本篇简单记录…...
工作记录 2015-05-27
工作记录 2015-05-27 序号 工作 相关人员 1 修改了指定短语的大小写的处理。 取消了一些逗号的处理。 郝 另: iCDA更新到了190的D:\Temp\CHTeam\iCDA_20150527下了 修改的文件: bin目录下是程序。 0223目录下是0223的一些设置和关键字。 更新…...
嵌入式汇编语言从小白到入门:从零开始的底层编程之旅
嵌入式汇编语言从小白到入门:从零开始的底层编程之旅 汇编语言作为最接近机器语言的编程方式,在嵌入式开发中扮演着不可替代的角色。本文将带你从零开始,逐步掌握嵌入式汇编语言的核心概念和实践技巧,最终能够独立编写简单的汇编程序并与C语言混合编程。 一、汇编语言与嵌…...
GPIO_ReadInputData和GPIO_ReadInputDataBit区别
目录 1、GPIO_ReadInputData: 2、GPIO_ReadInputDataBit: 总结 GPIO_ReadInputData 和 GPIO_ReadInputDataBit 是两个函数,通常用于读取微控制器GPIO(通用输入输出)引脚的输入状态,特别是在STM32系列微控制器中。它们之间的主要…...
不使用docker在本地安装与配置RAGFlow
RAGFlow 本地安装与配置(非docker方式) 一. 运行环境 windows10 CPU i7-12700F 2.10GHz内存 32GGPU RTX 4060 Ti 8G wsl 2 Ubuntu-22.04 1. 防火墙配置 wsl默认访问windows的本机服务需要配置防火墙,否则访问会失败。 windows10的防火墙配置: 打…...
sysfs 设备模型
介绍 Sysfs 设备文件系统与proc是同一类的文件系统,基于ramfs实现的内存文件系统。 1.1 为什么会有 sysfs?procfs 的局限性: 早期,Linux 使用 procfs 来提供内核与用户空间的交互接口。但 procfs 的设计不够层次化,设…...
彩讯携Rich AICloud与一体机智算解决方案亮相中国移动云智算大会
2025年4月10日,2025中国移动云智算大会在苏州盛大开幕,本次大会以“由云向智 共绘算网新生态”为主题,与会嘉宾围绕算力展开重点探讨。 大会现场特设区域展出各参会单位的最新算力成果,作为中国移动重要合作伙伴,彩讯…...
js触发隐式类型转换的场景
JavaScript 的隐式类型转换(Implicit Type Coercion)会在某些操作或上下文中自动触发,将值从一种类型转换为另一种类型。以下是常见的触发场景: 1. 使用 (宽松相等)比较时 会尝试将两边的值转换为相同类型后…...
《AI大模型应知应会100篇》第9篇:大模型的推理能力:原理与实现
第9篇:大模型的推理能力:原理与实现 摘要 近年来,随着大语言模型(LLM)的快速发展,其推理能力逐渐成为研究和应用中的热点话题。这些模型不仅能够生成流畅的文本,还能在一定程度上进行逻辑推理、…...
PODS_ROOT、BUILT_PRODUCTS_DIR和SRCROOT有什么区别
在 iOS/macOS 开发中,${PODS_ROOT}、${BUILT_PRODUCTS_DIR} 和 ${SRCROOT} 是三个核心的 Xcode 环境变量,它们的区别主要体现在 目录层级、内容归属 和 生命周期 上。以下是结构化对比和具体示例: 1. 定义与作用域对比 变量全称指向路径管理…...
Elasticsearch 系列专题 - 第六篇:高级功能与生态系统
Elasticsearch 不仅是一个强大的搜索引擎,还提供了高级功能和丰富的生态系统支持。本篇将深入探讨这些特性,并介绍如何与其他工具协同工作。 1. 高级特性 1.1 跨集群搜索(Cross-Cluster Search) 跨集群搜索允许查询多个独立集群的数据,适用于分布式系统。 配置远程集群:…...
python的web框架flask(hello,world版)
问题 最近需要基于一个开源项目进行二次开发,但是,现在的我主修java,从来没有接触过python的web开发。所以,我现在需要学习一下flask的hello,world。 python版本选择 通过这个Python版本状态页面Status of Python v…...
Vue学习笔记 - 逻辑复用 - 组合式函数
昨天参加了次视频面试,慢慢可以查漏补缺,继续学习Vue相关的知识,考虑找个实际的开源项目。 逻辑复用 组合式函数 在 Vue 应用的概念中,“组合式函数”(Composables) 是一个利用 Vue 的组合式 API 来封装和复用有状态逻辑的函数。 无状态的…...
Caffeine的两种实现方式
咱们来具体对比一下你之前给的这段配置代码👇: java Configuration EnableCaching public class CacheConfig { Bean public CacheManager cacheManager() { CaffeineCacheManager manager new CaffeineCacheManager("myCache"); manager.…...
单细胞Seurat标准分析流程R语言封装
单细胞Seurat标准分析流程R语言封装 数据预处理与质控(线粒体基因比例计算、QC图表生成)标准化与高变基因筛选PCA/UMAP降维与聚类分析 差异表达分析模块自动化输出PNG可视化图表(质控小提琴图、UMAP聚类图)结果将保存在results/和figures/目录下(RDS对象、差异基因CSV表格…...
MOS管的发热原因和解决办法
发热来源 如上图,MOS管的工作状态有4种情况,分别是开通过程,导通过程,关断过程和截止过程。 导致发热的损耗主要有两种:开关损耗、导通损耗。 导通损耗 导通损耗比较好计算,根据驱动电压VGS值可以得到MOS…...
航顺HK32M070电钻解决方案:驱动未来,掌控无限可能
一、市场规模与增长:电动工具行业持续扩容,电钻需求强劲 全球电动工具市场规模近年来保持稳定增长,2023年市场规模已达288.5亿美元,预计2024年将突破304.9亿美元,年复合增长率达6.9%。中国市场表现尤为亮眼࿰…...
关于nacos注册的服务的ip异常导致网关路由失败的问题
文章目录 关于nacos注册的服务的ip异常导致网关路由失败的问题相关处理方案为方案一:手动指定服务注册的 IP 地址方法二:设置优先使用的网络段方法三:指定网络接口方法四:忽略特定的网卡 备注 关于nacos注册的服务的ip异常导致网关路由失败的…...
UI测试流程与关键注意点解析
在当今以用户体验为核心的数字时代,用户界面(UI)作为软件与用户交互的直接窗口,其质量直接影响着产品的成败。UI测试作为软件测试的重要组成部分,确保应用程序不仅功能完善,而且在视觉呈现和交互体验上也能满足用户期望。 作为软…...
从零开始构建智能聊天机器人:Rasa与ChatGPT API实战教程
引言:AI对话系统的时代机遇 在数字化转型浪潮中,聊天机器人已成为连接用户与服务的关键纽带。无论是客服系统中的724小时即时响应,还是智能家居中的语音交互,聊天机器人正在重塑人机交互方式。本文将通过详细教程,手把…...
SSM aop切面编程的学习
面向切面的AOP编程的引入: 1. 代码缺陷 - 非核心代码对核心业务功能有干扰,导致程序员在开发核心业务功能时分散了精力 - 附加功能代码重复,分散在各个业务功能方法中!冗余,且不方便统一维护! 2. 解决思路 …...
Zen 5白色装机优选,华硕X870 AYW GAMING WIFI W主板来了!
华硕X870/X870E系列主板再次迎来新成员——华硕X870 AYW GAMING WIFI W主板正式发售!专为追求高性价比游戏玩家而量身打造,延续AYW系列经典SPACE太空元素,配合大面积银白色散热装甲,打造出了极具金属质感和科技感的外观࿰…...
第Y1周:调用YOLOv5官方权重进行检测
🍨 本文为🔗365天深度学习训练营 中的学习记录博客🍖 原作者:K同学啊 文章目录 1、前言2、下载源码3、运行代码 1、前言 YOLOv5分为YOLOv5s、YOLOv5m、YOLOv5l、YOLOv5x四个版本,这里以YOLOv5s为例。 2、下载源码 安…...
科技项目验收测试怎么做?验收测试报告如何获取?
科技项目从研发到上市需要一个很长的周期,并且在上市之前还有一个至关重要的交付过程,那就是项目验收,验收需要通过验收测试来呈现。科技项目验收测试是确保项目成功交付的关键步骤,那么是如何进行的呢?企事业单位想要获取科技项…...
C++笔记
C知识笔记 一、C概述 C是一种通用编程语言,它在C语言的基础上扩展而来,支持面向对象编程、泛型编程和过程化编程等多种编程范式。C具有高效、灵活、接近硬件等特点,广泛应用于系统软件、应用软件、嵌入式系统、游戏开发等领域。其强大的性能…...
国产Linux统信安装mysql8教程步骤
系统环境 uname -a Linux FlencherHU-PC 6.12.9-amd64-desktop-rolling #23.01.01.18 SMP PREEMPT_DYNAMIC Fri Jan 10 18:29:31 CST 2025 x86_64 GNU/Linux下载离线安装包 浏览器下载https://downloads.mysql.com/archives/get/p/23/file/mysql-test-8.0.33-linux-glibc2.28…...
如何应对“最后时刻任务堆积”(鼓包现象)
应对“最后时刻任务堆积”(鼓包现象)的方法包括:合理规划项目时间表、强化进度跟踪管理、明确任务优先级、有效的资源配置、提升团队沟通效率。其中,强化进度跟踪管理尤为关键。根据项目管理协会(PMI)的调查…...
C语言,原码、补码、反码
计算机是以补码来存储的 原码:正数最高位为:0;负数最高位为:1 (最高位是符号位) 正数:三码合一 如:2: 原码:0000 0000 0000 0000 0000 0000 0000 0010&#…...
Unifying Short and Long-Term Tracking with Graph Hierarchies—CVPR2023
Unifying Short and Long-Term Tracking with Graph Hierarchies 博客目录 Unifying Short and Long-Term Tracking with Graph Hierarchies摘要概况引言和相关介绍提出的观点 SUSHI核心构建跟踪图的层次结构构建分层剪辑分区 做第二个创新模块的需要将研究的重点从处理遮挡的问…...
深入解析 C# 中的模板方法设计模式
模板方法设计模式(Template Method Pattern)是行为型设计模式中的一种,它定义了一个操作中的算法框架,并允许子类在不改变算法整体结构的情况下,重新定义该算法的某些步骤。该模式通常用于类中包含一系列固定步骤的算法…...
0411 | 软考高项笔记:项目立项
在软考的项目管理知识体系中,技术可行性和经济可行性是项目立项阶段非常重要的两个分析维度。以下是对这两个考点的详细解释和记忆方法: 技术可行性分析 定义: 技术可行性分析是评估项目在现有技术条件和资源下是否能够成功实施。它主要回答…...
ubnetu 服务器版本常用端口和开放的端口对应的应用
1. 使用 netstat 查看端口与进程 netstat 是查看网络连接和监听端口的常用工具。通过以下命令可以列出所有开放的TCP/UDP端口及其关联的进程: sudo netstat -tulnp参数解析: -t:显示TCP端口。 -u:显示UDP端口。 -l࿱…...
【服务器端表单字符验证】
文章目录 一、实验目的二、核心代码实现三、调试关键问题四、总结 一、实验目的 掌握JSP表单验证在服务器端的实现技术,实现对用户输入字符的非空及长度为5的验证,返回对应提示信息并优化用户交互。 二、核心代码实现 前端表单 <form action"…...
pip 与 conda 的全面比较:Python 包管理的深度解析
在 Python 的生态系统中,包管理工具是开发者日常工作的重要组成部分。其中,pip 和 conda 是最常用的两种包管理工具。虽然它们在功能上有一些重叠,但在设计理念、功能范围、依赖管理、环境隔离等方面存在显著差异。本文将从多个维度深入…...
GTID不一致修复
背景描述 GTID模式下,mysql主从切换后,主从同步报错 Last_IO_Error: Got fatal error 1236 from master when reading data from binary log: The slave is connecting using CHANGE MASTER TO MASTER_AUTO_POSITION 1, but the master has purged bi…...