当前位置: 首页 > news >正文

二叉树介绍

一.树的概念

树的图:

1.结点的度:一个结点含有子树的个数称为该结点的度; 如上图:A的度为6

2.树的度:一棵树中,所有结点度的最大值称为树的度; 如上图:树的度为6

3.叶子结点或终端结点:度为0的结点称为叶结点; 如上图:B、C、H、I...等节点为叶结点

4.双亲结点或父结点:若一个结点含有子结点,则这个结点称为其子结点的父结点; 如上图:A是B的父结点

5.孩子结点或子结点:一个结点含有的子树的根结点称为该结点的子结点; 如上图:B是A的孩子结点

6.根结点:一棵树中,没有双亲结点的结点;如上图:A

7.结点的层次:从根开始定义起,根为第1层,根的子结点为第2层,以此类推

8.树的高度或深度:树中结点的最大层次; 如上图:树的高度为4。

二.二叉树

一棵二叉树是结点的一个有限集合,该集合:

1. 或者为空

2. 或者是由一个根节点加上两棵别称为左子树和右子树的二叉树组成。

3. 二叉树不存在度大于2的结点

4. 二叉树的子树有左右之分,次序不能颠倒,因此二叉树是有序树

二叉树的几种情况:

满二叉树:: 一棵二叉树,如果每层的结点数都达到最大值,则这棵二叉树就是满二叉树。也就是说,如果一棵二叉树的层数为K,且结点总数是 ,则它就是满二叉树。

完全二叉树:完全二叉树是效率很高的数据结构,完全二叉树是由满二叉树而引出来的。对于深度为K的,有n个结点的二叉树,当且仅当其每一个结点都与深度为K的满二叉树中编号从0至n-1的结点一一对应时称之为完比特就业课全二叉树。 要注意的是满二叉树是一种特殊的完全二叉树。(完全二叉树可以简单的说为从上到下从左到右依次放就是完全二叉树)

二叉树的性质:

1. 若规定根结点的层数为1,则一棵非空二叉树的第i层上最多有 (i>0)个结点

2. 若规定只有根结点的二叉树的深度为1,则深度为K的二叉树的最大结点数是 (k>=0)

3. 对任何一棵二叉树, 如果其叶结点个数为 n0, 度为2的非叶结点个数为 n2,则有n0=n2+1(推导的公式):

4. 具有n个结点的完全二叉树的深度k为 上取整

5. 对于具有n个结点的完全二叉树,如果按照从上至下从左至右的顺序对所有节点从0开始编号,则对于序号为i的结点有:

若i>0,双亲序号:(i-1)/2;i=0,i为根结点编号,无双亲结点

若2i+1<n,左孩子序号:2i+1,否则无左孩子

若2i+2<n,右孩子序号:2i+2,否则无右孩子

6.在完全二叉树中,如果节点总个数为奇数,则没有度为1的节点,如果节点总个数为偶数,只有一个度为1的节点。

三.练习题

1.选B(度为0的节点个数比度为2的节点个数多一个。)

2.选A(第三张图是当节点个数为奇数的时候计算的,和偶数一样的计算方式,只不过没有单独的一个度为0的节点。)

3.选B(这道题就是上图奇数个节点的情况)

4.选B(用性质算)

四.二叉树的存储和遍历

1.顺序存储(在堆的时候将)

2.类似于链表的链式存储

3.二叉树的遍历

(1)前序遍历(根 左 右)

这里先从A这个根开始遍历,之后再到A的左树马,之后就是将B看为一个根,也要遵循根左右的规则,那么此时遍历B的左树D,D又成为了根,此时遍历D的左树,D的左树为空,那么回到D这个根,遍历D的右树,D的右树为空,此时D这个根遍历完返回到B这个根,遍历B的右树,B的右树也为空,此时返回到B树,再返回到根A,此时再遍历A的右树C,同理C此时当作根,遍历C的左树E,E此时为根,遍历E的左树,左树为空,返回到根E,遍历E的右树,E的右树为空,返回根E,E遍历完返回到根C,遍历C的右树,C的右树为F,F此时也当作根,来遍历F的左树,F的左树为空,返回到根F,遍历F的右树,F的右树为空,返回根F,F遍历完F,返回到根C,C遍历完,返回到根A,A的右树也遍历完了则前序遍历完成。顺序为ABDCEF

(2)中序遍历(左 根 右)

中序遍历的法则是 左 根 右 ,从根A开始先进入二叉树,此时是中序遍历,要左边走完才打印根A,所以此时没有打印根A,进入A的左树B,B也是根继续走B的左树D,D也是根继续走D的左树,D的左树为空,则返回到D,此时左走完了走到了根,则打印D,再走D的右树,右树为空,此时返回根D,D遍历完返回B,B的左树走完,此时打印B,走入B的右树,B的右树为空,B遍历完返回到根A,打印A,因为此时A的左树遍历完了,进入A的右树C,此时C也为根,先走C的左树E,E为根,先走E的左树,E的左树为空,返回到E,打印E,再走E的右树,E遍历完返回到根C,打印C,进入C的右树F,F的左树为空,返回到F打印F,再走到F的右树,右树为空,遍历完F返回到C,C遍历完,返回到A,遍历完二叉树。顺序DBAECF

