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

6.7.图的深度优先遍历(英文缩写DFS)

  • 树是特殊的图,没有回路的图就是树

  • BFS与DFS的区别在于,BFS使用了队列,DFS使用了栈


一.深度优先遍历:

1.树的深度优先遍历:

树的深度优先遍历分为先根遍历和后根遍历。

以树的先根遍历为例:

  • 上述图片里树的先根遍历序列为1、2、5、6、3、4、7、8

  • 树的先根遍历中新找到的相邻结点一定是没有被访问过的

2.图的深度优先遍历:

  • visited数组用来记录图中的顶点是否被访问过,MAX_VERTEX_NUM是图中顶点的最大个数,DFS函数的形参Graph G和int v分别表示图和图的顶点编号,visit函数用于访问顶点,visit(v)表示访问第v号顶点,visited[v]=true表示第v号顶点被访问过

  • DFS函数中的for循环,其中FirstNeighbor(G,v)用来找第v号顶点在G中的第一个邻接点,若存在该邻接点,返回该第一个邻接点的编号,赋值给w,如果w非负,执行for循环,首先判断是否执行if语句,若符合条件!visited[w]为true即第w号顶点没有被访问过,那么就执行if语句,调用DFS函数,该层for循环结束,再执行NextNeighbor(G,v,w)函数,第w号顶点是第v号顶点的第一个邻接点,找除了第w号顶点外第v号顶点的的下一个邻接点,找到了返回该邻接点的顶点号,赋值给w,判断是否非负,若非负,继续执行for循环,如不是非负即小于0,跳出for循环

  • 图的深度优先遍历类似树的先根遍历,都是先访问完一个结点,然后再用一个循环依次检查和这个结点相邻的其他结点,然后进行更深一层的访问,只不过对于图的深度优先遍历,增加了一个数组用来标记顶点是否被访问过

  • 对于图而言,通过某一个顶点找到的与之相邻的其他顶点有可能是已经被访问过的,所以可以设置一个数组,用来标记每一个顶点是否被访问过

3.模拟图的深度优先遍历的执行过程:

如下图,以上述图片的图为例,假设从2号顶点出发深度优先遍历该图,所以第一次调用DFS函数的时候,传入的v的值为2,然后调用visit函数访问2号顶点,修改2号顶点对应的visited的值为true,表示2号顶点已经被访问过,for循环用来检查和2号顶点相邻的其他顶点,和2号顶点相邻的顶点是1、6号顶点,其中和2号顶点相邻的第一个顶点是1号顶点,此时1号顶点没有被访问过:

如下图,因此第二次调用DFS函数时传入的参数为1,然后调用visit函数访问1号顶点,修改1号顶点对应的visited的值为true,表示1号顶点已经被访问过,for循环用来检查和1号顶点相邻的其他顶点,和1号顶点相邻的顶点是2、5号顶点,其中和1号顶点相邻的第一个顶点是2号顶点,由于2号顶点对应的visited的值为true即已经被访问过,因此2号顶点会被跳过,通过for循环找到下一个和1号顶点相邻接的顶点是5号顶点:

如下图,因此第三次调用DFS函数时传入的参数为5,然后调用visit函数访问5号顶点,修改5号顶点对应的visited的值为true,表示5号顶点已经被访问过,for循环用来检查和5号顶点相邻的其他顶点,和5号顶点相邻的顶点是1号顶点,由于1号顶点对应的visited的值为true即已经被访问过,因此1号顶点会被跳过,此时和5号顶点相邻的所有顶点全部访问完毕,意味着5号顶点对应的for循环什么都不会做:

如下图,所以5号顶点对应的DFS函数执行完毕,之后就会返回上一层的递归调用,即1号顶点这一层:

如下图,由于之前处理的5号顶点已经是1号顶点的最后一个邻接点,所以1号顶点的for循环执行完毕,因此1号顶点对应的DFS函数执行结束,最终返回上一层的递归调用,即2号顶点这一层:

如下图,此时2号顶点的第一个邻接点即1号顶点已经被处理完,通过NextNeighor(G,v,w)函数找到除了1号顶点之外后一个和2号顶点相邻接的顶点即6号顶点,6号顶点此时还没有被访问过:

如下图,因此接下来调用DFS函数时传入的参数为6,然后调用visit函数访问6号顶点,修改6号顶点对应的visited的值为true,表示6号顶点已经被访问过,for循环用来检查和6号顶点相邻的其他顶点,和6号顶点相邻的顶点是2、3、7号顶点,由visited数组可知2号顶点已经被访问过,因此会跳过2号顶点,开始访问3号顶点:

如下图,因此接下来调用DFS函数时传入的参数为3,然后调用visit函数访问3号顶点,修改3号顶点对应的visited的值为true,表示3号顶点已经被访问过,for循环用来检查和3号顶点相邻的其他顶点,和3号顶点相邻的顶点是4、6、7号顶点,第一个被访问的顶点是4号顶点,由visited数组可知4号顶点还没有被访问过:

