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

【狂热算法篇】探秘图论之 Floyd 算法:解锁最短路径的神秘密码(通俗易懂版)

                   : 羑悻的小杀马特.-CSDN博客羑悻的小杀马特.擅长C/C++题海汇总,AI学习,c++的不归之路,等方面的知识,羑悻的小杀马特.关注算法,c++,c语言,青少年编程领域.https://blog.csdn.net/2401_82648291?spm=1010.2135.3001.5343  

在本篇文章中,博主将带大家去学习所谓的Floyd算法;从基本理解,画图分析展示,再到最后的代码实现,以及为何要这样实现代码,等一些细节问题做解释,相关题型应用,非常值得哟,尤其是刚入门的小白学习;干货满满,通俗易懂;欢迎大家点赞收藏阅读呀!!! 

 欢迎拜访:羑悻的小杀马特.-CSDN博客

本篇主题:秒懂百科之Floyd算法的深度剖析

制作日期:2025.01.17

隶属专栏:美妙的算法世界

 下面一起开始这场旅行吧:

目录

一·Floyd 算法介绍:

1.1算法背景与定义:

1.2 实例分析:

 1.3算法原理:

1.3.1初始化操作:

1.3.2动态规划递推过程:

1.3.3算法结束后的结果:

1.4算法复杂度:

1.4.1时间复杂度:

1.4.2空间复杂度:

二·Floyd算法代码实现及剖析:

填表时为何i到j会出现多个中间点:

滚动数组优化: 

k循环为什么套在最外层:

三·Floyd算法例题应用:

四·Floyd算法适用的算法题类型: 

4.1最短路径问题(所有顶点对):

4.2传递闭包问题(在有向图中):

4.3图的连通性判断(在有权图中):

4.4动态更新最短路径的问题:

五·Floyd算法实际应用场景:

5.1交通网络规划:

5.2计算机网络路由:

5.3游戏地图导航:

六·本篇小结:


一·Floyd 算法介绍:

下面我们不会直接把版子搬上来,这样大家可能会不太明白,而是通过形象的例子去模拟推导它的思路然后再把它转化成代码。

1.1算法背景与定义:

Floyd 算法(弗洛伊德算法)是一种用于解决图中多源最短路径问题的经典动态规划算法。它能够求出图中任意两个顶点之间的最短路径长度。这个图可以是有向图,也可以是无向图。例如,在一个交通网络中(以城市为顶点,道路为边),Floyd 算法可以帮助我们找到任意两个城市之间的最短行车距离。

1.2 实例分析:

这里上面说了无向图和有向图都适合,但是我们这里就里特别的有向图进行演示一遍是如何操作的(当然后面如果去实现代码的话只需要填给定权值的时候始终点在交换填充一次就OK了)

我们以下面的有向图为例子:

我们应用Floyd算法的思路:首先就是先搞一个邻接矩阵(b)和一个记录终节点的前驱一个节点的矩阵(h)(也就是这两个矩阵);接下来我们先把这两个矩阵初始化。

根据上图完成刚开始的初始化工作:

先解释下:行代表起始点的编号;而列代表的是终止点的标号。

对于b矩阵:对应的值是从起始点到终止点最小距离;-->为了找到给定节点最短路径长度

对于h矩阵: 对应的值表示的是从起始点到终止点的路径中;终止点前一个节点的标号。-->为了推导出最小路径长度所选择的路径所经节点有哪些。

b和h表的约定: 

然后我们可以知道b表:自己到自己是不需要距离的故初始化为0;而如果两点之间无路径就初始化为无穷即可(当然了这样定义起来也是比较舒服的); 对h表如果无法到达前驱就是-1。

然后我们要知道如果存在最小路径:它可能是直接到达终止点;还可能是一路上通过了一些中间点到达的。因此我们就需要一个个的遍历;也就是让这些点依次作为中间点去选择最小的路径,然后依次更新表:

下面,我们就以上面画的图为例;依次从0,1,2分别依次作为中间点去填表;那么我们最后把所有的点的情况都作为中间点考虑后,最后一次填完表 ;表中就出现的都是最小路径(这里其实,每次填表其实相当于对原表进行选择性覆盖)。

分析0作为中间节点:完成填表:

b表:我们需要由i到0然后再由0到j总的路径和如果和之前的路径比较,如果变小了说明需要更新否则照抄即可(也就是说明我们拿0作为中间点,相当于不合适,保持之前的路径) 

h表:这里我们要存放的是终止点的前一个即可:可以这么填:(如果b表对于位置的值不是照抄,那么就换成当前遍历到的待定中间点即可,否则就不变)

 因此按照我们上文划线的规定填表规则依次向后填充即可;下面就是1,2了:

以1作为中间节点:

以2作为中间节点(也就是存放最后最短路径的表了) :

最后我们可以根据路线图选择最短路径来验证一下它的正确性;为了好理解,我们举的是3个结点的例子,更多结点也是一样做法(可能会问这样每次都填一次表是不是麻烦;要记住我们依靠的是计算机来实现只需要后面利用动归即可)。 

