【数据结构】树与二叉树——树的基本概念

树的基本概念

  • 导读
  • 一、树的定义
  • 二、树的基本术语
    • 2.1 结点之间的关系
    • 2.2 基本概念
    • 2.3 度为m的树与m叉树
  • 三、树的性质
  • 结语

封面

导读

大家好,很高兴又和大家见面啦!!!

从今天开始,我们将进入第五章的内容——树与二叉树的学习。

我们之前学习到的线性表、栈和队列、数组、串这些数据结构,它们的元素在逻辑上都是呈现线性关系的,也就是结构中的元素与元素之间都是一对一的关系,但是现在我们要学习的树这种数据结构元素与元素之间则是一对多和多对一的关系。

我们知道现实生活中的树都是从种子开始,先是向下生根,之后向上生长树干,随后从树干上开始分化出多根树枝,最后在树枝上再长出更多的树叶。对于一棵树而言,下往上看它有且仅有一个树干,但是它可以有很多的树枝和树叶,树干与树枝和树叶之间呈现的是一对多的关系,而从上往下看,很多的树叶可以生长在同一根树枝上,很多的树枝可以生长在同一根树干上,因此树叶与树枝是多对一的关系,同理树枝与树干也是多对一的关系。如下图所示:

树的结构图
一棵树为了能够存活,它会从树干的底部的树根中继续向下分化出多个分支去寻找水源,而每个分支上还能继续分化出更多的分支,因此从树干往下看,树根与分支之间是属于一对多的关系,当我们从下往上看时,分支与树根之间则是多对一的关系。

我们不难发现,在现实生活中的树,每棵树的结构都是一对多和多对一的关系。之前我们也提到过计算机语言就是从计算机的角度来描述这个世界,因此,在计算机中,我们同样把数据之间在逻辑上呈现出的一对多和多对一的关系的这种逻辑结构称之为树。

树对我们来说既熟悉又陌生,现在我们仅仅知道它的逻辑结构,而其他的内容,我们却一无所知。因此,在今天的篇章中我们将会学习树的一些基本概念。接下来我们就开始今天的内容吧!!!

一、树的定义

树是n(n>=0)个结点的有限集。当n=0时,称为空树。在任意一棵非空树种应满足:

  1. 有且仅有一个特定的称为根的结点
  2. 当n>1时,其余结点可分为m(m>0)个互不相交的有限集 T 1 , T 2 , … … , T m T_1,T_2,……,T_m T1,T2,……,Tm,其中每个集合本身又是一棵树,并且称为根的子树。

从树的定义中我们可以看到,它的定义是一种递归定义,即在树的定义中又用到了其自身,树是一种递归的数据结构。树作为一种逻辑结构,同时也是一种分层结构,如下所示:

树的逻辑结构
从图中我们可以看到,树具有以下两个特点:

  1. 树的根结点没有前驱,除根结点外的所有结点有且只有一个前驱。
  2. 树中所有结点都可以有零个或多个后继。

树适合于表示具有层次结构的数据。树中的某个结点(除根结点外)最多只和上一层的一个结点(即其父结点)有直接关系,根结点没有直接上层结点,因此在n个结点的树中有n-1条边,而树中每个结点与其下一层的零个或多个结点(其子女结点)都有直接关系。

二、树的基本术语

2.1 结点之间的关系

在线性表中,我们将数据之间的关系称为前驱和后继,除了第一个元素外,其他的每个元素都有且仅有一个直接前驱,除了最后一个元素外,其他元素都有且仅有一个直接后继。但是在树这种逻辑结构中,结点直接的关系并不是用前驱和后继来进行描述的,当我们在描述一棵树时,我们会将人类的亲缘关系带入到树的各个结点中,如下所示:

双亲:一个结点它的直接上层结点(直接前驱结点)就是它的双亲结点,也称为父结点
孩子:一个结点它的直接下层结点(直接后继结点)就是它的孩子结点
祖先:一个结点的父结点的父结点就是这个结点的祖先结点。
子孙:一个结点是它祖先结点的子孙结点
兄弟:有同一个父结点的结点之间互为兄弟结点
堂兄弟:兄弟结点的孩子结点互为堂兄弟结点