如下图,因此接下来调用DFS函数时传入的参数为4,然后调用visit函数访问4号顶点,修改4号顶点对应的visited的值为true,表示4号顶点已经被访问过,for循环用来检查和4号顶点相邻的其他顶点,和4号顶点相邻的顶点是3、7、8号顶点,第一个被访问的顶点是3号顶点,由visited数组可知3号顶点已经被访问过,因此会跳过3号顶点,开始访问7号顶点:

如下图,因此接下来调用DFS函数时传入的参数为7,然后调用visit函数访问7号顶点,修改7号顶点对应的visited的值为true,表示7号顶点已经被访问过,for循环用来检查和7号顶点相邻的其他顶点,和7号顶点相邻的顶点是3、4、6、8号顶点,由visited数组可知,和7号顶点相邻接的顶点中,只有8号顶点还没有被访问过,因此开始访问8号顶点:

如下图,因此接下来调用DFS函数时传入的参数为8,然后调用visit函数访问8号顶点,修改8号顶点对应的visited的值为true,表示8号顶点已经被访问过,for循环用来检查和8号顶点相邻的其他顶点,和8号顶点相邻的顶点是4、7号顶点,由visited数组可知,4、7号顶点都已经被访问过,所以8号顶点的DFS函数执行完毕:

如下图,返回上一层即7号顶点这一层,此时和7号顶点相邻的所有顶点都已经全部被访问完毕,所以继续返回上一层:

如下图,返回到4号顶点这一层,此时和4号顶点相邻的所有顶点都已经全部被访问完毕,所以继续返回上一层:

如下图,其他的类似,最终函数调用栈清空,上述图片的图遍历完毕:

如上图,最终得出从2号顶点出发,进行上述图的深度优先遍历,得到的深度遍历序列为2,1,5,6,3,4,7,8。

4.图的深度优先遍历算法存在的问题与优化:

上述图片的代码存在一个问题,就是如果遍历的图是非连通图,则无法遍历完所有顶点,如下图所示:

例如从2号顶点出发进行深度优先遍历上述图片里的图,调用DFS函数,可以遍历完1、2、3、4、5、6、7、8号顶点,但9、10、11号顶点无法遍历到,解决方案如下:

  • DFSTraverse函数的形参Graph G表示图;vexnum表示图中顶点的个数,G.vexnum表示图中顶点的个数,v是顶点编号

  • DFSTraverse函数的第一个for循环用来把visited数组全部赋值为false,表示图中所有顶点都没有被访问过

  • DFSTraverse函数的第二个for循环用来检查是否有顶点还没有被访问过,如果有,visited[v]的值为false,!visited[v]的值为true,就会执行if语句再次调用DFS函数把未访完的顶点访问完毕

  • 注:DFSTraverse函数的第二个for循环必须从第一个顶点出发开始遍历,如果从中间的顶点出发开始遍历,就会使得前面的顶点无法遍历到->如上图,必须从1号顶点出发,由于是非连通图,只能把1、2、3、4、5、6、7、8号顶点访问完,此时发现第9号顶点对应visited的值为false,意味着9号顶点还没有被访问,因此从9号顶点出发,再次调用DFS函数访问剩下的顶点,通过9号顶点就可以把9、10、11号顶点全部访问完,最终上述图片的图深度优先遍历完毕


二.图的深度优先遍历算法的空间复杂度:

如上图,图的深度优先遍历算法的空间复杂度主要取决于DFS函数的递归调用。

1.最坏的情况:

如上图,比如从1号顶点出发开始深度优先遍历图,那么DFS函数递归调用栈的深度就会与图中的顶点个数相等(因为1号顶点与2、3、4、5、6、7、8号顶点都邻接,意味着函数递归调用栈会把图中8个顶点即所有顶点都入栈),假设图中有V个顶点,因此最坏的情况为O( |V| )->之所以这个是最坏情况,是因为递归深度达到了最大值。

2.最好的情况:

如上图,比如从1号顶点出发开始深度优先遍历图,显然在这种情况下DFS函数递归调用栈最多只会有两层(一层是当前访问的顶点,一层是与该顶点相邻接的顶点,不存在第二个与该顶点相邻接的顶点),也就是说只需要常数级即O(1)的空间复杂度。(注:访问顶点时函数递归调用栈最少会有一层,这一层是当前访问的顶点,该顶点不存在邻接点,顶点全部访问完毕时或者不访问顶点时函数递归调用栈为0层)

3.注意:做题时,题目问图的深度优先遍历算法的空间复杂度,没有特别说明的情况下,要答O( |V| )即最坏的情况。


三.图的深度优先遍历算法的时间复杂度:

核心:无论是BFS还是DFS,计算时间复杂度都可以简化为计算访问各个顶点所需要的时间加探索各条边/弧所需要的时间

1.如果图采用邻接矩阵存储:

假设图中有V个顶点,访问|V|个顶点就需要O( |V| )的时间,因为需要遍历,

探索和某一个顶点相邻的边只需要遍历该顶点对应的一整行(或一整列,因为此时是无向图,无向图的邻接矩阵是对称的)的数据即可,所以查找每个顶点的邻接点即邻接的边需要O( |V| )的时间,