小总结:我们之所以来这样举例模拟,就是为了后面为我们理解Floyd算法是那样设计的整个小铺垫,相信我们弄懂了上面这些操作是和进行的,那么后面算法实现就会有种恍然大悟的感觉啦。 

 1.3算法原理:

假设我们有一个包含 n 个顶点的图G=(V,E) ,其中  V是顶点集合,E 是边集合。我们使用一个二维数组d[i][j]  来表示顶点 i 到顶点 j 的最短路径长度估计。

1.3.1初始化操作:

当没有引入任何中间顶点时, d[i][j]的初始值为边 (i,j)的权值。如果 i=j,则 d[i][j]=0,因为一个顶点到自身的距离为 0;如果顶点  i和 j 之间没有直接边相连,那么d[i][j] 初始化为一个足够大的值(比如在编程中可以用一个很大的常量0x3f3f3f3f(int)(保证相加不越界,后面会说)来表示无穷大)。

1.3.2动态规划递推过程:

对于每一个中间顶点 k(从 1 到 n),我们检查是否可以通过这个中间顶点来缩短从顶点i  到顶点 j 的路径。更新公式为:

d[i][j]=min(d[i][j],d[i][k]+d[k][j])

这个公式的含义是,比较原来从 i 到 j 的最短路径估计值和经过中间顶点  k的路径长度(即从 i 到k的距离加上从  k到j 的距离),如果经过k的路径更短,就更新d[i][j] 的值。

1.3.3算法结束后的结果:

当所有的中间顶点都被考虑过后, d[i][j]中存储的就是顶点i到顶点j的最短路径长度。

1.4算法复杂度:

1.4.1时间复杂度:

Floyd 算法的时间复杂度是 O(N^3)。这是因为算法中有三层嵌套的循环,每层循环最多执行 n 次,所以总的时间复杂度是 N*N*N=N^3。

1.4.2空间复杂度:

算法需要一个二维数组来存储最短路径长度,所以空间复杂度是O(N^2) 。

二·Floyd算法代码实现及剖析:

 下面我们先把版子放在这,大家如果可以根据上面模拟的例子看懂就更好了,不懂的话,我们后面会一一剖析的(以有向图为例)这里对于节点的编号我们和上面例子变一下,从1开始。(一般输入都是结点编号都是默认从1开始)

floyd模版: 

void floyd(vector<vector<ll>>&dp) {for (int k = 1; k <= N; k++)for (int i = 1; i <= N; i++)for (int j = 1; j <= N; j++)dp[i][j] = min(dp[i][j], dp[i][k] + dp[k][j]);}

或许大家刚开始确实看不懂,因为上面的模版是我们从三维表示利用滚动数组优化降维后的表示(使得每次填表都会进行重新覆盖操作);那么下面我们就一步步分析代码是如何实现的吧:

上面我们不是根据依次遍历编号节点去填表嘛(这里我们就不考虑上面的h表的实现,只考虑b表的实现) :

首先我们先明确状态方程的定义:

先定义三维即dp[k][i][j]:表示当选择起始点为i,终止点为j的时候从i到j在中间经过的中间点不超过k个的时候最短路径。(这里先写三维状态方便我们理解,之后改写代码在做降维处理及解释)

 是不是还会有点迷糊对这个定义;下面我们再细说一下:

迷惑的应该是这个k是怎么规定的:

所谓的不超过k:

填表时为何i到j会出现多个中间点:

我们上面不是模拟了一下根据节点的个数去依次作为中间点去填表嘛(其实这里就是把这个过程转化成了代码):也就是我们每次会选择一个节点作为中间点;这就可能会得到它符合要求(以它作为中间点的话,我们可以比之前更短路径,因此就更新了b表);此后我们又遍历到令一个节点分析它作为中间点,又用到了上次被替换的i与j;分析后第二个中间点也成立;因此我们当前的i就会经历多个中间点然后到j。

下面我们画图形象展示一下:

这里我们首先以3作为1到4的中间点(注:在这之前值存的是1-2-4为13)(此前我们已经获得了3到4的最短路径也就是3-2-4,然后更新了对应b表值),然后再取min发现13就大于5+3了,即更新此刻就是1-3-2-4了;那么我们就会发现我们在每次填充b表值的时候每个最小路径值可以代表含有多个中间节点;那么k就是对它的约束。

 因此这里我们就明白为了要不超过k了;这里我们给节点按照升序排列;遍历到当前的k;那么它由i到j中间通过的节点数一定是小于等于k的。

①下面分析下状态转移方程吧:

首先我们在上面理解了这个k的相关含义,因此当我们遍历到第k个时候,dp里面存的最小路径长度里面所包含的中间节点个数肯定就是小于k咯(因为此刻到k还没开始更新):

因此我们可以不选k号,也可以选(当然根据长度变化最后更新(min)):不选的话就是,由i到j就是不超过k-1,选的话就是借助k这个点,先从i到k再从k到j。  哈哈,下面得出状态转移方程:

滚动数组优化: 