(3).后序遍历(左 右 根)

后序遍历,规则 左 右 根,此时先进入二叉树,根A开始,进入A的左树B,B为根进入B的左树D,此时D的左树为空回到D,此时没有任何节点被打印,当继续遍历D的右树为空返回到D的时候打印D,此时返回到B,B的右树为空,遍历完B此时打印B,返回到A,遍历A的右树,C为根进入C的左树E,E的左树为空进入右树也为空,遍历完E,此时打印E,回到C,进入C的右树F,F的情况和E相同不赘述,打印了F回到了C,C遍历完左右树,打印C,回到A,A此时遍历完左右树,打印A。顺序:DBEFCA

(4)层序遍历(从上到下,从左到右,依次遍历)
4.代码

(1)树节点的结构:

(2).这里先用很low的方式创建一个树:

(3)树的前序遍历:(自己画图的大致流程,后面的流程都是一样的)

(4)树的中序遍历:

(5)树的后序遍历:

(6)非递归的层序遍历:(非递归的层序遍历需要有一个临时变量cur记录当前节点,并且把此时这个节点的不为空的左右子树传入队列中进行入队操作,然后再通过临时变量来进行出队,就可以实行层序遍历)画图解释:

(7)非递归的前序遍历:(通过栈来进行压栈数据,先遍历每个节点的左子树,当最后一个节点的左子树为空的时候再通过top通过栈内元素pop接收这个在栈顶的元素,让cur来遍历这个节点的右子树,依次循环往复。)

(8)中序遍历的非递归实现:(中序遍历和前序遍历的代码都是一样的,就是打印的位置不同,中序遍历是左根右,那么在遍历右子树之前打印这个节点就可以啦)

(9)后序遍历的非递归实现:(刚开始的思路和上面两种遍历的方式是一样的,但是在pop栈里面的元素的时候就不一样了,这里需要把这个节点的右子树走完才能进行打印,所以就需要对这个节点的右子树进行判断。再进行判断的时候不是直接把这个节点直接pop出来而是需要用peek去看一下这个节点的右节点是否为null不为null就需要继续遍历这个右节点。这里需要注意的是,当遍历到E的时候,这里E的左子树是null的,所以cur就是null,这里的top直接peek 栈中的节点,也就是E节点,如果E节点的右子树为null的话,那么直接就打印E节点并且pop但是E节点的右子树有一个H,那么cur就会拿到这个节点,然后再进行判断,H的左右子树都为null那么就直接打印H并且弹出H,此时栈中的栈顶元素是E,那么此时top拿到E再进行判断E的右子树是否为null,不为空,那么cur又拿到了H这个节点,所以这里就循环了,这里也就是和上面两个循环不同的地方,这里就需要哪一个prev来记录下来这个右子树的节点,当回到E这个结点的时候,通过prev上次拿到的是H的节点如果等于top就是E节点的右子树的话,那么E的右子树走完回来了,直接打印E并且pop出E的这个节点,这里就是不同的地方。)

五.二叉树练习题

1.选A,这就是她的层序遍历,并且她是完全二叉树。

2.选A 这道题画图的话就是下一张图中的树。先序遍历的第一个为根,中序遍历中间E就为根,就可以进行画图了。

3.选D

4.选A

5.无法根据前序和后序来画出树的图,因为前后序确定的是树的根。

六.二叉树的节点个数计算

1.一个树的节点个数等于根节点加上这个根的左树和右树的节点个数:总结就是这个根的左树+右树+1就是这个树的节点个数,也就是说,每个节点都可以看成一个根,然后求每个根的节点个数再通过递归传回数值的大小就可以计算出树的节点个数。

2.通过前序遍历来计算节点个数:(把打印数据变成size++就行了,原理都是一样的)

3.求叶子节点个数:1.子问题思路:整棵树的叶子节点等于左子树的叶子节点+右子树的叶子节点个树 2.遍历思路:以某种方式遍历树,为叶子就++(叶子是没有左子树和右子树的节点为叶子)

第一种方法实现:

第二种方法实现:

3.第K层节点的个数:(计算的方法就是通过递归的思想算第k-1层左树的节点和右树的节点,当为第一层的时候直接返回1,然后递推结束,开始回归)

4.算树的高度:(树的高度是通过递归来实现的,需要注意的是这里不能直接return递归的语句也就是图三框住的return语句,如果直接这样使用会导致递归的重复调用,使用的时间就会更长会超出时间限制,因为当你递归出HeightTree(root.left) 为5的时候并且HeightTree(root.right)为4的时候,HeightTree(root.left)>HeightTree(root.right),你要HeightTree(root.left)+1此时你还需要你计算一次HeightTree(root.left)的大小,重复计算花费的时间更多。)(时间复杂度为O(N))