不知道大家有没有听过《爸爸的爸爸叫什么》这首歌,在这首歌的歌词中就很好的介绍了人类之间的亲缘关系:

爸爸的爸爸叫什么,爸爸的爸爸叫爷爷
爸爸的妈妈叫什么,爸爸的妈妈叫奶奶
爸爸的哥哥叫什么,爸爸的哥哥叫伯伯
爸爸的弟弟叫什么,爸爸的弟弟叫叔叔
爸爸的姐妹叫什么,爸爸的姐妹叫姑姑
妈妈的爸爸叫什么,妈妈的爸爸叫外公
妈妈的妈妈叫什么,妈妈的妈妈叫外婆
妈妈的兄弟叫什么,妈妈的兄弟叫舅舅
妈妈的姐妹叫什么,妈妈的姐妹叫阿姨
爷爷爸爸的爸爸叫爷爷,奶奶爸爸的妈妈叫奶奶
伯伯爸爸的哥哥叫伯伯,叔叔爸爸的弟弟叫叔叔
姑姑爸爸的姐妹叫姑姑,外公妈妈的爸爸叫外公
外婆妈妈的妈妈叫外婆,舅舅妈妈的兄弟叫舅舅
阿姨妈妈的姐妹叫阿姨……

现在大家可能会对这个祖先有些好奇,为什么它不直接叫爷爷结点呢?这是因为这个祖先的含义并不止是父结点的父结点,而是一个结点的所有与它的父结点有关系的上层结点。换成人类亲缘关系来理解就是我的爷爷是我的祖先,我的爷爷的爸爸也是我的祖先,我的爷爷的爷爷更是我的祖先,也就是爷爷辈即以上辈分且与我有血缘关系的人都是我的祖先。

文字的表述显得有些许苍白了,为了更好的区分这些关系,我们直接通过具体的例子来进行说明,如下所示:
结点之间的关系
在这棵树中,结点A作为树的根结点,它与其它结点的关系为:

  1. 结点A是结点B和结点C的父结点
  2. 结点A是其它结点的祖先结点

结点B与其它结点的关系为:

  1. 结点A是结点B的父结点
  2. 结点B是结点A的孩子结点;
  3. 结点B和结点C都拥有同一个父结点A,因此结点B和结点C是兄弟结点
  4. 结点B是结点D和结点E的父亲结点,是结点H、I、J、K的祖先结点

结点D与其它结点的关系为::

  1. 结点B是结点D的父结点
  2. 结点A是结点D的祖先结点,结点D是结点A的子孙结点
  3. 结点E是结点D的兄弟结点
  4. 结点F和结点G与结点D的父结点互为兄弟结点,因此结点F和结点G是结点D的堂兄弟结点
  5. 结点H和结点I是结点D的孩子结点

结点H与其它结点的关系为::

  1. 结点D是结点H的父结点
  2. 结点B和结点A是结点H的祖先结点,结点H是结点A和结点B的子孙结点
  3. 结点I与结点H互为兄弟结点
  4. 结点J,K,L,M,N,O都是结点H的堂兄弟结点

通过这个例子相必大家应该对这些关系的理解更加深刻了吧。结点的关系我们先介绍到这里,接下来我们继续来看一下在树中的其它的基本术语;

2.2 基本概念

在树中,因为数据元素在存储时逻辑上是呈现树状的,因此,对于不同的部分也有其对应的术语,如下所示:

结点的度:树中的一个结点的孩子个数称为该结点的度
树的度:树中结点的最大度数称为树的度
分支结点:度大于0的结点称为分支结点,又称非终端结点
叶结点:度为0的结点称为叶结点,又称终端结点
结点的层次:从树根开始定义,根结点为第1层,它的子节点为第2层,以此类推。
结点的深度:从根结点开始自顶向下逐层累加;
结点的高度:从叶结点开始自底向上逐层累加;
树的高度(或深度):树中结点的最大层数