这里是三维的是不是看上去有点复杂;因为它每次我们可以看到用到的都是上一次的值,也就是刚刚填完的k-1的值,此时可以考虑滚动数组优化 ;直接把下一次的覆盖过去;降成二维即可。

这里倒序到是不用,直接把与k关的下标干掉(注意k这层循环不能去掉)即可:

k循环为什么套在最外层:

这里我们肯定是可以根据上面我们模拟的例子来写代码了,但是可能会有个疑问,为什么k要在最外层而不是最内层,①因为这里我们是把当前k固定看做中间点了;②或者还可以这么理解:上面我们画图分析每次如何填写b表;是先固定完这个k然后填完一次表再接着固定再来;因此这就是为什么k要在最外层的原因了。

②这里我们考虑的是先初始化好我们的b表:

这里我们得根据题意分析如何进行初始化(也就是在没有填充有向变的权的时候):

这里由于我们要的是最小值因此数组先全都搞成最大值;难道这里还是要搞INT_MAX这样的嘛?这就错了,我们之后可能会对这个表里的值先相加判断是不是最小路径(后面会说到);那么此时就越界了,因此选用的是0x3f3f3f3f(整型);至于为什么?请观看博主的另一篇博客有讲解:  【动态规划篇】步步带你深入解答成功AC最优包含问题(通俗易懂版)-CSDN博客

    如果让你恍然大悟,新知识涌入大脑,可以给博主的文章点个赞嘛!!!

其次呢就是右斜对角线:即行=列:一个点到一个点它自己的距离最短肯定就是0了;因此初始化,只要记住这两个细节就ok啦。

 vector<vector<ll>>dp(N + 1, vector<ll>(N + 1, 0x3f3f3f3f3f3f3f3f));
for (int i = 1; i < N + 1; i++) for (int j = 1; j < N + 1; j++)dp[i][j] = i == j ? 0 :dp[i][j];//这里以long long为例;int类似

③ 下面就是填充边的权值:

这里,根据我们题意所给的权值分两种情况:有向图和无向图填权值会有所不同,最终的求法也会不同:

有向图:

我们就直接填写就好:但是并不是真正的直接填入dp表;比如我们对有的边有多条边的权值被给出;那么就不能直接填了(因为我们要求填完第一次权值dp表内是已给出的最小路径长度,因此我们填写的时候对原先值取min即可)。

如果我们没有给权值就以为这无通路;自然举例就是我们的无穷(之前默认初始化的)。

 dp[i][j] = min(v, dp[i][j]);//保证加完权值dp值一定是所输入时候最小的

 无向图:

这里其实就是给了我们的两点和val只不过起始点和终止点是可以互换的(也就是有向图只能从起始点到终止点,而无向图还可以从终止点回到起始点。)故只需要i,j互换一下再填写即可。

 dp[i][j] = min(v, dp[i][j]);//保证加完权值dp值一定是所输入时候最小的dp[j][i] = min(v, dp[j][i]);//保证加完权值dp值一定是所输入时候最小的

 下面我们就直接调用Floyd函数完成填表即可;那么最后dp表里的值就是我们对应的i到j的最短路径长度了。

再下面就是询问了:

我们要明白分两种情况:

1.边权有负数的情况(负数路径是不算的):这时候当我们取相加取min就会发现变小;因此最后我们要根据题目权所给的范围来判断什么时候是无路径的。

2.都是正数:那么每次都是取min也就是原表还是0x3f3f3f3f的地方就是无路径的。

那么我们就完成啦对Floyd算法相关剖析了,

相信大家肯定有不同看法,学习到了吧! 

三·Floyd算法例题应用:

 下面我们就以一道无向图为例(无负数权值):

测试用例:

输入:

3 3 3

1 2 1

1 3 5

2 3 2

1 2

1 3

2 3 

 输出:

1

3

原题链接:  蓝桥账户中心

下面就直接按照我们上述讲的搬过去即可(不过这里注意一下数据相加过大用long long):

#include <bits/stdc++.h>
using namespace std;
using ll=long long;//这里floyd求最短路径的时候会出现dp之和;假设存在的w都是10^9那么相加就会出现越界;
ll N, M, Q;
void floyd(vector<vector<ll>>&dp) {for (int k = 1; k <= N; k++)for (int i = 1; i <= N; i++)for (int j = 1; j <= N; j++)dp[i][j] = min(dp[i][j], dp[i][k] + dp[k][j]);}int main()
{cin >> N >> M >> Q;vector<vector<ll>>dp(N + 1, vector<ll>(N + 1, 0x3f3f3f3f3f3f3f3f));//dp表初始化:for (int i = 1; i < N + 1; i++) for (int j = 1; j < N + 1; j++)dp[i][j] = i == j ? 0 : dp[i][j];//填充给出的权值:while (M--) {int i, j;ll v;cin >> i >> j >> v;//边是双向的:dp[i][j] = min(v, dp[i][j]);//保证加完权值dp值一定是所输入时候最小的dp[j][i] = min(v, dp[j][i]);//保证加完权值dp值一定是所输入时候最小的}floyd(dp);//询问去访问对应dp值:while (Q--) {int i, j;cin >> i >> j;//if(dp[i][j]>=0x3f3f3f3f/2) cout<<"-1"<<endl;负数权值情况if (dp[i][j] == 0x3f3f3f3f3f3f3f3f) cout << -1 << endl;else cout << dp[i][j] << endl;}return 0;
}