由于总共有|V|个顶点,所以整体来看时间复杂度就是O( |V| * |V| )。

2.如果图采用邻接表存储:

假设图中有V个顶点,访问|V|个顶点就需要O( |V| )的时间,因为需要遍历,

假设图中有E条边,查找某个顶点的邻接点即邻接的边共需要O( |E| )的时间,因为查找某个顶点的邻接点即邻接的边只需要遍历该顶点对应的链表即可,链表可能包含所有的边,所以共需要O( |E| )的时间,

由于需要先查找所要操作的顶点,再找邻接的边,所以时间复杂度为O( |V|+|E| )。


四.深度优先遍历序列:从哪一个顶点开始遍历(入栈),遍历结束时就是哪个顶点最后一个出栈(先进后出)

假设图使用了邻接矩阵或者邻接表存储,

如上图,邻接表中各个链表中顶点号都是从左向右递增的,因此,对于某一个顶点,要找到与该顶点相邻的其他顶点,在该邻接表中找到的顺序与左边的邻接矩阵找到的顺序是一致的,因为邻接矩阵的顶点号也是从左向右递增的。

1.从2号顶点出发进行深度优先遍历整个图:

在邻接矩阵和邻接表这两种情况下,如果从2号顶点出发进行深度优先遍历整个图,得到的遍历序列都是2,1,5,6,3,4,7,8(因为此时邻接矩阵和邻接表存储顶点的编号都是递增的)。

2.从3号顶点出发进行深度优先遍历整个图:(详细遍历过程)

如下图,假设图使用邻接表存储:

如上图,第一个访问3号顶点,和3号顶点相邻的第一个顶点是4号顶点(这个直接看3号顶点对应的链表即可知道3号顶点与哪些顶点邻接,其他同理),因此

如上图,第二个访问4号顶点,根据DFS的规则,此时要从4号顶点出发找其他和4号顶点相邻且没有被访问的顶点,与4号顶点相邻的第一个顶点即3号顶点已经被访问过了,因此跳过3号顶点,与4号顶点相邻的第二个顶点即7号顶点没有被访问过,因此

如上图,第三个访问7号顶点,与7号顶点相邻的第一个顶点即3号顶点已经被访问过了,因此跳过3号顶点,与7号顶点相邻的第二个顶点即4号顶点也已经被访问过了,因此跳过4号顶点,与7号顶点相邻的第三个顶点即6号顶点没有被访问过,因此

如上图,第四个访问6号顶点,与6号顶点相邻的第一个顶点即2号顶点没有被访问过,因此

如上图,第五个访问2号顶点,与2号顶点相邻的第一个顶点即1号顶点没有被访问过,因此

如上图,第六个访问1号顶点,与1号顶点相邻的第一个顶点即2号顶点已经被访问过了,因此跳过2号顶点,与1号顶点相邻的第二个顶点即5号顶点没有被访问过,因此

如上图,第七个访问5号顶点,与5号顶点相邻的第一个顶点即1号顶点已经被访问过了,因此跳过1号顶点->此时5号顶点对应的这一层DFS结束,退回到上一层即1号顶点对应的这一层DFS:

如上图,此时与1号顶点相邻的2、5号顶点全部被访问过,因此1号顶点对应的这一层DFS结束,退回到上一层即2号顶点对应的这一层DFS:

如上图,2号顶点对应的这一层DFS还有6号顶点没有检查过,但6号顶点已经访问过了,所以退回到上一层即6号顶点对应的这一层DFS:

如上图,和6号顶点相邻的顶点中还剩3、7号顶点没有检查,但3、7号顶点已经被访问过了,因此退回到上一层即7号顶点对应的这一层DFS:

如上图,和7号顶点相邻的顶点中还剩下8号顶点没有被访问过:

如下图,所以第八个访问8号顶点,

如上图,与8号顶点相邻的顶点中4、7号顶点全部被访问过,所以退回到上一层即7号顶点对应的这一层DFS,

此时7号顶点对应的这一层DFS结束,退回到上一层即4号顶点对应的这一层DFS,

和4号顶点相邻的顶点中还剩8号顶点没有检查,但8号顶点已经被访问过了,因此退回到上一层即3号顶点对应的这一层DFS,

此时还剩下6、7号顶点没有检查,但6、7号顶点已经被访问了,因此退出3号顶点对应的这一层DFS,

最终该图的深度优先遍历结束,得到的遍历序列为3、4、7、6、2、1、5、8:

3.从1号顶点出发进行深度优先遍历整个图:

4.细节:当图使用邻接表存储的话,由于邻接表的表现方式不唯一即顶点对应的链表中顶点号顺序不固定,因此如果从某一个顶点出发深度优先遍历得到的图的序列也可能不一样

对于图而言,它的邻接矩阵存储的表示方式是唯一的,但邻接表的表示方式不唯一,

所以如果图使用邻接表存储的话,从某一顶点出发深度优先遍历图,最终得到的遍历序列也可能不同,这个与BFS一样。

如上图,图使用上述图片呈现的邻接表存储,从2号顶点出发,得到的深度优先遍历序列为2、1、5、6、3、4、7、8,