以上这些术语都是对于同一颗树而言,下面我们通过图像来加深对这些术语的印象:
树的基本术语
这里我们需要注意的是以下两几点:

  1. 在树中,结点的高度和深度是不一样的,高度是随着树的层次的增加而减少,深度则是随着层次的增加而增加,而对于树而言,树的高度就是结点的最大高度,树的深度就是结点的最大深度,因此树的高度与树的深度是相等的;
  2. 树的深度 = 树的高度 = 结点的最大深度 = 结点的最大高度 = 树的最大层次;
  3. 在树中,结点的度也就是结点的分支数,树的度则是结点的最大度数。从上图我们可以看到,每个结点都可以有不同的度,而一棵树的度则是确定的,它是由度数最多的结点决定的,上图中度数最多的结点为C结点,它的度数为4,因此整棵树的度为4。

对于不同的树而言,它们也有对应的术语:

有序树:树中结点的各子树从左到右是有次序不能互换
无序树:树中结点的各子树从左到右是无次序可以互换
森林:m(m>=0)棵互不相交的树的集合。

我们还是通过图片来对这些术语进行进一步的理解:

树的基本术语2
在这三个术语中我们需要注意以下几点:

  1. 子树指的是分支结点及其孩子与子孙结点组成的树
  2. 学科树中的子树,只是用来反映学科有哪些分支,并没有先后顺序,也就是我把数学子树与语文子树交换位置对这棵树来说也是不影响的,因此像这种子树在逻辑上无次序的树就是无序树;
  3. 排名树中的子树,是用来反映排名的先后顺序,如果我把子树1和子树2互换位置,此时该排名树的先后顺序就发生了变化,互换后的排名树与原来的排名树是不相同的两棵树,因此像这种子树在逻辑上以一定次序进行排列的树就是排列树;
  4. 有序树和无序树一定是逻辑上有无次序,因此,根据不同的逻辑,树的有序和无序也是可以转换的 。这就好比上图中的学科树,如果我想让它反映的是我今天学习科目的先后顺序,那此时它也就变成了有序树;像排名树,如果我想反映的是排名第一的人数个数,此时它就变成了无序树。因此判断一棵树是否有序,我们需要关注它的子树在逻辑上是否有先后顺序;
  5. 森林简单的理解就是多棵树,就比如这里的学科树和排名树这两棵树。如果我给它们加上一个父结点"1班",此时这两棵树就变成了一班树的两棵子树,也就是它们合并成了这棵1班树。同理,如果我将学科树的根结点"学科"去掉,那此时语文树、数学树、英语树这三棵子树就变成了森林;

以上这三个基本术语描述的是树的类型以及树与森林的关系,我们需要理解有序树和无序树具体指的是什么,以及树和森林如何相互转换。

在树中还有两个基本术语,如下所示:

路径:树中两结点之间的路径是由这两个结点之间所经过的结点序列构成的
路径长度:路径上所经过的边的个数

下面我们还是通过图来进一步加深对这些概念的印象,如下所示:
路径与路径长度

在路径和路径长度中我们需要注意的点有:

  1. 路径是单向的,必须是从上往下走。比如图中的结点B到结点K就存在路径,结点D到结点K也存在路径;而结点K到结点B不存在路径,结点D到结点B也不存在路径;
  2. 上层结点与下层结点可能存在路径,同层结点肯定没有路径。比如上图中的结点E位于结点K的上层,但是它们两个之间并没有路径;结点E与结点D位于同层,它们直接也没有路径;
  3. 路径长度指的是结点到结点中间的边的个数。比如结点B到结点D两个结点中间就1条边,因此对应的路径长度为1;结点B到结点K这两个结点中间有2条边,因此对应的路径长度为2;

现在我们就介绍完了树中的一些基本概念,在接下来的内中我们会不断的接触这些概念,因此这些内容不需要刻意的去记忆,大家通过这些图片对一些概念进行理解就行。

2.3 度为m的树与m叉树

在树中,度为m的树和m叉树这两个概念我们经常容易混淆,因此为了方便大家后续的学习,我们现在直接将它给攻克掉。