其他相关的题也不过是版子做一下修改即可。    

四·Floyd算法适用的算法题类型: 

4.1最短路径问题(所有顶点对):

例如:

给定一个城市交通网络,其中城市是顶点,道路是边,边的权值表示道路的长度。求任意两个城市之间的最短距离。这种情况下,Floyd 算法可以直接应用,通过构建城市交通网络的邻接矩阵,运行 Floyd 算法后,就可以得到所有城市对之间的最短距离。

4.2传递闭包问题(在有向图中):

传递闭包定义:在一个有向图  G=(V,E)中,对于顶点 u,v属于V,如果从u到v存在一条有向路径(路径长度可以是任意正整数),那么在传递闭包图中就有一条从u到v的边。

例如:

有一个社交网络关系图,其中顶点是人,边表示关注关系(有向边)。判断任意两个人之间是否存在关注路径(间接关注也算)。可以将 Floyd 算法用于解决这个问题,把图的邻接矩阵中的边权值设置为 1(表示存在关系)或者 0(表示不存在关系),运行 Floyd 算法后,如果 d[i][j] 不为 0,则表示从 i到 j存在关注路径。 

4.3图的连通性判断(在有权图中):

例如:

在一个通信网络中,每个节点代表一个通信基站,边代表基站之间的通信链路,边的权值表示链路质量。判断任意两个基站之间是否能够通信(可能通过其他基站中转)。通过 Floyd 算法计算最短路径,如果 d[i][j] 不是无穷大,则表示基站 i和j之间可以通信。

4.4动态更新最短路径的问题:

例如:

在一个物流配送网络中,边的权值可能会因为交通状况等因素动态变化。最初可以使用 Floyd 算法计算出所有仓库之间的最短路径。当某条边的权值改变后,可以再次运行 Floyd 算法(或者根据 Floyd 算法的原理部分更新受影响的路径)来重新计算最短路径,以适应网络的变化。

五·Floyd算法实际应用场景:

5.1交通网络规划:

在城市交通网络中,交通部门可以利用 Floyd 算法计算各个城市之间的最短路径,以便规划最优的公交线路、高速公路路线等。

例如,在一个区域内有多个城市,城市之间有不同长度的道路连接,通过 Floyd 算法可以找到任意两个城市之间的最短行车路线,帮助交通部门合理布局交通资源,提高交通效率。

5.2计算机网络路由:

在计算机网络中,网络管理员可以使用 Floyd 算法来确定数据包在不同节点之间传输的最短路径。这对于优化网络拓扑结构、提高网络性能和减少传输延迟非常重要。

例如,在一个企业内部网络或者互联网服务提供商的网络中,通过 Floyd 算法找到数据中心和用户终端之间的最优传输路径,确保数据能够快速、高效地传输。

5.3游戏地图导航:

在游戏开发中,特别是一些角色扮演游戏或者策略游戏,游戏地图往往是一个复杂的图结构。Floyd 算法可以用于实现游戏中的地图导航功能,帮助玩家找到从一个地点到另一个地点的最短路径。

比如在一个大型多人在线角色扮演游戏(MMORPG)中,玩家在一个庞大的游戏世界中需要从一个城镇前往另一个城镇,游戏系统可以利用 Floyd 算法为玩家提供最短的行走路线,增强游戏体验。

六·本篇小结:

Floyd算法和Dijkstra算法对比(文末)传送门:   

 通过本篇对Floyd算法介绍,我们会对它有一个全新的认识;那么下面我们就总结一下:

首先就是版子,大家最好理解,或者也可以直接背;其次就是操作的流程:根据题意先初始化化表-->根据给定的边权完成加边权操作注意有向图还是无向图)--->调用Floyd函数-->进行询问注意边权正负数情况)。

最后感谢大家阅读呀!!!! 

相关文章:

【狂热算法篇】探秘图论之 Floyd 算法:解锁最短路径的神秘密码(通俗易懂版)

&#xff1a; 羑悻的小杀马特.-CSDN博客羑悻的小杀马特.擅长C/C题海汇总,AI学习,c的不归之路,等方面的知识,羑悻的小杀马特.关注算法,c,c语言,青少年编程领域.https://blog.csdn.net/2401_82648291?spm1010.2135.3001.5343 在本篇文章中&#xff0c;博主将带大家去学习所谓的…...

25/1/13 嵌入式笔记 继续学习Esp32

PWM&#xff08;Pulse Width Modulation&#xff0c;脉宽调制&#xff09; 是一种通过快速切换高低电平来模拟中间电压值的技术。它广泛应用于控制 LED 亮度、电机速度、音频生成等场景。 analogWrite函数:用于在微控制器&#xff08;如 Arduino&#xff09;上生成模拟信号。 …...

C语言的语法糖