如下图,此时把邻接表的内容稍作修改即把顶点对应的链表中的顶点号换一下顺序:

从2号顶点出发开始深度优先遍历图,

第一个访问2号顶点,与2号顶点相邻的第一个顶点即6号顶点没有被访问过(这个直接看顶点对应的链表即可)

第二个访问6号顶点,与6号顶点相邻的第一个顶点即2号顶点已经被访问过,因此跳过2号顶点,与6号顶点相邻的第二个顶点即7号顶点还没有被访问过,

第三个访问7号顶点,与7号顶点相邻的第一个顶点即6号顶点已经被访问过,因此跳过6号顶点,与7号顶点相邻的第二个顶点即8号顶点还没有被访问过,

第四个访问8号顶点,与8号顶点相邻的第一个顶点即4号顶点还没有被访问过,

第五个访问4号顶点,与4号顶点相邻的第一个顶点即3号顶点还没有被访问过,

第六个访问3号顶点,与3号顶点相邻的顶点有6、7、4号顶点,这些顶点都被访问过,

因此3号顶点对应的DFS递归调用结束,

返回到4号顶点对应的DFS,与4号顶点相邻的只剩下8、7号顶点没有检查过,但8、7号顶点都被访问过,

所以继续返回到8号顶点对应的DFS,与8号顶点相邻的7号顶点也已经被访问过,

所以继续返回到7号顶点对应的DFS,与7号顶点相邻的3、4号顶点也已经被访问过,

所以继续返回到6号顶点对应的DFS,与6号顶点相邻的3号顶点也已经被访问过,

所以继续返回到2号顶点对应的DFS,与2号顶点相邻的还剩一个1号顶点,1号顶点还没有被访问过,

第七个访问1号顶点,与1号顶点相邻的第一个顶点即2号顶点已经被访问过,因此跳过2号顶点,与1号顶点相邻的第二个顶点即5号顶点还没有被访问过,

第八个访问5号顶点,与5号顶点相邻的第一个顶点即1号顶点已经被访问过,此时5号顶点访问结束,

返回到1号顶点对应的DFS,与1号顶点相邻的所有顶点全部访问完毕,

所以继续返回到2号顶点对应的DFS,此时与2号顶点相邻的顶点全部访问完毕,

最终该图的深度优先遍历结束,得到的遍历序列为2、6、7、8、4、3、1、5:

5.总结:关于图采用邻接表存储


五.深度优先生成树:

下图的两个例子都是从2号顶点开始深度优先遍历图,左边的例子基于之前第一个邻接表,右边的例子基于之前第二个邻接表,由于邻接表的不同,即使从同一个顶点开始深度优先遍历,得到的遍历序列也可能不同,:

深度优先遍历的过程中也是在探索各条边所连接的顶点的过程,

如果通过某一条边找到某个顶点且该顶点还没有被访问过,此时就把这条边标红,通过某一条边找到某个顶点且该顶点被访问过则边标黑,

如果只保留红色的边,把黑色的边去掉,最终的图就变成了一个没有环的树,

如果采用邻接表存储的图,即便从同一个顶点出发进行深度优先遍历,也有可能得到不一样的深度优先遍历序列,因此也会对应不一样的深度优先生成树:


六.深度优先生成森林:

如上图,如果图是非连通的,也就是说要调用多次DFS函数才能把图深度优先遍历完,每调用一次DFS函数,就会生成一棵深度优先生成树,由于上述图片的无向图有两个连通分量,所以需要调用两次DFS函数,因此也会对应的生成两棵深度优先生成树:

上述图片的两棵深度优先生成树就组成了深度优先生成森林。


七.图的遍历与图的连通性:

1.无向图:

对于无向图而言,进行BFS或者DFS时,遍历图中调用BFS函数或者DFS函数的次数等于连通分量数。

如上图,把上述图片的图进行BFS或者DFS时,由于该图有3个连通分量数,因此需要调用3次BFS或者DFS才能遍历完图。

如果无向图是连通图即只有1个连通分量,所以只需要调用1次BFS或者DFS函数即可遍历完图。

2.有向图:

比如从7号顶点出发进行BFS或者DFS,只需要调用一次BFS函数或者DFS函数即可遍历完图,其中一条遍历序列为7、8、4、3、6、2、1、5;

比如从2号顶点出发进行BFS或者DFS,此时只能找到1、5号顶点(因为方向),所以无法调用一次BFS函数或者DFS函数就遍历完图。

特殊情况:有向图是强连通图(也就是从任何一个顶点开始都能找到到达其他所有顶点的路径)


八.总结:


相关文章:

6.7.图的深度优先遍历(英文缩写DFS)

树是特殊的图,没有回路的图就是树 BFS与DFS的区别在于,BFS使用了队列,DFS使用了栈 一.深度优先遍历: 1.树的深度优先遍历: 树的深度优先遍历分为先根遍历和后根遍历。 以树的先根遍历为例: 上述图片里…...

若依同步企业微信架构及ACTIVITI