5.找指定数据:(找到数据的时候一定要将数据保留下来而不是继续循环看图二错误写法就是没有在递归的时候把正确的数据return回来而只return回来null,图三分别为正确的流程(黑红线)和错误流程(只有红线))(时间复杂度是O(N),因为需要遍历每个节点)

七.二叉树OJ题

1.两个树是否相同:(思路:判断两个数是否相同需要从两个方面来判断,首先就是判断两个数的结构是否相同,第一种情况就是这两个树的一个根节点一个为空,一个不为空,那么肯定是不相同的,第二种情况就是两个根节点都是空的话那么这个根节点就是相同的,然后还需要继续判断后面的节点是否相同。第三种情况就是根节点都存在的情况下,根的值不同,那么也是直接返回false。递归思路就在画图)(时间复杂度为O(p和q之间节点个数的最小值))

2.这个树是否为另一棵树的子树:(思路:如果这两棵树相同,那么两棵树构成子树关系,然后通过递归root的左子树和子树进行对比,再通过root的右子树和子树进行对比,如果上述三个条件都不满足就是不为子树关系,或者root为空的时候也就是root这棵树遍历完了都不满足则这两棵树不为子树关系,递归详细画图)(时间复杂度:root的节点为m subroot的节点个数为n 那么空间复杂度为O(m*n) 因为每次在root节点上都要遍历一次subroot的节点)

3.翻转二叉树:(思路就是通过前序遍历交换每个节点的左右子树)(比较简单不画图)

4.判断一个二叉树是否为平衡二叉树(平衡二叉树表示该树的所有节点的左右子树深度差小于等于1)