度为m的树:指的是一棵树中度数最多的结点它的度数为m的树,因此该树中至少有1个结点的度为m,所以它肯定是非空树;
m叉树:指的是一颗树的度最多为m,因此该树中可以没有度为m的结点,所以m叉树也可以是空树;

下面我们通过图像来进一步区分它们之间的区别:
m叉树与度为m的树
从集合的角度来理解它们二者的区别的话,我们可以认为度为m的树是m叉树的子集。以3叉树为例,在上图中可以很直观的看到,3叉树包含空树、度为0的树、度为1的树、度为2的树以及度为3的树;

从结点的角度来看的话,则可以认为度为m的树最少肯定有一个根结点和m个子结点;而m叉树只需要保证树的度不超过m即可,因此m叉树可以是一棵空树。

它们二者的异同点可以总结为下面这个表格:

度为m的树m叉树
任意结点的度<=m(最多m个孩子)任意结点的度<=m(最多m个孩子)
至少有一个结点度=m(有m个孩子)允许所有结点的度都<m
一定是非空树,至少有m+1个结点可以是空树

三、树的性质

对于一棵树而言,它具有以下最基本的性质:

  1. 树中的结点数等于所有结点的度数之和加1;

如果我要计算一棵树结点的总数,我只需要把根结点及其下方的所有结点加起来就可以了。为了方便理解,我们以下面这棵树为例:

性质1
在这个例子中,每一层结点的度数都会少1,而每一层的结点数都是上一层的结点数与度数的乘积,因此我们不难得到这棵树的 总结点数 n = 每一层的结点数之和 总结点数n=每一层的结点数之和 总结点数n=每一层的结点数之和,即:
n = 1 + 1 × m + 1 × m × ( m − 1 ) + … … + m ! × 1 + m ! × 1 × 0 n = 1+1×m+1×m×(m-1)+……+m!×1+m!×1×0 n=1+1×m+1×m×(m1)+……+m!×1+m!×1×0

从第二层开始的结点数实际上都是上一层度数的总和,这里如果我们将每个度数的总和记为 n i ( 0 < = i < = m ) n_i(0<=i<=m) ni(0<=i<=m),那我们不难得到所有度数的总和 S n S_n Sn为:
S n = n m + n m − 1 + … … + n 1 + n 0 S_n=n_m+n_{m-1}+……+n_1+n_0 Sn=nm+nm1+……+n1+n0

由上面两个式子联立可得 结点总数 n = 根结点 + 所有度数之和 S n 结点总数n=根结点+所有度数之和S_n 结点总数n=根结点+所有度数之和Sn,即:
n = 1 + S n n = 1+S_n n=1+Sn

除了上面的方式来理解这条性质,我们还可以通过度与结点的一一对应来进行理解。

在有n个结点的树中,从叶结点开始往上走,每一个结点都只与一个上层结点有直接联系,因此我们可以得到结论:

  • 每一个结点对应一条边,也就是一个度;

而根结点没有与之对应的上层结点,也就是根结点的上方没有变,因此我们可以得到结论:

  • n个结点只有n-1条边,也就是n-1个度

根据这两个结论我们不难得到总的结点数n与总度数 S n S_n Sn的关系为: n = S n + 1 n=S_n+1 n=Sn+1

  1. 度为m的树中第i层上至多有 m i − 1 m^{i-1} mi1个结点 ( i > = 1 ) (i>=1) i>=1

对于度为m的树,它至少是有m+1个结点,即根结点的度为m,而它的子节点的度为0;

在最多的情况下该树的每一层的每一个结点的度都为m,因为每一层的结点数都是上一层的结点数与度数的乘积,而这棵树中所有的结点的度数都为m因此从第二层开始,每一层的结点数都是上一层的结点数×m,如下所示:
性质2
在图中,我们可以很直观的感受到,第 i 层的结点数最多就是 m i − 1 m^{i-1} mi1

  1. 高度为h的m叉树至多有 ( m h − 1 ) / ( m − 1 ) (m^h-1)/(m-1) mh1/(m1)个结点;