企业微信配置 1.进入企业微信后台管理应用管理,新建应用 2.配置网页授权及JS-SDK 将验证文件下载到项目的pubilc下 启动项目 npm run dev 然后验证域名归属 3.配置企业可信IP 公网IP地址即可,仅此IP的服务可调用企业微信接口信息 4.构造域名回调域&a…...

PyTorch分布式训练调试方法(跟踪调用过程)

PyTorch分布式训练调试方法(跟踪调用过程) 背景 在分布式深度学习训练场景中,通信操作(如AllReduce、Send/Recv)和CUDA操作的时序问题往往难以调试。本工具通过以下方式提供调试支持: 拦截所有PyTorch张量操作并记录调用栈监控分布式通信操作的完整生命周期自动生成带时间…...

跟我学C++中级篇——内存异常的分析

一、内存问题引发的现象 在实际使用电脑过程中,经常会遇到电脑卡住了,鼠标和键盘也没反应。这时候儿会怎么办?其实此时打开任务管理器,就可以发现,有几种情况:一是CPU占用过高;二是IO占用过高&…...

HTML新标签与核心 API 实战

HTML5 新标签与核心 API 实战 引言 今天咱们来看看HTML5 新标签以及一些核心 API。 HTML5 的引入彻底改变了 Web 前端开发格局&#xff0c;尤其是其新增的多媒体和交互能力标签。对于前端开发者而言&#xff0c;理解并掌握 <video>、<audio>、<canvas> 和…...

vscode 红色波浪线问题

VSCode 红色波浪线问题终极解决方案 问题描述 在编写 C 项目时&#xff0c;CMake 编译通过但代码出现红色波浪线&#xff0c;常见问题&#xff1a; #include 提示找不到头文件枚举或类型名未定义成员函数或变量无法识别 这些是 VSCode 的 IntelliSense 配置问题&#xff0c…...

类型补充,scan 和数据库管理命令

Redis 数据类型 stream stream 就是一个队列&#xff08;阻塞队列&#xff09; Redis 作为一个消息队列的重要支撑&#xff0c;属于是 list 中 blpop 和 brpop 的升级版本 geospatial 主要用于存储地理位置信息&#xff0c;并对存储的信息进行操作 存储一些点后&#xff0c…...

AI Agent系列(十) -Data Agent(数据分析智能体)开源资源汇总

AI Agent系列【十】 前言一、 Open Interpreter1.1 Open Interpreter的特点1.2 Open Interpreter的优势1.3 Open Interpreter的应用场景 二、DB-GPT2.1 核心能力2.2关键特性:2.3 系统架构 三、DeepBI3.1 特点 前言 DataAgent的能力本质上比较依赖大模型的自然语言转API/SQL/代…...

Vue3 + TypeScript中provide和inject的用法示例

基础写法&#xff08;类型安全&#xff09; typescript // parent.component.vue import { provide, ref } from vue import type { InjectionKey } from vue// 1. 定义类型化的 InjectionKey const COUNTER_KEY Symbol() as InjectionKey<number> const USER_KEY Sy…...

【国家能源集团生态协作平台-注册/登录安全分析报告】

前言 由于网站注册入口容易被黑客攻击&#xff0c;存在如下安全问题&#xff1a; 暴力破解密码&#xff0c;造成用户信息泄露短信盗刷的安全问题&#xff0c;影响业务及导致用户投诉带来经济损失&#xff0c;尤其是后付费客户&#xff0c;风险巨大&#xff0c;造成亏损无底洞…...

不确定与非单调推理的基本概念

前文我们讨论了建立在经典逻辑基础上的确定性推理,这是一种运用确定性知识进行的精确推理。同时,它又是一种单调性推理,即随着新知识的加人,推出的结论或证明了的命题将单调地增加。但是,人们通常是在信息不完善、不精确的情况下运用不确定性知识进行思维、求解问题的,推…...

系统架构设计师:计算机组成与体系结构(如CPU、存储系统、I/O系统)高效记忆要点、知识体系、考点详解、、练习题并提供答案与解析

计算机组成与体系结构高效记忆要点 从CPU、存储系统、I/O系统三大模块展开&#xff0c;结合高频考点与记忆技巧&#xff0c;有助于系统化掌握核心知识点。 一、CPU结构与工作原理 1. CPU的组成 核心组件&#xff1a; 运算器&#xff08;ALU&#xff09; &#xff1a;负责算术…...

FreeSWITCH中SIP网关(Gateway)操作

freeswitch是一款简单好用的VOIP开源软交换平台。 以下是一篇关于FreeSWITCH中SIP网关&#xff08;Gateway&#xff09;操作的技术指南&#xff0c;基于提供的官方文档内容整理&#xff1a; 一、网关生命周期管理 1. 创建新SIP Profile并启动 FreeSWITCH支持多SIP Profile&…...

构建自动翻译工作流:技术与实践

一、引言 制药行业客户迫切需要一种翻译解决方案&#xff0c;以解决公司内部多样化的翻译难题。他们需要的不仅是提升翻译效率和准确性的工具&#xff0c;更希望能够保持文档的原始格式。我们观察到客户的需求广泛&#xff0c;包括多语言办公文件、研究文档和药品报批文件等&a…...