方法一:时间复杂度为O(N^2)(时间为O(N^2)是因为在计算每个节点的深度的时候就遍历了全部节点,当判断树是否平衡的时候也要遍历这个树的每个节点,那么就重复了,所以才是O(N^2),这个方法是通过计算每个节点的左右子树的节点个数然后做差算出差值的绝对值小于等于1就为平衡二叉树。(HeighTree是上面计算指定根的深度。)画图解释。需要注意的是图三这幅图是不为平衡二叉树的,当9作为根节点的时候,左子树的深度是2,右子树为0,左右子树的差值大于1了就不是平衡二叉树。

方法二:时间复杂度为O(N)不重复计算。(思路就是当左子树深度减去右子树的深度的绝对值大于1那么就直接返回-1,如果满足平衡二叉树的条件的话也就是说左右子树的深度差值小于等于1,那么就直接返回左子树和右子树之间最大的深度+1)

5.对称二叉树:(思路:对称二叉树需要的是左子树和右子树对称,那么也和树是否相同的思路一样,先从结构考虑,如果一个为空,一个不为空,肯定不对称,两个都为空,就对称,最后再从值的方面考虑如果两个都不为空,但是值不一样就是不对称的。最后还需要判断每一个树的左树的左节点是否等于右树的右节点,画图解释)

6.二叉树的创建和遍历:(这道题是在牛客上面写的,需要注意的点有几个,首先就是我们需要注意的是一开始牛客上的界面是图三这种,我们这里是输入的字符串需要用到字符串的输入,并且我们会使用到空格就需要使用nextLine而不是next来输入字符串,因为next输入的字符串不能有空格。之后就是这道题需要通过前序遍历创建一个二叉树,并且通过中序遍历输出,那么中序遍历和树节点的创建就不说了,这道题的思路还是比较简单,这里还需要注意的是就是当我们在判断字符串中的第i个字符不是字符的时候,里面进行的语句就是创建一个节点并且设置左右节点,这里需要注意的是我们创建了一个结点之后就需要进行i++,因为当此时如果在左子树递归或者右子树递归语句的后面才施行i++那么就会导致思路错误了。整体来说思路就是判断第i个字符是不是空格,不是空格进行创建一个节点,并且让i++再进行左子树和右子树的递归,如果是空格就直接i++。)图四是画图解释:

这里i是静态变量带来的危害:如果在main方法中创建两个TreeNode对象每次i就无法从0开始,因为第一次遍历完之后i就在第一个字符串的末尾了。

7.非递归的层序遍历(顺序表来写):(总体思路和非递归层序遍历差不多,唯一的差别就是需要用二维数组来实现这个二叉树,需要注意的是,每层的创建应该在计算size大小的时候进行重新开辟,而不是直接在外面创建一个数组然后一直add。图二就是错误示范)

全是同一个数据的原因是:当我们实现完这个层序遍历之后list的地址都是一样的,那么list1 进行add三次都是同一个list,那么就是这三个元素的add都是同一个地址,那么就是相同的数据。

8.找到两个节点的最近公共祖先:(下面四种就是公共祖先的情况)

方法一:通过直接递归来写:(第一种情况如果p和q之间有一个为root,那么直接返回root就可以了,第二种情况p和q分别在根的左右子树,那么就需要通过递归来进行找到p和q的,然后再通过语句来判断是哪种情况,如果都在p和q就是刚刚说的在左右子树那么就返回根节点root,如果都是在左子树或者右子树就返回最先找到的那个节点就可以了。)(图解第二张)

方法二:用栈来写:(这种情况用堆好解释,简单的说类比链表的分支)(思路:将p和q的路径记录下来,再通过像链表的相交的想法来进行两个栈的对比,如果第一个元素相同那么后面的元素都是相同的,直接返回第一个出栈的节点。如果第一个栈顶元素不同,就一起出栈栈顶元素,不断比较,比较到结束完都没有那么就直接返回null说明没有公共祖宗节点。其中getPath的方法不好写,因为我们需要递归的从根的左右子树来找到这个节点,还需要注意的是,当这个节点的左右子树都找不到p或者q的时候我们就需要把这个节点从栈里面弹出,这是需要注意的地方。还有就是需要注意每次左子树遍历和右子树遍历都需要写一个判断条件不能一直往下走。)

9.前序遍历和中序遍历创建树:(大致的思路就是先通过前序遍历和中序遍历来确定根节点,确定根节点之后就可以通过中序遍历中的根节点来确定左右子树,根的左边就是左子树,右边的数据就是右子树,然后再通过定义一个inBegin和inEnd来进行每个节点的遍历。因为inBegin和inEnd是每个节点需找自己左右子树的范围,所以这样就可以确定每个节点的左右子树。这里从E开始进行遍历,在中序遍历中我们可以知道,E的左边数据为左子树,右边数据为右子树,那么此时我们需要先找左子树的数据,因为先序遍历是根左右,所以此时开始找E的左子树,那么此时E左子树的inBegin和inEnd的范围就是0到在中序遍遍历E的下标的左边一个下标,此时就是inEnd的范围,所以此时我们就需要写一个语句来找到每个节点的位置,这样才能在找左子树的时候确定他的inEnd的大小。此时找左子树的过程是一个递归的过程,当inBegin大于inEnd的时候就是没有节点了,此时就就代表递归结束了。还需要注意的是,在最开始我们需要定义一个成员变量才能让先序遍历中的下标不被函数栈帧销毁,因为我们再找节点的时候是通过先序遍历的顺序来找的每个节点。右子树也是如此。这里还需要注意的是,我们传入根节点的inEnd的时候必须是中序遍历数组长度-1.不能直接传入中序遍历数组的大小,因为在找数据的时候我们是通过inBegin和inEnd来循环找数据的,如果你直接传入中序遍历数组的大小的话,那么我们循环语句就是直接写的是 i < inEnd 当inBegin和inEnd相等的时候就找不到这个数据了,但是这个数据就是inBegin和inEnd相等的时候的位置,所以就会导致我们找不到这个节点的位置也就导致无法找到这个节点子树的inEnd的大小了,因为inEnd是等于这个节点下标减一。右子树则是将inBegin 等于 这个节点下表+1,inEnd不变)

10.后序遍历和中序遍历:(这里和前序遍历的差不太多,唯一的差别就是先递归根的右子树再左子树,并且此时遍历这个后续遍历的数组的时候是通过最后一个位置的元素来进行 -- 来进行的,因为根节点在最后一个位置,通过 -- 来找到数据,而且后序遍历是通过左 右 根来进行的,那么反起来找数据那么就是根 右 左,所以和前序遍历是反的,其他的思路都是一样滴)

11.二叉树创建字符串:(这里是通过StringBuilder来进行字符串的添加通过实例1,我们可以知道根节点是没有括号的,那么直接就可以append(root.val)然后再进行左子树的判断,第一种情况就是左子树不为空,通过实例1,我们知道先他是先进行增加一个左括号,然后通过左子树的递归来进行增加节点,递归完之后在增加右括号,如果左子树为空,那么还需要判断右子树是否为空,如果右子树也为空此时直接返回,如果右子树不为空的话我们看示例二,示例二中2的左子树为空,右子树不为空,那么这里直接增加了一个括号的,那么此时也是直接增加一个括号,此时左子树的情况说完,来说右子树的情况,如果右子树不为空的话,也是和左子树一样先一个左括号然后再递归,递归完之后在增加上右括号。如果右子树为空的话就直接return就好了)

相关文章:

二叉树介绍

一.树的概念 树的图&#xff1a; 1.结点的度&#xff1a;一个结点含有子树的个数称为该结点的度&#xff1b; 如上图&#xff1a;A的度为6 2.树的度&#xff1a;一棵树中&#xff0c;所有结点度的最大值称为树的度&#xff1b; 如上图&#xff1a;树的度为6 3.叶子结点或终…...

通过Ngrok实现内网穿透助力远程开发

在现代软件开发和网络应用的环境下&#xff0c;开发人员常常需要在本地搭建服务器进行调试、测试或演示。然而&#xff0c;传统的端口映射&#xff08;如使用 NAT 或 SSH 隧道&#xff09;配置繁琐&#xff0c;且并非所有环境都允许直接暴露本地服务。ngrok 作为一款强大的隧道…...

DeepSeek-R1:通过强化学习激励大型语言模型(LLMs)的推理能力

摘要 我们推出了第一代推理模型&#xff1a;DeepSeek-R1-Zero和DeepSeek-R1。DeepSeek-R1-Zero是一个未经监督微调&#xff08;SFT&#xff09;作为初步步骤&#xff0c;而是通过大规模强化学习&#xff08;RL&#xff09;训练的模型&#xff0c;展现出卓越的推理能力。通过强…...

Node.js基础

浏览器知识 浏览器 个浏览器都内置了DOM、BOM等API函数&#xff0c;供浏览器中的Javascript调用。 每个浏览器都有对应的JavaScript解析引擎。 浏览器中的JavaScript环境 V8引擎负责解析和执行JavaScript代码 内置API是由运行环境提供的特殊接口&#xff0c;只能在所属的运…...

DeepSeek R1:中国AI黑马的崛起与挑战

在人工智能&#xff08;AI&#xff09;领域&#xff0c;大型语言模型&#xff08;LLMs&#xff09;正以迅猛之势重塑世界&#xff0c;其发展速度和影响力令人瞩目。近期&#xff0c;中国DeepSeek公司发布的DeepSeek R1模型&#xff0c;宛如一颗璀璨新星&#xff0c;凭借卓越的推…...

【JavaEE】_MVC架构与三层架构

目录 1. MVC架构 2. 三层架构 3. MVC架构与三层架构的对比 3.1 MVC与三层架构的对比 3.2 MVC与三层架构的共性 1. MVC架构 在前文已介绍关于SpringMAC的设计模式&#xff0c;详见下文&#xff1a; 【JavaEE】_Spring Web MVC简介-CSDN博客文章浏览阅读967次&#xff0c;点…...

对比DeepSeek、ChatGPT和Kimi的学术写作摘要能力

摘要 摘要是文章的精华&#xff0c;通常在200-250词左右。要包括研究的目的、方法、结果和结论。让AI工具作为某领域内资深的研究专家&#xff0c;编写摘要需要言简意赅&#xff0c;直接概括论文的核心&#xff0c;为读者提供快速了解的窗口。 下面我们使用DeepSeek、ChatGPT…...

ts 进阶

吴悠讲编程 : 20分钟TypeScript进阶&#xff01;无废话快速提升水平 前端速看 https://www.bilibili.com/video/BV1q64y1j7aH...

Kubernetes(一)

Kubernetes&#xff08;简称K8s&#xff09;是一个开源的容器编排平台&#xff0c;已经成为现代云原生应用的核心技术&#xff0c;主要应用于对容器化应用程序的自动化部署、扩展以及管理。k8s配备了一组核心组件以及一系列功能&#xff0c;这些组件能够实现容器的调度、负载均…...

Python里的小整数问题挺有意思的

简单来说&#xff0c;Python为了优化性能&#xff0c;会把一些常用的整数&#xff08;通常是-5到256&#xff09;提前创建好&#xff0c;放到一个“缓存池”里。这样&#xff0c;当你用到这些小整数时&#xff0c;Python就不用每次都重新创建对象了&#xff0c;直接从缓存池里拿…...

基于 Jenkins 的测试报告获取与处理并写入 Jira Wiki 的技术总结

title: 基于 Jenkins 的测试报告获取与处理并写入 Jira Wiki 的技术总结 tags: - jenkins - python categories: - jenkins在软件开发的持续集成与持续交付&#xff08;CI/CD&#xff09;流程里&#xff0c;及时、准确地获取并分析测试报告对保障软件质量至关重要。本文将详细…...

java.util.Random类(详细案例拆解)(已完结)

前言&#xff1a; 小编打算近期更俩三期类的专栏&#xff0c;一些常用的专集类&#xff0c;给大家分好类别总结和详细的代码举例解释。 今天是除夕&#xff0c;小编先祝贺大家除夕快乐啦&#xff01;&#xff01; 今天是第六个 java.lang.Math 包中的 java.util.Random类 我…...

CMake常用命令指南(CMakeList.txt)

CMakeList从入门到精通的文章有很多不再赘述&#xff08; 此处附带一篇优秀的博文链接&#xff1a;一个简单例子&#xff0c;完全入门CMake语法与CMakeList编写 &#xff09;。 本文主要列举 CMake 中常用命令的详细说明、优缺点分析以及推荐做法&#xff0c;以更好地理解和灵…...

Mybatis是如何进行分页的?

大家好&#xff0c;我是锋哥。今天分享关于【Mybatis是如何进行分页的&#xff1f;】面试题。希望对大家有帮助&#xff1b; Mybatis是如何进行分页的&#xff1f; 1000道 互联网大厂Java工程师 精选面试题-Java资源分享网 MyBatis 实现分页的方式有很多种&#xff0c;最常见…...

推动知识共享的在线知识库实施与优化指南

内容概要 在当今迅速发展的数字化时代&#xff0c;在线知识库的实施显得尤为重要。它不仅为企业提供了高效的信息存储与共享平台&#xff0c;还能够有效促进团队成员之间的协作与知识传递。通过集中管理企业内的各类知识资源&#xff0c;在线知识库帮助员工快速查找所需信息&a…...

【最后203篇系列】007 使用APS搭建本地定时任务

说明 最大的好处是方便。 其实所有任务的源头&#xff0c;应该都是通过定时的方式&#xff0c;在每个时隙发起轮询。当然在任务的后续传递中&#xff0c;可以通过CallBack或者WebHook的方式&#xff0c;以事件的形态进行。这样可以避免长任务执行的过程中进行等待和轮询。 总结…...

为AI聊天工具添加一个知识系统 之78 详细设计之19 正则表达式 之6

本文要点 要点 本项目设计的正则表达式 是一个 动态正则匹配框架。它是一个谓词系统&#xff1a;谓词 是运动&#xff0c;主语是“维度”&#xff0c;表语是 语言处理。主语的一个 双动结构。 Reg三大功能 语法验证、语义检查和 语用检验&#xff0c;三者 &#xff1a;语义约…...

三天急速通关JavaWeb基础知识:Day 1 后端基础知识

三天急速通关JavaWeb基础知识&#xff1a;Day 1 后端基础知识 0 文章说明1 Http1.1 介绍1.2 通信过程1.3 报文 Message1.3.1 请求报文 Request Message1.3.2 响应报文 Response Message 2 XML2.1 介绍2.2 利用Java解析XML 3 Tomcat3.1 介绍3.2 Tomcat的安装与配置3.3 Tomcat的项…...

代理模式 -- 学习笔记

代理模式学习笔记 什么是代理&#xff1f; 代理是一种设计模式&#xff0c;用户可以通过代理操作&#xff0c;而真正去进行处理的是我们的目标对象&#xff0c;代理可以在方法增强&#xff08;如&#xff1a;记录日志&#xff0c;添加事务&#xff0c;监控等&#xff09; 拿一…...

前端-Rollup

Rollup 是一个用于 JavaScript 的模块打包工具&#xff0c;它将小的代码片段编译成更大、更复杂的代码&#xff0c;例如库或应用程序。它使用 JavaScript 的 ES6 版本中包含的新标准化代码模块格式&#xff0c;而不是以前的 CommonJS 和 AMD 等特殊解决方案。ES 模块允许你自由…...

EtherCAT主站IGH-- 21 -- IGH之fsm_reboot.h/c文件解析

EtherCAT主站IGH-- 21 -- IGH之fsm_reboot.h/c文件解析 0 预览一 该文件功能`fsm_reboot.c` 文件功能函数预览二 函数功能介绍`fsm_reboot.c` 中主要函数的作用1. `ec_fsm_reboot_init`2. `ec_fsm_reboot_clear`3. `ec_fsm_reboot_single`4. `ec_fsm_reboot_all`5. `ec_fsm_reb…...

【NLP251】NLP RNN 系列网络

NLP251 系列主要记录从NLP基础网络结构到知识图谱的学习 &#xff11;.原理及网络结构 &#xff11;.&#xff11;&#xff32;&#xff2e;&#xff2e; 在Yoshua Bengio论文中( http://proceedings.mlr.press/v28/pascanu13.pdf )证明了梯度求导的一部分环节是一个指数模型…...

数据分析系列--④RapidMiner进行关联分析(案例)

一、核心概念 1.1项集&#xff08;Itemset&#xff09; 1.2规则&#xff08;Rule&#xff09; 1.3支持度&#xff08;Support&#xff09; 1.3.1 支持度的定义 1.3.2 支持度的意义 1.3.3 支持度的应用 1.3.4 支持度的示例 1.3.5 支持度的调整 1.3.6 支持度与其他指标的…...

深度学习:基于MindNLP的RAG应用开发

什么是RAG&#xff1f; RAG&#xff08;Retrieval-Augmented Generation&#xff0c;检索增强生成&#xff09; 是一种结合检索&#xff08;Retrieval&#xff09;和生成&#xff08;Generation&#xff09;的技术&#xff0c;旨在提升大语言模型&#xff08;LLM&#xff09;生…...

Hive安装教程

Hive安装教程 文章目录 Hive安装教程写在前面安装下载安装部署安装Hive启动并使用Hive MySQL安装检查当前系统是否安装过MySQL安装初始化数据库 Hive元数据配置到MySQL拷贝驱动配置Metastore到MySQL再次启动Hive 写在前面 Linux版本&#xff1a;CentOS7.5Hive版本&#xff1a;…...

安卓逆向之脱壳-认识一下动态加载 双亲委派(二)

一&#xff1a;动态加载与双亲委派模型 在 Java 和 Android 中&#xff0c;ClassLoader 是一个非常重要的组件&#xff0c;负责将 .class 文件或 .dex 文件的字节码加载到内存中&#xff0c;供程序使用。在这其中&#xff0c;有两种关键的概念需要深入理解&#xff1a;动态加载…...

全程Kali linux---CTFshow misc入门(14-24)

第十四题&#xff1a; dd命令&#xff1a;dd是一个用于复制和转换数据的命令&#xff0c;它可以对文件、设备等进行操作&#xff0c;在数据备份、转换格式等场景经常使用。 ifmisc14.jpg&#xff1a;if表示 “input file”&#xff08;输入文件&#xff09;&#xff0c;这里指…...

学习数据结构(3)顺序表

1.动态顺序表的实现 &#xff08;1&#xff09;初始化 &#xff08;2&#xff09;扩容 &#xff08;3&#xff09;头部插入 &#xff08;4&#xff09;尾部插入 &#xff08;5&#xff09;头部删除 &#xff08;这里注意要保证有效数据个数不为0&#xff09; &#xff08;6&a…...

知识体系、知识管理角度的赚钱思考

从知识管理和知识体系的角度出发&#xff0c;赚钱的问题思考清单可以帮助你系统地梳理和优化自己在财富创造方面的策略。 以下是一个详细的清单&#xff0c;涵盖从知识获取、技能提升到实际应用的各个环节&#xff0c;帮助你在赚钱的道路上更加高效和有条理。 一、赚钱的目标与…...

(done) ABI 相关知识补充:内核线程切换、用户线程切换、用户内核切换需要保存哪些寄存器?

由于操作系统和编译器约定了 ABI&#xff0c;如下&#xff1a; 编译器在对 C 语言编译时&#xff0c;会自动 caller 标注的寄存器进行保存恢复。保存的步骤通常发生在进入函数的时候&#xff0c;恢复的步骤通常发生在从函数返回的时候。 内核线程切换需要保存的寄存器&#…...

QT6 + CMAKE编译OPENCV3.9

参考文档 [1] https://blog.csdn.net/rjkf_css/article/details/135676077 前提条件 配置好相关运行环境&#xff1a;QT6、OPENCV3.9的sources文件 OPENCV下载网页&#xff1a;https://opencv.org/releases/ QT6下载教程&#xff1a;https://blog.csdn.net/caoshangpa/article…...

Linux 常用命令——系统设置篇(保姆级说明)

系统设置类 显示当前运行的进程&#xff08;ps&#xff09; ps [options] [--help]# 查找指定进程格式&#xff1a; ps -ef | grep 进程关键字# 显示进程信息 ps -A 参数&#xff1a; -A 列出所有的进程 -w 显示加宽可以显示较多的资讯 -au 显示较详细的资讯 -aux 显示所有包…...

完美世界前端面试题及参考答案

如何设置事件捕获和事件冒泡? 在 JavaScript 中,可以通过addEventListener方法来设置事件捕获和事件冒泡。该方法接收三个参数,第一个参数是事件类型,如click、mousedown等;第二个参数是事件处理函数;第三个参数是一个布尔值,用于指定是否使用事件捕获机制。当这个布尔值…...

Vue3笔记——(三)hooks、路由

015 hooks 作用&#xff1a;使得代码更加模块化和可维护 Person.vue <template><div><h2>当前求和{{ sum }}</h2><button click"addFn">点我sum1</button></div> </template> <script setup lang"ts"…...

网络安全大模型和人工智能场景及应用理解

本文通过通俗易懂的方式的进行阐述&#xff0c;大家读完觉得有帮助记得及时关注和点赞&#xff01;&#xff01;&#xff01; 一、网络安全大模型的概述 网络安全大模型是一种用于识别和应对各种网络安全威胁的模型。它通过分析网络数据包、网络行为等信息&#xff0c;识别潜在…...

python-leetcode-从中序与后序遍历序列构造二叉树

106. 从中序与后序遍历序列构造二叉树 - 力扣&#xff08;LeetCode&#xff09; # Definition for a binary tree node. # class TreeNode: # def __init__(self, val0, leftNone, rightNone): # self.val val # self.left left # self.right r…...

NLP模型大对比:Transformer > RNN > n-gram

结论 Transformer 大于 RNN 大于 传统的n-gram n-gram VS Transformer 我们可以用一个 图书馆查询 的类比来解释它们的差异&#xff1a; 一、核心差异对比 维度n-gram 模型Transformer工作方式固定窗口的"近视观察员"全局关联的"侦探"依赖距离只能看前…...

MySQL查询优化(三):深度解读 MySQL客户端和服务端协议

如果需要从 MySQL 服务端获得很高的性能&#xff0c;最佳的方式就是花时间研究 MySQL 优化和执行查询的机制。一旦理解了这些&#xff0c;大部分的查询优化是有据可循的&#xff0c;从而使得整个查询优化的过程更有逻辑性。下图展示了 MySQL 执行查询的过程&#xff1a; 客户端…...

[STM32 - 野火] - - - 固件库学习笔记 - - -十三.高级定时器

一、高级定时器简介 高级定时器的简介在前面一章已经介绍过&#xff0c;可以点击下面链接了解&#xff0c;在这里进行一些补充。 [STM32 - 野火] - - - 固件库学习笔记 - - -十二.基本定时器 1.1 功能简介 1、高级定时器可以向上/向下/两边计数&#xff0c;还独有一个重复计…...

Antd React Form使用Radio嵌套多个Select和Input的处理

使用Antd React Form使用Radio会遇到嵌套多个Select和Input的处理&#xff0c;需要多层嵌套和处理默认事件和冒泡&#xff0c;具体实现过程直接上代码。 实现效果布局如下图 代码 <Formname"basic"form{form}labelWrap{...formItemLayoutSpan(5, 19)}onFinish{on…...

固有频率与模态分析

目录 引言 1. 固有频率&#xff1a;物体的“天生节奏” 1.1 定义 1.2 关键特点 1.3 实际意义 2. 有限元中的模态分析&#xff1a;给结构“体检振动” 2.1 模态分析的意义 2.2 实际案例 2.2.1 桥梁模态分析 2.2.2 飞机机翼模态分析 2.2.3 具体事例 3. 模态分析的工具…...

视频多模态模型——视频版ViT

大家好&#xff0c;这里是好评笔记&#xff0c;公主号&#xff1a;Goodnote&#xff0c;专栏文章私信限时Free。本文详细解读多模态论文《ViViT: A Video Vision Transformer》&#xff0c;2021由google 提出用于视频处理的视觉 Transformer 模型&#xff0c;在视频多模态领域有…...

2859.计算K置位下标对应元素的和

示例 1&#xff1a;输入&#xff1a;nums [5,10,1,5,2], k 1 输出&#xff1a;13 解释&#xff1a;下标的二进制表示是&#xff1a; 0 0002 1 0012 2 0102 3 0112 4 1002 下标 1、2 和 4 在其二进制表示中都存在 k 1 个置位。 因此&#xff0c;答案为 nums[1] nums[…...

Redis 教程

REmote DIctionary Server(Redis) 是一个由Salvatore Sanfilippo写的key-value存储系统。 Redis是一个开源的使用ANSI C语言编写、遵守BSD协议、支持网络、可基于内存亦可持久化的日志型、Key-Value数据库&#xff0c;并提供多种语言的API。 它通常被称为数据结构服务器&…...

2024 CVPR Highlight Learning-Feedback

图像增强 Towards Robust Event-guided Low-Light Image Enhancement: A Large-Scale Real-World Event-Image Dataset and Novel Approach 解决的主要问题是低光照条件下的图像增强 通过多尺度整体融合分支提取事件和图像的结构和纹理信息&#xff0c;并引入信噪比&#xff0…...

maven、npm、pip、yum官方镜像修改文档

文章目录 Maven阿里云网易华为腾讯云 Npm淘宝腾讯云 pip清华源阿里中科大华科 Yum 由于各博客繁杂&#xff0c;本文旨在记录各常见镜像官网&#xff0c;及其配置文档。常用镜像及配置可评论后加入 Maven 阿里云 官方文档 setting.xml <mirror><id>aliyunmaven&l…...

UE求职Demo开发日志#15 思路与任务梳理、找需要的资源

1 思路梳理 因为有点无从下手&#xff0c;就梳理下最终形态. 基地的建设我是想单独一个场景&#xff0c;同一个关卡中小怪会每次来都会刷&#xff0c;小解密一次性的&#xff0c;关键的Boss和精英怪不会重复刷&#xff0c;同时场景里放一些资源可收集&#xff0c;基地建设锁定区…...

设置jmeter外观颜色

设置jmeter外观颜色 方法&#xff1a; 步骤一、点击顶部选项 ->外观&#xff0c;这里提供了不同的主题&#xff0c;可选自己喜欢的风格。 步骤二、选择后&#xff0c;弹框提示点击Yes。...

《一文读懂!Q-learning状态-动作值函数的直观理解》

在人工智能的强化学习领域&#xff0c;Q-learning算法是一颗耀眼的明星&#xff0c;被广泛应用于机器人控制、游戏AI开发、自动驾驶等诸多前沿领域。而想要真正掌握Q-learning算法&#xff0c;理解其核心概念——状态 - 动作值函数&#xff0c;是绕不开的关键一步。这篇文章就带…...

Angular 2 表单深度解析

Angular 2 表单深度解析 引言 Angular 2作为现代前端开发的框架之一,以其灵活性和强大的功能赢得了众多开发者的青睐。在Angular 2中,表单处理是其中一个重要且复杂的部分。本文将深入解析Angular 2的表单,从基础知识到高级应用,旨在帮助开发者更好地理解和运用Angular 2…...