高度为h的m叉树最少得结点数就是每一层都只有一个结点,即总共有h个结点;
在最多的情况下,m叉树的每一层的每一个结点的度都为m,此时的m叉树也是度为m的树,因此 总结点数 n = 每一层结点数之和 总结点数n=每一层结点数之和 总结点数n=每一层结点数之和,即:
n = 1 + m + m 2 + m 3 + … … + m h − 1 n=1+m+m^2+m^3+……+m^{h-1} n=1+m+m2+m3+……+mh1
这个就是一个公比为m的等比数列,我们可以通过等比数列的求和公式得到:
n = ( 1 − m h ) / ( 1 − m ) n=(1-m^h)/(1-m) n=(1mh)/(1m)

如果对等比数列的求和公式不太熟悉的朋友也可以采用错位相减法进行求和:

n = 1 + m + m 2 + … … + m h − 1 n=1+m+m^2+……+m^{h-1} n=1+m+m2+……+mh1

n × m = m + m 2 + m 3 + … … + m h n×m=m+m^2+m^3+……+m^h n×m=m+m2+m3+……+mh

n − n × m = 1 + m + m 2 + … … + m h − 1 − m − m 2 − … … − m h − 1 − m h n-n×m=1+m+m^2+……+m^{h-1}-m-m^2-……-m^{h-1}-m^h nn×m=1+m+m2+……+mh1mm2……mh1mh

n ⋅ ( 1 − m ) = 1 − m h n·(1-m)=1-m^h n(1m)=1mh

n = ( 1 − m h ) / ( 1 − m ) n=(1-m^h)/(1-m) n=(1mh)/(1m)

这两个性质的证明比较简单,不需要死记硬背,能够通过图像理解第二条性质的话就能够推出第三条性质。

  1. 高度为h的m叉树至少有h个结点,高度为h,度为m的树,至少有 m + h − 1 m+h-1 m+h1个结点;

这条性质的第一点这里我们就不需要再次证明了,我们来看一下性质的第二点,高度为h,度为m的树,在结点最少的情况下就是只有一个结点的度为m,其它结点的度都为1,如下所示:

性质3

在这棵树中,我们不难看出前 h − 1 h-1 h1 层的结点数就为 h − 1 h-1 h1 ,最后一层的结点数为 m m m ,因此总结点数为 m + h − 1 m+h-1 m+h1

  1. 具有n个结点的m叉树的最小高度为 l o g m ( n ⋅ ( m − 1 ) + 1 ) log_m(n·(m-1)+1) logm(n(m1)+1)向上取整。

在一棵m叉树中,如果要使树的高度最少,那就需要每一层的结点数都达到最大,即第i层的结点数为 m i − 1 m^{i-1} mi1,如果我们设最小高度为h则我们可以得到总结点数为 n = ( m h − 1 ) / ( m − 1 ) n=(m^h-1)/(m-1) n=(mh1)/(m1)

现在我们已经知道了总结点数为n,高度是未知的,因此我们可以将上式进行一个简单的变形:

m h − 1 = n ⋅ ( m − 1 ) m^h-1=n·(m-1) mh1=n(m1)

m h = n ⋅ ( m − 1 ) + 1 m^h=n·(m-1)+1 mh=n(m1)+1

h = l o g m ( n ⋅ ( m − 1 ) + 1 ) h=log_m(n·(m-1)+1) h=logm(n(m1)+1)

在这些性质中,每一条性质都是相辅相成的,因此对于树的性质这个知识点,我们需要的更多的是理解,直到这些性质是怎么得到的,之后在遇到习题时即使忘记了其中的某条性质,我们也能顺手将其推导出来。

结语

今天的内容到这里就全部结束了,在今天的内容中我们详细介绍了树的一些基本的概念,通过今天的学习,我们初步认识了树这种递归型的数据结构,同时也知道了它的一些基本术语和性质。如果大家喜欢博主的作品,可以点赞、收藏加评论支持一下博主,当然也可以转发给身边需要的朋友。在下一篇内容我们将开始学习二叉树的一些基本知识点,大家记得关注哦!!!最后感谢大家的支持,咱们下一篇再见!!!

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

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

相关文章

微服务:Rabbitmq的WorkQueue模型的使用、默认消费方式(消息队列中间件)