在pycharm中搭建yolo11分类检测系统--PyQt5学习(二)

第二部分 测试本地pycharm通过程序连接远程服务器autodl 模型的推理需要借助远程服务器autodl&#xff0c;但是界面的运行是在pycharm中&#xff0c;我的设想是按钮调用一个py文件就好了。 1. 本地运行PyQt5界面。 2. 当需要载入权重时&#xff0c;通过SSH连接到AutodL服务…...

汽车行驶工况特征参数:从“速度曲线”到“驾驶DNA”的硬核解码

作为新能源汽车行业的从业者&#xff0c;你是否曾困惑于这些问题&#xff1a; 为什么同一款电动车&#xff0c;不同用户的实际续航差异高达30%&#xff1f;如何精准量化驾驶行为对电池寿命的影响&#xff1f;车企标定的“NEDC续航”与真实路况差距的根源是什么&#xff1f; 这…...

dify本地部署,docker-plugin_daemon-1启动不了,一直报错

解决办法&#xff0c;修改这两个配置&#xff0c;然后重启 进入源代码目录&#xff0c;docker文件夹下 docker compose down docker compose up -d https://github.com/langgenius/dify/issues/17677...

2025 年第十五届 MathorCup 数学应用挑战赛 A 题:汽车风阻预测

A 题&#xff1a;汽车风阻预测 在空气动力学领域&#xff0c;空气阻力对汽车以及航空航天工业中载具的 性能和效率有着至关重要的影响。以往的研究表明&#xff0c;预测这种阻力需 要借助先进的工业仿真软件进行大规模流体力学模拟仿真&#xff0c;而该模拟 过程不仅算法复杂…...

AI Agents系列之AI代理架构体系

1. 引言 智能体架构是定义智能体组件如何组织和交互的蓝图,使智能体能够感知其环境、推理并采取行动。本质上,它就像是智能体的数字大脑——集成了“眼睛”(传感器)、“大脑”(决策逻辑)和“手”(执行器),用于处理信息并采取行动。 选择正确的架构对于构建有效的智能…...

使用Java动态数据生成PDF报告:简化您的报告导出流程

在当今的数据驱动世界中&#xff0c;能够快速且有效地将数据转化为可视化的报告是一项宝贵的技能。无论是商业分析、项目管理还是学术研究&#xff0c;PDF报告都是分享和存档信息的理想格式。在这篇博客中&#xff0c;我们将探讨如何使用Java编程语言结合iText库来动态生成包含…...

Sqlite3交叉编译全过程

Sqlite3交叉编译全过程 一、概述二、下载三、解压四、配置五、编译六、安装七、验证文件类型八、移植8.1、头文件sqlite3.h8.2、动态链接库移植8.3、静态态链接库移植 九、验证使用9.1. 关键函数说明 十、触发器使用十一、sqlite表清空且恢复id值十二、全文总结 一、概述 SQLi…...

Qt QThread 两种线程管理方法

在 Qt 中,QThread 有两种常见的用法,分别对应不同的线程管理模型。这两种方法各有优缺点,适用于不同的场景: 1. 子类化 QThread(继承 QThread,重写 run() 方法) 这是传统的线程用法,类似于 Java 或 C++ 标准库中的线程模型。通过继承 QThread 并重写 run() 方法,将需…...

React 中如何获取 DOM:用 useRef 操作非受控组件

&#x1f4cc; 场景说明 在写 React 的时候&#xff0c;通常我们是通过“受控组件”来管理表单元素&#xff0c;比如用 useState 控制 <input> 的值。 但有些时候&#xff0c;控制的需求只是临时性的&#xff0c;或者完全不需要重新渲染组件&#xff0c;这时候直接访问…...

GoogleCodeUtil.java