C语言的语法糖 引言 在程序开发的过程中&#xff0c;语言的设计和编写风格往往会直接影响开发效率和代码可读性。C语言作为一种广泛应用于系统编程和嵌入式开发的编程语言&#xff0c;其设计虽然追求简洁与高效&#xff0c;但在某些方面同样存在可以提高编程体验的“语法糖”…...

客户案例:致远OA与携程商旅集成方案

一、前言 本项目原型客户公司创建于1992年,主要生产并销售包括糖果系列、巧克力系列、烘焙系列、卤制品系列4大类,200多款产品。公司具有行业领先的生产能力,拥有各类生产线100条,年产能超过10万吨。同时,经过30年的发展,公司积累了完善的销售网络,核心经销商已经超过1200个,超…...

浔川 AI 翻译已修复,可正常使用

浔川 AI 翻译已修复&#xff0c;可正常使用 亲爱的用户们&#xff1a; 大家好&#xff01;经过技术团队的不懈努力&#xff0c;浔川 AI 翻译平台已完成修复&#xff0c;目前各项功能均已恢复正常&#xff0c;可流畅使用。在此&#xff0c;我们向一直以来关心和支持浔川 AI 翻译…...

【Python】深入探讨Python中的单例模式:元类与装饰器实现方式分析与代码示例

《Python OpenCV从菜鸟到高手》带你进入图像处理与计算机视觉的大门&#xff01; 解锁Python编程的无限可能&#xff1a;《奇妙的Python》带你漫游代码世界 单例模式&#xff08;Singleton Pattern&#xff09;是一种常见的设计模式&#xff0c;它确保一个类只有一个实例&…...

D. Paint the Tree

https://codeforces.com/problemset/problem/1975/D 分析&#xff1a; 观察样例可以发现&#xff0c;对于PB第一次在位置 r 接触到红点之后&#xff0c;接下来的怎么走完全可以有PB说了算&#xff0c;情况不会更差。同时还能发现&#xff0c;大部分边都是需要走两遍的&#xff…...

ScratchLLMStepByStep:训练自己的Tokenizer

1. 引言 分词器是每个大语言模型必不可少的组件&#xff0c;但每个大语言模型的分词器几乎都不相同。如果要训练自己的分词器&#xff0c;可以使用huggingface的tokenizers框架&#xff0c;tokenizers包含以下主要组件&#xff1a; Tokenizer: 分词器的核心组件&#xff0c;定…...

【Linux】Socket编程-TCP构建自己的C++服务器

&#x1f308; 个人主页&#xff1a;Zfox_ &#x1f525; 系列专栏&#xff1a;Linux 目录 一&#xff1a;&#x1f525; Socket 编程 TCP &#x1f98b; TCP socket API 详解&#x1f98b; 多线程远程命令执行&#x1f98b; 网络版计算器&#xff08;应用层自定义协议与序列化…...

数据结构——线性表和顺序表

1、线性表的基本概念 1.1 定义 线性结构是简单且常用的数据结构&#xff0c;而线性表则是一种典型的线性结构 存储数据&#xff0c;最简单&#xff0c;最有效的方法是吧它们存储在一个线性表中 一个线性表是n个元素的有限序列。每个元素在不同的情况下有不同的含义&#xff0c…...

FunASR 在Linux/Unix 平台编译

第一步拉取镜像并生成容器&#xff1a; ### 镜像启动 通过下述命令拉取并启动FunASR软件包的docker镜像&#xff1a; shell sudo docker pull \ registry.cn-hangzhou.aliyuncs.com/funasr_repo/funasr:funasr-runtime-sdk-online-cpu-0.1.12 mkdir -p ./funasr-runtime-…...

AIP-200 先例

编号200原文链接AIP-200: Precedent状态批准创建日期2018-06-28更新日期2018-06-28 很多时候&#xff0c;API的编写方式会违反新的指导原则。此外&#xff0c;有时出于特定原因也需要打破标准&#xff0c;例如与现有系统保持一致、满足严格的性能要求或其他因素。最后&#xf…...

SAP五大核心模块:塑造企业数字化未来

在数字化转型的浪潮中&#xff0c;SAP&#xff08;Systems, Applications and Products in Data Processing&#xff09;以其强大的企业资源规划&#xff08;ERP&#xff09;系统&#xff0c;成为众多企业信赖的伙伴。SAP系统通过五大核心模块&#xff0c;即财务管理&#xff0…...

【UE5.3】fix DONET报错

新的机器 4070 gpu 运行ue项目, 可能是epic 启动器是vs安装的, vs安装的epic 启动器自己更新了一波,导致了.NET的问题? ue项目是拷贝远程的windows的电脑里面的,应该不会导致ue源码里的cs出问题? 【UE5.3】UnrealLink 安装:fix Detected compiler newer than Visual Stu…...

【0393】Postgres内核 checkpointer process ③ 构建 WAL records 工作缓存区