文章目录 WorkQueue模型控制预取消息个数 WorkQueue模型 当然&#xff0c;一个队列&#xff0c;可以由多个消费者去监听。 来实现一下. 生产者&#xff1a; Testpublic void testWorkQueue() throws InterruptedException {// 队列名称String queueName "simple.queue…

NoSQL实战(MongoDB搭建主从复制)

什么是复制集&#xff1f; MongoDB复制是将数据同步到多个服务器的过程&#xff1b; 复制集提供了数据的冗余备份并提高了数据的可用性&#xff0c;通常可以保证数据的安全性&#xff1b; 复制集还允许您从硬件故障和服务中断中恢复数据。 保障数据的安全性 数据高可用性 (2…

Leecode---技巧---只出现一次的数字 / 多数元素

题解&#xff1a; 利用异或运算 a⊕a 0 的性质&#xff0c;可用来消除所有出现了两次的元素&#xff0c;最后剩余的即为所得。 class Solution { public:int singleNumber(vector<int>& nums){// 初始化为0int ans 0;for(int x: nums){// 异或操作ans ^ x;}retur…

关于Openstack删除卷出错的有效解决方案

关于Openstack删除卷时显示卷出错的解决方案 今天删除卷的时候突然发现 删除卷出错 但是还好解决方式还算简单 下面将简洁的写下我的解决方案 当在 Web界面 删除卷时 可能会出现上面的错误 这是因为服务器&#xff0c;出现BUG&#xff0c;卷被附加给了NONE&#xff0c;并且无…

HarmonyOS NEXT星河版之自定义List下拉刷新与加载更多

文章目录 一、加载更多二、下拉刷新三、小结 一、加载更多 借助List的onReachEnd方法&#xff0c;实现加载更多功能&#xff0c;效果如下&#xff1a; Component export struct HPList {// 数据源Prop dataSource: object[] []// 加载更多是否ingState isLoadingMore: bool…

ant X6高亮

先附上效果图 // 节点内属性的点击事件&#xff1a;node:port:click graph.on(‘node:port:click’, ({ node, port }) > { resetAllHighlights(); highlightPort(node, port, true); highlightEdgesForPort(port, new Set()); }); // 以下为源码 <template><div…

Python GNN图神经网络代码实战;GAT代码模版,简单套用,易于修改和提升,图注意力机制代码实战

1.GAT简介 GAT&#xff08;Graph Attention Network&#xff09;模型是一种用于图数据的深度学习模型&#xff0c;由Veličković等人在2018年提出。它通过自适应地在图中计算节点之间的注意力来学习节点之间的关系&#xff0c;并在节点表示中捕捉全局和局部信息。 GAT模型的核…

AI文章互评:得分最高的竟然不是GPT-4!

大家好&#xff0c;我是木易&#xff0c;一个持续关注AI领域的互联网技术产品经理&#xff0c;国内Top2本科&#xff0c;美国Top10 CS研究生&#xff0c;MBA。我坚信AI是普通人变强的“外挂”&#xff0c;所以创建了“AI信息Gap”这个公众号&#xff0c;专注于分享AI全维度知识…

实力!云起无垠晋级“第九届安全创客汇”年度10强

2024年5月28日&#xff0c;第九届“安全创客汇”复赛在重庆圆满落幕。在本次国内最具影响力的网络安全创业大赛中&#xff0c;云起无垠凭借其技术的创新性和巨大市场价值&#xff0c;成功跻身年度十强。 随着人工智能技术的不断发展&#xff0c;特别是在大模型技术的推动下&…

【图像处理与机器视觉】XJTU期末考点

题型 选择&#xff1a;1 分10 填空&#xff1a;1 分15 简答题&#xff08;也含有计算和画图&#xff09;&#xff1a;10 分*4 计算题&#xff1a;15 分20 分 考点 选择题&#xff08;部分&#xff09; 数字图像处理基础 p(x,y),q(s,t)两个像素之间的距离由公式&#xff1a…

湖南(品牌调研)源点咨询 企业品牌调研侧重点分析