Google动态验证码实现 GoogleCodeUtil.java package zwf;import java.io.UnsupportedEncodingException; import java.net.URLEncoder; import java.nio.charset.StandardCharsets; import java.security.SecureRandom;/** https://mvnrepository.com/artifact/commons-codec/…...

Hutool之DateUtil:让Java日期处理变得更加简单

前言 在Java开发中&#xff0c;日期和时间的处理是一个常见问题。为了简化这个过程&#xff0c;许多开发者会使用第三方工具包&#xff0c;如Hutool。Hutool是一个Java工具包&#xff0c;提供了许多实用的功能&#xff0c;其中之一就是日期处理。日期时间工具类是Hutool的核心包…...

解锁古籍中的气候密码,探索GPT/BERT在历史灾害研究中的前沿应用;气候史 文本挖掘 防灾减灾;台风案例、干旱案例、暴雨案例

历史灾害文献分析方法论的研究&#xff0c;是连接过去与未来的关键桥梁。通过对古籍、方志、档案等非结构化文本的系统性挖掘与量化分析&#xff0c;不仅能够重建千年尺度的灾害事件序列&#xff08;如台风、洪旱等&#xff09;&#xff0c;弥补仪器观测数据的时空局限性&#…...

DeepSeek-R3、GPT-4o 与 Claude-3.5-Sonnet 全面对比:性能、应用场景与技术解析

随着大模型技术的迅猛发展&#xff0c;国产模型正逐渐崭露头角&#xff0c;尤其是DeepSeek-R3的发布&#xff0c;更是在AI技术社区中引起广泛关注。而与此同时&#xff0c;国际领先的GPT-4o和Claude-3.5-Sonnet也在不断迭代升级&#xff0c;持续刷新业界对AI能力的认知。下文将…...

智能翻译播放器,让无字幕视频不再难懂

打工人们你们好&#xff01;这里是摸鱼 特供版~ 今天给大家带来一款超牛的黑科技——Splayer&#xff0c;完全免费的智能翻译播放器&#xff0c;让你轻松看懂无字幕视频&#xff01; 推荐指数&#xff1a;★★★★★ 软件简介 Splayer 是一款完全免费的智能翻译播放器&#…...

快手本地生活2024年GMV同增200%,“新线城市+AI”将成增长引擎

4月17日&#xff0c;“新线大市场&#xff0c;AI新机遇”快手本地生活2025聚力大会在沈阳召开。 会上&#xff0c;快手高级副总裁、本地生活事业部负责人笑古在聚力大会上表示&#xff0c;“新线城市AI”将成为快手本地生活的增长引擎。 据「TMT星球」了解&#xff0c;2024年…...

第七篇:系统分析师第三遍——1、2章

目录 一、目标二、计划三、完成情况四、意外之喜(最少2点)1.计划内的明确认知和思想的提升标志2.计划外的具体事情提升内容和标志 五、总结 一、目标 通过参加考试&#xff0c;训练学习能力&#xff0c;而非单纯以拿证为目的。 1.在复习过程中&#xff0c;训练快速阅读能力、掌…...

2025妈妈杯数学建模D题完整分析论文(共42页)(含模型建立、代码)

2025 年第十五届 MathorCup 数学建模D题完整分析论文 目录 摘要 一、问题分析 二、问题重述 三、模型假设 四、 模型建立与求解 4.1问题1 4.1.1问题1思路分析 4.1.2问题1模型建立 4.1.3问题1样例代码&#xff08;MATLAB和Python&#xff09; 4.1.4问题1结果…...

软考高级-系统架构设计师 论文范文参考(一)

文章目录 论SOA技术的应用论SOA在企业信息化中的应用论UP&#xff08;统一过程方法&#xff09;的应用论分布式数据库的设计与实现论改进Web服务器性能的有关技术论基于UML的需求分析论基于构件的软件开发论基于构件的软件开发(二) 论SOA技术的应用 摘要&#xff1a;  本人于…...

江湖路远,唯PUT可稳:Express 路由更新招式全解

前言 江湖传闻,后端开发如同修炼绝世武功:有人精通 POST 掌,横扫千军;有人修习 GET 指法,探查万象。而真正踏入高阶境界的高手,常常默默修炼一门冷门却威力极强的秘技,PUT 神功。 今日时机正好,你我相逢于码海江湖,不如来一场技术切磋,也许能悟出更新之道,功力再上…...

【k8s系列1】一主两从结构的环境准备

环境准备 虚拟机软件准备及安装&#xff0c;这里就不详细展开了&#xff0c;可以看文章:【一、虚拟机vmware安装】 linux环境准备及下载&#xff0c;下载镜像centOS7.9&#xff0c;以前也有写过这个步骤的文章&#xff0c;可以看&#xff1a;【二、安装centOS】 开始进入正题…...

通过特定协议拉起 electron 应用

在 Android 通过 sheme 协议可以拉起其他应用。 electron 应用也可以通过类似特定协议被拉起。 在同时有 web、客户端的应用里&#xff0c;可以通过这种方式在 web 拉起客户端。 支持拉起客户端 const PROTOCOL xxxif (process.defaultApp) {// 这里是开发环境&#xff0c;有…...

IDEA MyBatisCodeHelper Pro插件高版本解密

声明&#xff0c;该方法仅仅作为个人研究学习使用&#xff0c;请勿传播 版本说明 系统&#xff1a;macOS&#xff08;Windows同理&#xff09;IDE&#xff1a;IntelliJ IDEA 2024.4MyBatisCodeHelper Pro 3.4 环境准备 从插件市场下载MyBatisCodeHelper Pro 找到MyBatisCo…...

网站制作公司哪家好?如何选择靠谱的网站设计公司

在当今数字化时代&#xff0c;企业想要在互联网上立足&#xff0c;一个专业、美观且功能强大的网站是必不可少的。然而&#xff0c;面对众多的网站建设公司&#xff0c;如何选择一家真正适合自己需求的合作伙伴&#xff0c;成为了许多企业主和创业者面临的难题。毕竟&#xff0…...

Linux之基础命令

Linux作为开源操作系统的代表&#xff0c;以其高效、灵活和强大的命令行工具闻名。无论是系统管理、开发调试还是日常使用&#xff0c;掌握基础命令都是与Linux系统交互的必备技能。本文整理了20个最常用的Linux基础命令&#xff0c;帮助新手快速入门。 目录 目录与文件导航文…...

使用手机归属地查询API,使效率事半功倍

手机归属地查询API通过查询手机号码的归属地信息&#xff0c;为企业提供了一个高效、便捷的解决方案&#xff0c;帮助企业在竞争激烈的市场中脱颖而出。 代码示例 请求参数说明: 名称必填类型说明key是string个人中心查看phone是int手机号 返回参数说明: 名称类型说明phon…...

基于FPGA的AES加解密系统verilog实现,包含testbench和开发板硬件测试

目录 1.课题概述 2.系统测试效果 3.核心程序与模型 4.系统原理简介 4.1 字节替换&#xff08;SubBytes&#xff09; 4.2 行移位&#xff08;ShiftRows&#xff09; 4.3 列混合&#xff08;MixColumns&#xff09; 4.4 轮密钥加&#xff08;AddRoundKey&#xff09; 4.…...

【AI部署】腾讯云GPU -—SadTalker的AI数字人访问web服务—未来之窗超算中心

访问部署在Cloud Studio上的web服务 当你把该项目部署在本地时&#xff0c;访问该服务的请求地址为http://localhost:8080/hello&#xff1b;当你把该项目部署在Cloud Studio工作台启动时&#xff0c;要想访问到该服务&#xff0c;需要先在工作台右侧打开访问链接面板&#xff…...

Linux:命令行参数、环境变量

命令行参数 执行程序时&#xff0c;可以从命令行传值给 C 程序。这些值被称为命令行参数&#xff0c;它们对程序很重要&#xff0c;特别是当我们想从外部控制程序&#xff0c;而不是在代码内对这些值进行硬编码时&#xff0c;就显得尤为重要了。 在 C 语言中&#xff0c;命令…...

Linux CentOS 更改MySQL数据库目录位置

在 CentOS 系统上更改 MySQL&#xff08;或 MariaDB&#xff09;数据库目录位置&#xff08;datadir&#xff09;需要谨慎操作&#xff0c;以避免数据丢失或服务启动失败。以下是详细步骤&#xff1a; 1. 停止 MySQL/MariaDB 服务 bash 复制 sudo systemctl stop mysqld …...

Unity-微信截图功能简单复刻-03绘制空心矩形

思路-绘制空心矩形 拓展UGUI的Graphic类,实现拖拽接口。 开始拖拽时记录鼠标位置&#xff0c; 使用拖拽中的鼠标位置和记录的位置&#xff0c;计算矩形顶点&#xff0c;绘制矩形。 两个三角形合并为一个矩形&#xff0c;作为空心矩形的一条边&#xff0c;四个边合并为空心矩形…...

Flutter与FastAPI的OSS系统实现

作者&#xff1a;孙嘉成 目录 一、对象存储 二、FastAPI与对象存储 2.1 缤纷云S4服务API对接与鉴权实现 2.2 RESTful接口设计与异步路由优化 三、Flutter界面与数据交互开发 3.1 应用的创建 3.2页面的搭建 3.3 文件的上传 关键词&#xff1a;对象存储、FastAPI、Flutte…...

环境搭建与入门:Flutter SDK安装与配置

环境搭建与入门&#xff1a;Flutter SDK安装与配置 一、Flutter开发环境概述 1.1 Flutter开发环境组成 Flutter开发环境主要包含以下几个关键组件&#xff1a; Flutter SDK&#xff1a;Flutter的核心开发工具包Dart SDK&#xff1a;Flutter使用的编程语言环境IDE/编辑器&am…...

MATLAB 控制系统设计与仿真 - 35

MATLAB鲁棒控制器分析 所谓鲁棒性是指控制系统在一定(结构&#xff0c;大小)的参数扰动下&#xff0c;维持某些性能的特征。 根据对性能的不同定义&#xff0c;可分为稳定鲁棒性(Robust stability)和性能鲁棒性(Robust performance)。 以闭环系统的鲁棒性作为目标设计得到的…...

多模态记忆融合:基于LSTM的连续场景生成——突破AI视频生成长度限制

一、技术背景与核心挑战 2025年视频生成领域面临的关键难题是长时程连贯性——传统方法在生成超过5分钟视频时会出现场景跳变、物理规则不一致等问题。本研究提出时空记忆融合架构&#xff08;ST-MFA&#xff09;&#xff0c;通过LSTM记忆门控与多模态对齐技术&#xff0c;在R…...

架构师面试(三十二):注册中心数据结构

问题 提到【注册中心】&#xff0c;我们对它的基本功能&#xff0c;肯定可以顺手拈来&#xff0c;比如&#xff1a;【服务注册】【服务发现】【健康检查】【变更通知】等。 透过这些基本功能&#xff0c;一个普适的注册中心的数据结构应该如何设计呢&#xff1f; 可以结合着…...

Oracle 19c新特性:OCP认证考试与职业跃迁的关键?

在数字化转型的浪潮中&#xff0c;Oracle 19c作为数据库领域的旗舰版本&#xff0c;不仅承载着技术革新的使命&#xff0c;更成为IT从业者职业进阶的“黄金跳板”。无论是企业级应用的高可用性需求&#xff0c;还是云原生架构的快速迭代&#xff0c;Oracle 19c的智能化与多模型…...