1. 初始化 ThisTimeLineID、RedoRecPtr 函数 InitXLOGAccess() 内部会初始化 ThisTimeLineID、wal_segment_size、doPageWrites 和 RedoRecPtr 等全局变量。 下面是这四个变量初始化前的值: (gdb) p ThisTimeLineID $125 = 0 (gdb) p wal_segment_size $126 = 16777216 (gdb…...

pc 端 TensorRT API 实现 YOLOv11 的 C++ 小白部署经验

标题1 模型转化 python 先下载项目 https://github.com/ultralytics/ultralytics 同时下载模型 https://github.com/ultralytics/assets/releases/download/v8.3.0/yolo11n.pt pythonconda虚拟环境&#xff0c;主要是以下三个&#xff0c;其余缺什么直接pip anaconda…...

LLM - 大模型 ScallingLaws 的 C=6ND 公式推导 教程(1)

欢迎关注我的CSDN&#xff1a;https://spike.blog.csdn.net/ 本文地址&#xff1a;https://spike.blog.csdn.net/article/details/145185794 Scaling Laws (缩放法则) 是大模型领域中&#xff0c;用于描述 模型性能(Loss) 与 模型规模N、数据量D、计算资源C 之间关系的经验规律…...

【机器学习实战】kaggle 欺诈检测---使用生成对抗网络(GAN)解决欺诈数据中正负样本极度不平衡问题

【机器学习实战】kaggle 欺诈检测---如何解决欺诈数据中正负样本极度不平衡问题https://blog.csdn.net/2302_79308082/article/details/145177242 本篇文章是基于上次文章中提到的对抗生成网络&#xff0c;通过对抗生成网络生成少数类样本&#xff0c;平衡欺诈数据中正类样本极…...

C++ 之多线程相关总结

C 之多线程相关总结 1.多线程相关基础知识 1.1 线程的创建和管理 1. std::thread 类&#xff1a; 用于创建和管理线程。通过将可调用对象&#xff08;如函数、函数对象、lambda 表达式&#xff09;作为参数传递给 std::thread 的构造函数&#xff0c;可以创建一个新的线程。…...

基于机器学习随机森林算法的个人职业预测研究

1.背景调研 随着信息技术的飞速发展&#xff0c;特别是大数据和云计算技术的广泛应用&#xff0c;各行各业都积累了大量的数据。这些数据中蕴含着丰富的信息和模式&#xff0c;为利用机器学习进行职业预测提供了可能。机器学习算法的不断进步&#xff0c;如深度学习、强化学习等…...

性能测试 - Locust WebSocket client

Max.Bai 2024.10 0. 背景 Locust 是性能测试工具&#xff0c;但是默认只支持http协议&#xff0c;就是默认只有http的client&#xff0c;需要其他协议的测试必须自己扩展对于的client&#xff0c;比如下面的WebSocket client。 1. WebSocket test Client “”“ Max.Bai W…...

量子计算将彻底改变商业分析

虽然量子计算听起来颇具未来感&#xff0c;但这项技术正迅速走向成熟 —— 就如同 ChatGPT 这类人工智能&#xff08;AI&#xff09;工具一样。我相信&#xff0c;量子计算技术所产生的连锁反应很快就会对业务分析领域产生巨大影响。 什么是量子计算&#xff1f; 尽管名字听起…...

爬山算法与模拟退火算法的全方面比较

一、基本概念与原理 1. 爬山算法 爬山算法是一种基于启发式的局部搜索算法,通过不断地向当前解的邻域中搜索更优解来逼近全局最优解。它的核心思想是,从当前解出发,在邻域内找到一个使目标函数值更大(或更小)的解作为新的当前解,直到找不到更优的解为止。 2.模拟退火算…...

【深度学习】用RML2018训练好模型去识别RML2016的数据会遇到输入维度不匹配的问题,如何解决?

文章目录 问题解决办法1. 调整输入数据长度2. 修改模型结构(我个人比较推崇的方法)3. 迁移学习4. 重新训练模型5. 数据增强6. 其他差异问题 经常会有人问的一个问题: 我用RML2018跑的调制识别模型,用RML2016数据集能直接识别吗?(2018数据集信号样本的长度是1024,2016数据集…...

2025年1月17日(点亮一个 LED)

系统信息&#xff1a; Raspberry Pi Zero 2W 系统版本&#xff1a; 2024-10-22-raspios-bullseye-armhf Python 版本&#xff1a;Python 3.9.2 已安装 pip3 支持拍摄 1080p 30 (1092*1080), 720p 60 (1280*720), 60/90 (640*480) 已安装 vim 已安装 git 学习目标&#xff1a;…...

商用车电子电气零部件电磁兼容条件和试验(8)—辐射抗干扰(ALSE)和便携式发射机抗干扰(HPT)

写在前面 本系列文章主要讲解商用车电子/电气零部件或系统的传导抗干扰、传导发射和辐射抗干扰、电场辐射发射以及静电放电等试验内容及要求,高压试验项目内容及要求。 若有相关问题,欢迎评论沟通,共同进步。(*^▽^*) 目录 商用车电子电气零部件电磁兼容条件和试验—目录…...

NumPy;NumPy在数据分析中的应用;NumPy与其他库的搭配使用

NumPy&#xff1b;NumPy在数据分析中的应用&#xff1b;NumPy与其他库的搭配使用 NumPy&#xff1a;Python 数据分析的核心工具什么是 NumPy&#xff1f;NumPy 的主要优势 NumPy 在数据分析中的应用1. 数据处理与清洗2. 数学和统计分析3. 数组变换与矩阵运算 NumPy 与其他库的搭…...

机器学习经典无监督算法——聚类K-Means算法

目录 算法原理 算法步骤 算法API 算法导入 API参数理解 算法实现 算法原理 Kmeans 算法是一种无监督的聚类算法&#xff0c;目的是将数据集中的样本划分到 K 个不同的簇中。 聚类&#xff1a;将数据集中相似的数据点归为一组或一个簇的过程。 数据集&#xff1a;一组相…...

网络变压器的分类

网络变压器是局域网(LAN)中各级网络设备中必备的元件。它们的主要功能是传输数据&#xff0c;增强信号&#xff0c;并提供电气隔离&#xff0c;以防雷保护和匹配阻抗。网络变压器也被称为数据泵或网络隔离变压器。它们广泛应用于网络交换机、路由器、网卡、集线器等设备中。 网…...

【MySQL】复合查询+表的内外连接

复合查询表的内外连接 1.基本查询回顾2.多表查询3.自连接4.子查询4.1单列子查询4.2多列子查询 5.在from子句中使用子查询6.合并查询7.表的内连和外连7.1内连接7.2外连接7.2.1左外连接7.2.2右外连接 点赞&#x1f44d;&#x1f44d;收藏&#x1f31f;&#x1f31f;关注&#x1f…...

创建模式、结构模式及行为模式

谁在什么地方提供什么功能&#xff1f; 要设计几个类?这些类各个是什么功能&#xff1f;相互间的关系是什么&#xff1f; 创建模式指的是对象那么多&#xff0c;怎么把它"生"出来&#xff1f;生几个&#xff1f;从这个角度上来说数组就是一种另类的创建模式。主要…...

警惕IDEA 2024版重大Bug问题:LomBok失效、Gradle冲突、Spring Boot启动错误

一直以来我认为工具类的软件是越新越好&#xff0c;因为工具代表着一定的先进性&#xff1b;但是IDEA 2024好好的给我上了一课&#xff0c;比如lombok 不起作用、比如Spring Boot 3.4.x 启动报错、再比如MyBatis log plus冲突、再比如Gradle插件冲突. 一、Lombok 失效问题 请不…...

C语言中char str和char str[]的区别

char* str和char* str[]的区别&#xff1a;C语言中char *str[] 和char *str有什么区别-CSDN博客 char str 和 char str[] 在 C 语言中也有不同的含义和用途&#xff0c;以下是它们的区别&#xff1a; 1. char str 类型&#xff1a;这是一个单一的字符变量。 用途&#xff1a…...

(学习总结20)C++11 可变参数模版、lambda表达式、包装器与部分新内容添加

C11 可变参数模版、lambda表达式、包装器与部分新内容添加 一、可变参数模版基本语法及原理包扩展emplace系列接口 二、lambda表达式lambda表达式语法捕捉列表lambda的原理lambda的应用 三、包装器bindfunction 四、部分新内容添加新的类功能1.默认的移动构造和移动赋值2.声明时…...

备份和容灾之区别(The Difference between Backup and Disaster Recovery)

备份和容灾之区别 备份和容灾都是数据安全常见的保障手段&#xff0c;但是一般在正常业务运行时是无需用到这两个技术手段的。只有在业务已经崩溃&#xff0c;需要进行业务恢复时&#xff0c;这两种技术的价值才能真正体现。所以&#xff0c;备份和容灾可以说是数据安全最后两…...

Go语言之路————数组、切片、map

Go语言之路————数组、切片、map 前言一、数组二、切片三、map 前言 我是一名多年Java开发人员&#xff0c;因为工作需要现在要学习go语言&#xff0c;Go语言之路是一个系列&#xff0c;记录着我从0开始接触Go&#xff0c;到后面能正常完成工作上的业务开发的过程&#xff…...

Kotlin Bytedeco OpenCV 图像图像57 图像ROI

Kotlin Bytedeco OpenCV 图像图像57 图像ROI 1 添加依赖2 测试代码3 测试结果 1 添加依赖 <?xml version"1.0" encoding"UTF-8"?> <project xmlns:xsi"http://www.w3.org/2001/XMLSchema-instance"xmlns"http://maven.apache.o…...

字符编码通过字节数组向16进制的互转【终端设备通讯案例篇】:微信小程序 JavaScript字符串转gb2312 字符编码,以16进制字符串传输。(接收蓝牙设备的信息,发送北斗终端消息)

文章目录 引言I 原理II 案例一:微信小程序字符串转gb2312 字符编码,以16进制字符串传输。字节数组 转16进制字符串微信小程序字符串转gb2312 字节数组(utf8ToGb2312Bytes)demo:gb2312 字符编码->字节数组->16进制字符串III 案例二: 小程序接收gb2312 的16进制字符串…...

LabVIEW与WPS文件格式的兼容性

LabVIEW 本身并不原生支持将文件直接保存为 WPS 格式&#xff08;如 WPS 文档或表格&#xff09;。然而&#xff0c;可以通过几种间接的方式实现这一目标&#xff0c;确保您能将 LabVIEW 中的数据或报告转换为 WPS 可兼容的格式。以下是几种常见的解决方案&#xff1a; ​ 导出…...

协程(还需要输入3个字)

昨天我偶然听到协程这个概念&#xff0c;不禁好奇地了解了一下&#xff0c;做些笔记如下&#xff1a; 一、什么是协程 协程是在线程内部&#xff0c;由程序自己控制逻辑&#xff0c; 显式地让出控制权&#xff08;yield&#xff09;来实现任务切换&#xff0c;而不是由操作系…...

系统架构设计师-第1章-计算机系统知识要点

【本章学习建议】 根据考试大纲&#xff0c;本章主要考查系统架构设计师单选题&#xff0c;预计考1分左右。第二版教材2.2节增加了本块内容&#xff0c;但较为简略&#xff0c;需要课程补充&#xff0c;属于非重点内容。 1.1 计算机硬件组成 计算机的基本硬件系统由运算器、控…...

Linux -- 初识HTTP协议

目录 什么是HTTP协议 什么是 URL &#xff1f; 理解 URL 初识HTTP 请求与响应格式 代码验证 gitee HTTP.hpp 结果 什么是HTTP协议 HTTP&#xff08;HyperText Transfer Protocol&#xff0c;超文本传输协议&#xff09;主要用于客户端&#xff08;通常是浏览器&#…...

【已解决】我和ollama运行的qwen2.5大模型通信,总是返回GGGG?

起因&#xff1a; 和大模型通信的时候&#xff0c;总是返回 GGG 之类的乱码。 curl查询返回到结果&#xff1a; 既然curl通信不行&#xff0c;直接在控制台聊天呢&#xff1f; 话都说不明白&#xff0c;我火了&#xff0c;结果一查&#xff0c;我熄火了&#xff0c;是ollama…...

在Mac mini上实现本地话部署AI和知识库

在Mac mini上实现本地话部署AI和知识库 硬件要求&#xff1a;大模型AI&#xff0c;也叫LLM&#xff0c;需要硬件支持&#xff0c;常见的方式有2种&#xff1a;一种是采用英伟达之类支持CUDA库的GPU芯片或者专用AI芯片&#xff1b;第二种是采用苹果M系列芯片架构的支持统一内存架…...

SQL和MySQL以及DAX的日期表生成?数字型日期?将生成的日期表插入到临时表或者实体表中

几种生成日期表的方法 如何用SQL语句生成日期表呢&#xff1f; 如何用MySQL语句生成日期表呢&#xff1f; 如何用DAX语句生成日期表呢&#xff1f; 1. MySQL生成日期表 1.1 日期格式&#xff1a;yyyy-MM-dd 字符型 2024-01-02 -- 生成日期表 WITH RECURSIVE temp_dateTable …...

win32汇编环境,窗口程序中基础列表框的应用举例

;运行效果 ;win32汇编环境,窗口程序中基础列表框的应用举例 ;比如在窗口程序中生成列表框&#xff0c;增加子项&#xff0c;删除某项&#xff0c;取得指定项内容等 ;直接抄进RadAsm可编译运行。重点部分加备注。 ;以下是ASM文件 ;>>>>>>>>>>>…...

Sentinel配置流控规则详解

前言 在微服务架构中&#xff0c;流量控制&#xff08;Flow Control&#xff09;是保障服务稳定性的重要手段之一。Sentinel作为一款开源的流量控制、熔断降级Java库&#xff0c;以其丰富的应用场景和完善的监控能力&#xff0c;在微服务保护中扮演了重要角色。本文将详细介绍…...

opencv图像基础学习

2.3图像的加密解密 源码如下&#xff1a; import cv2 import numpy as np import matplotlib.pyplot as plt def passImg():imgcv2.imread(./image/cat.jpg,0)h,wimg.shape#生成一个密码&#xff0c;加密key_imgnp.random.randint(0,256,size(h,w),dtypenp.uint8)img_addmcv2…...

递归40题!再见递归

简介&#xff1a;40个问题&#xff0c;有难有易&#xff0c;均使用递归完成&#xff0c;需要C/C的指针、字符串、数组、链表等基础知识作为基础。 1、数字出现的次数 由键盘录入一个正整数&#xff0c;求该整数中每个数字出现的次数。 输入&#xff1a;19931003 输出&#xf…...

javadoc使用dos命令生成api文档演示

新建一个文本后缀改java&#xff0c;名字改为类名 文本内容&#xff1a; /** * author ZZJ * version jdk23.0.1 */ public class Test{/*** 求输入两个参数范围以内整数的和* param n 接收的第一个参数&#xff0c;范围起点* param m 接收的第二个参数&#xff0c;范围终点*…...