本文由湖南长沙&#xff08;市场调研&#xff09;源点咨询编辑发布 企业建立品牌&#xff0c;往往都需进行科学性的品牌调研。因为只有这样&#xff0c;才能让企业更好的把握市场的发展趋势&#xff0c;进而为品牌的建立和发展提供更有价值的数据参考&#xff01;那么品牌的调…

AI精选付费资料包【37GB】

课程介绍 一、人工智能论文合集 二、AI必读经典书籍 三、超详细人工智能学习大纲 四、机器学习基础算法教程 五、深度学习神经网络基础教程 六、计算机视觉实战项目 课程获取 资料&#xff1a;AI精选付费资料包&#xff08;37.4GB&#xff09;获取&#xff1a;扫码关注公z号…

esp8266阿里云上线(小程序控制)

此wechatproject已上传在页面最上方 由图可见&#xff0c;项目只有两个页面&#xff0c;一个是获取该产品下的设备信息列表&#xff0c;一个是某设备对应的详情控制页面&#xff0c;由于这个项目只利用esp8266板子上自带的led&#xff0c;功能简单&#xff0c;只需要控制开关即…

Update! 基于RockyLinux9.3离线安装Zabbix6.0

链接&#xff1a; Ansible离线部署 之 Zabbixhttp://mp.weixin.qq.com/s?__bizMzk0NTQ3OTk3MQ&mid2247487434&idx1&sn3128800a0219c5ebc5a3f89d2c8ccf50&chksmc3158786f4620e90afe440bb32fe68541191cebbabc2d2ef196f7300e84cde1e1b57383c521a&scene21#we…

YOLOv9改进策略 | Conv篇 | 利用YOLOv10提出的SCDown魔改YOLOv9进行下采样(附代码 + 结构图 + 添加教程)

一、本文介绍 本文给大家带来的改进机制是利用YOLOv10提出的SCDown魔改YOLOv9进行下采样,其是更高效的下采样。具体而言,其首先利用点卷积调整通道维度,然后利用深度卷积进行空间下采样。这将计算成本减少到和参数数量减少到。同时,这最大限度地保留了下采样过程中的信息,…

创新指南|提高人才回报率的重要举措和指标

员工是组织最大的投资&#xff0c;也是最深层的价值源泉。人才系统必须同时强调生产力和价值创造。让合适的人才担任合适的职位&#xff0c;并为员工提供成功所需的支持和机会&#xff0c;这是实现回报的关键。本文将介绍组织可以采取的五项行动&#xff0c;以最大化企业的人才…

postgresql常用命令#postgresql认证

PostgreSQL 是一个功能强大的开源关系数据库管理系统&#xff0c;提供了一系列命令行工具来管理和操作数据库。以下是一些常用的 PostgreSQL 命令&#xff0c;涵盖数据库和用户管理、数据操作以及查询和维护等方面。 #PostgreSQL培训 #postgresql认证 #postgreSQL考试 #PG考试…

汽车识别项目

窗口设计 这里的代码放在py文件最前面或者最后面都无所谓 # 创建主窗口 window tk.Tk() window.title("图像目标检测系统") window.geometry(1000x650) # 设置窗口大小# 创建背景画布并使用grid布局管理器 canvas_background tk.Canvas(window, width1000, height…

【Hive SQL 每日一题】统计各个商品今年销售额与去年销售额的增长率及排名变化

文章目录 测试数据需求说明需求实现分步解析 测试数据 -- 创建商品表 DROP TABLE IF EXISTS products; CREATE TABLE products (product_id INT,product_name STRING );INSERT INTO products VALUES (1, Product A), (2, Product B), (3, Product C), (4, Product D), (5, Pro…

英码科技推出鸿蒙边缘计算盒子:提升国产化水平,增强AI应用效能,保障数据安全

当前&#xff0c;随着国产化替代趋势的加强&#xff0c;鸿蒙系统Harmony OS也日趋成熟和完善&#xff0c;各行各业都在积极拥抱鸿蒙&#xff1b;那么&#xff0c;边缘计算要加快实现全面国产化&#xff0c;基于鸿蒙系统开发AI应用势在必行。 关于鸿蒙系统及其优势 鸿蒙系统是华…