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

(适合中白)数据结构进阶篇——搜索专题(广度优先搜索算法BFS和深度优先搜索算法DFS)

深度优先搜索DFS&广度优先搜索BFS

    • 深度优先搜索
    • 广度优先搜索

深度优先搜索

当碰到岔路口时,总是以深度作为前进的关键词,不碰到死胡同就不回头的这种搜索方式被称为深度优先搜索(Depth First Search)
深度优先搜索是一种枚举所有完整路径以遍历所有情况的搜索方法。使用递归可以很好的实现深度优先搜索(非递归也是可以实现DFS的思想,但一般情况下比较麻烦)使用递归时,系统会调用一个叫系统栈的东西来存放递归中每一层的状态,因此使用递归来实现DFS的本质其实还是栈。
接下来讲一个例子吧


e.g. 有n件物品,每件物品重量为w[i],价值为c[i]。现在需要选出若干件物品放入一个容器为V的背包中,使得在选入背包的物品重量和不超过容量V的前提下,让背包中物品的价格之和最大,求最大价值。(1<=n<=20)


讲解: 需要从n件物品中选择若干物品放入背包,使他们的价值之和最大,则对每件物品都有选或不选两种选择,这就是所谓的岔路口 而死胡同则是选择的物品重量总和不超过V,因此一旦选择的物品重量总和超过V,就会到达死胡同,需要返回最近的岔路口。
显然,每次都要对物品进行选择,因此DFS函数的参数中必须记录当前处理的物品编号index,涉及到的物品的重量和价值,因此也需要参数记录在处理当前物品之前,已选物品的总重量sumW与总价值sumC。于是DFS函数看起来是这个样子:
void DFS(int index, int sumW, int sumC){ ... }
如果选择不放入index号物品,那么sumW与sumC就将不变,接下里处理index+1号物品,即`DFS(index+1, int sumW, int sumC){ … },而如果选择放入index号物品,那么sumW将增加当前物品的重量w[index],sumC将增加当前物品的价值c[index],接着处理index+1号物品,即前往DFS(index+1,sumW+w[index],sumC+c[index])这条分支。
一旦index增长到了n,则说明已经把n件物品处理完毕(因为物品下标从0到n-1),此时记录的sumW和sumC就是所选物品的总重量和总价值。如果sumW不超过V且sumC大于一个全局的记录最大总价值的变量,就说明当前的这种选择方案可以得到更大的价值,于是用sumC更新maxValue。
下面给出代码

#include<bits/stdc++.h>
using namespace std;
int n,V,maxValue; //n:一共有n件物品,V:背包的承重,maxValue:全局最大价值
const int maxn = 1000;
int w[maxn],c[maxn];//w存储商品的重量,c存储商品的价值
void DFS(int index,int sumW,int sumC){if(index == n){ //已经选择完毕n件商品,index从0开始if(sumW<=V && sumC>maxValue){maxValue = sumC;}}//选择第index件商品DFS(index+1,sumW+w[index],sumC+c[index]);//不选DFS(index+1.sumW,sumC);
}int main(){cin>>n>>V;for(int i=0;i<n;i++){cin>>w[i]>>c[i];}DFS(0,0,0);//初始时为第0件商品且当前重量和价值都为0cout<<maxValue<<endl;return 0;
}

上面的代码总是把n件物品的选择全部确定之后才去更新最大价值,但事实上忽视了背包容量不超过V这个特点,也就是说,完全可以把对sumW的判断加入"岔路口"中,只有当sumW<=V时才进入岔道,这样效率会高很多,代码如下:

void DFS(int index, int sumW, int sumC){if(index==n){return; //已经完成对n件物品的选择}DFS(index+1,sumW,sumC); //不选第index件物品//只有加入第index件物品后未超过容量V,才能继续if(sumC + c[index] <= V){if(sumC + c[index] > maxValue){maxValue = sumC + c[index]; //更新最大价值maxValue}DFS(index+1,sumW+w[index],sumC+c[index]); //选择第index件物品}
}

通过上面的修改可以显著降低计算量,而通过题目条件的限制来节省DFS计算量的方法称作剪枝 ,学会剪枝可以降低时间复杂度
事实上,上面的问题给出了一类常见DFS问题的解决方法,即给定一个序列,枚举这个序列的所有子序列(可以不连续)。例如对序列{1,2,3}来说,他的所有子序列为{1},{2},{3},{1,2},{1,3},{2,3},{1,2,3}。枚举所有子序列的目的很明显——可以从中选择一个序列保存下来。显然,这个问题等价于枚举从N个整数中选择K个数的所有方案
例如这样一个问题:
给定N个整数(可能有负数),从中选择K个数,使得这K个数之和恰好等于一个给定的整数X;如果有多个方案,选择他们中元素平方和最大的一个。数据保证这样的方案唯一。例如从4个整数{2,3,4,5}中选择2个数,使他们的和为6,显然有两种方案{2,4}与{3,3},其中平方和最大的方案为{2,4}。
与之前的问题类似,此处仍然需要记录当前处理的整数编号index:由于要求恰好选择K个数,因此需要一个参数nowK来记录已经选择的数的个数;另外,还需要参数sum和sumSqu分别记录当前已选择的数的个数;另外,还需要参数sum和sumSqu分别记录当前已选整数之和与平方和。于是DFS就是下面这个样子:
void DFS(int index, int nowK, int sum, int sumSqu){ ··· }
此处主要讲解如何保存最优方案,即平方和最大的方案。首先,需要一个数组temp,用以存放当前已经选择的整数。这样,当试图进入“选index号数”这条分支时,就把A[index]加入到temp中;而这条分支结束时,就把它从temp中去除,使他不会影响“不选index号数”这条分支。接着,如果在某个时候发现当前已经选择了K个数,且这K个数之和恰好为x时,就去判断平方和是否比已有的最大平方和maxSumSqu还要大:如果确实更大,就把temp给用以存放最优方案的数组ans。这样所有方案枚举完毕后,ans存放的就是最优方案了,而maxSumSqu存放的是对应的最优值。
下面给出代码:

//序列A中n个数选k个数使得和为x,最大平方和为maxSumSqu
int n,k,x,maxSumSqu = -1,A[maxn];
//temp 存放临时方案,ans存放平方和最大方案
vector<int> temp,ans;
//当前处理index号整数, 当前已选整数个数为nowK
//当前已选整数之和为sum,当前已选择整数平方和为sumSqu
void DFS(int index,int nowK,int sum,int sumSqu){if(nowK==k && sum==x){if(sumSqu>maxSumSqu){maxSumSqu = sumSqu;ans = temp; //更新最优方案}return;}// 已经处理完n个数,或者超过k个数,或者和超过x,返回if(index==n||nowK>k||sum>x) return;//选index号数temp.push_back(A[index]);DFS(index+1,nowK+1,sum+A[index],sumSqu+A[index]*A[index]);temp.pop_back();//不选index号数DFS(index+1,nowK,sum,sumSqu);
}

上面这个问题中的每个数都只能选择一次,现在稍微修改题目:假设N个整数中的每个都可以被选择多次,那么选择K个数,使得K个数之和为X。例如有三个整数1,4,7,需要从中选择5个数,使得和为17.显然,只需选择3个1和2个7,即可得到17。
这个问题只需要对上面的代码进行少量的修改。
由于每个整数都可以被选择多次,因此当选择了index号数时,不应当直接进入index+1。而应继续选择index号数,直到某个时刻决定不再选择index号数,就会通过“不选index号数”这条分支进入index+1号数的处理。因此只需要把“选index号数”这条分支的代码修改为DFS(index,nowK+1,sum+A[index],sumSqu+A[index]*A[index])即可。

广度优先搜索

BFS(Breadth First Search)以广度为第一关键词,当碰到岔路口时,总是一次访问从该岔路口能直接到达的所有节点,然后再按这些结点被访问的顺序去依次访问他们能直接到达的所有节点,以此类推,直到所有节点都被访问为止。
以迷宫为例子的话,BFS能够得出从起点到出口的最少步数
广度优先搜索一般由队列实现,且总是按层次的顺序进行遍历,其基本写法如下(可做模板用):

void BFS(int s){queue<int> q;q.push(s);while(!q.empty()){取出队首元素top;访问队首元素top;将队首元素出队;将top的下一层结点中未曾入队的结点全部入队,并设置为已入队;}
}

下面是对该模板中每一个步骤的说明,请结合代码一起看:

  1. 定义队列q,并将起点s入队。
  2. 写一个while循环,循环条件是队列q非空。
  3. 在while循环中,先取出队首元素top,然后访问它(访问可以是任何事情,例如将其输出)。访问完后将其出队。
  4. 将top的下一层结点中所有未曾入队的节点入队,并标记他们的层号为now的层号加1,同时设置这些入队的结点已入队。
  5. 返回2继续循环

下面举一个例子
给出一个mxn的矩阵,矩阵中的元素为0或1。称位置(x,y)与其上下左右四个位置(x,y+1)、(x,y-1)、(x+1,y)、(x-1,y)是相邻的。如果矩阵中有若干个1是相邻的(不必两两相邻),那么称这些1构成了一个“块”。求给定的矩阵中“块”的个数。
在这里插入图片描述
例如上面的6x7的矩阵中,“块”的个数为4。


对这个问题,求解的基本思想是:枚举每一个位置的元素,如果为0,则跳过;如果为1,则使用BFS查询与该位置相邻的4个位置(前提是不出界),判断他们是否为1(如果某个相邻的位置为1,则同样去查询与该位置相邻的4个位置,直到整个“1”块访问完毕)。而为了防止回头路,一般可以设置一个bool型数组inq(即in queue的简写)来记录每个位置是否在BFS中已入队
一个小技巧是:对当前位置(x,y)来说,由于与其相邻的四个位置分别为(x,y+1)、(x,y-1)、(x+1,y)、(x-1,y),那么不妨设置下面两个增量数组,来表示四个方向(竖着看即为(0,1)、(0,-1)、(1,0)、(-1,0))。
int X[] = {0,0,1,-1};
int Y[] = {1,-1,0,0};
这样就可以使用for循环来枚举4个方向,以确定与当前坐标(nowX,nowY)相邻的4个位置,如下所示:

for(int i=0;i<4;i++){newX = nowX + X[i];newY = nowY + Y[i];
}

下面给出本例的代码

#include<cstdio>
#include<queue>
using namespace std;
const int maxn = 100;
struct node{int x,y;
}Node;int n,m; //矩阵的大小为n,m
int matrix[maxn][maxn]; //01矩阵
bool inq[maxn][maxn] = {false}; //记录位置(x,y)是否已入队
int X[4] = {0,0,1,-1};
int Y[4] = {1,-1,0,0};
bool judge(int x,int y){//越界返回falseif(x>=n || x<0 || y>=m || y<0) return false;//位置为0,或(x,y)已入队,返回falseif(matrix[x][y]==0 || inq[x][y] == true) return false;//以上都不满足,返回truereturn true;
}//BFS函数访问位置(x,y)所在的块,将该块中所有"1"的inq都设置为true
void BFS(int x,int y){queue<node> Q; //定义队列Node.x = x,Node.y = y;Q.push(Node); //将结点Node入队inq[x][y] = true; //设置(x,y)已入过队while(!Q.empty()){node top = Q.front(); //取出队首元素Q.pop(); //队首元素出队for(int i=0;i<4;i++){int newX = top.x + X[i];int newY = top.y + Y[i];if(judge(newX,newY)){ //如果新位置(newX,newY)需要访问//设置Node的坐标为(newX,newY)Node.x = newX,Node.y = newY;Q.push(Node); //将结点Node加入队列inq[newX][newY] = true; //设置位置(newX,newY)已入队}}}
}
int main(){scanf("%d%d",&n,&m);for(int x=0;x<n;x++){for(int y=0;y<m;y++){scanf("%d",&matrix[x][y]); //读入01矩阵}}int ans = 0; //存放块数for(int x=0;x<n;x++){for(int y=0;y<m;y++){//如果元素为1,且未入过队if(matrix[x][y]==1 && inq[x][y] == false){ans++;BFS(x,y); //访问整个块,将该块所有"1"的inq都标记为true}}}printf("%d\n",ans);return 0;}

接下来再看一个类似的例子:

给定一个n*m大小的迷宫,其中 * 代表不可通过的墙壁,而“·”代表平地,S表示起点,T代表终点。移动过程中,如果当前位置是(x,y)(下标从0开始),且每次只能前往上下左右(x,y+1)(x+1,y) (x,y-1) (x-1,y)四个位置的平地,求从起点S到达终点T的最少步数
在这里插入图片描述
在上面的样例中,S的坐标是(2,2),T的坐标为(4,3)。


在本题中,由于求的是最少步数,而BFS是通过层次的顺序来遍历的,因此可以从起点S开始计数遍历的层数,那么在到达终点T时的层数就是需要求解的起点S到达终点T的最少步数。
下面给出代码:

#include<bits/stdc++.h>
using namespace std;
const int maxn = 100;
struct node{int x,y; //位置(x,y)int step; //step为从起点S到达该位置的最少步数(即层数)
}S,T,Node; //S为起点,T为终点,Node为临时结点int n,m; //n为行,m为列
char maze[maxn][maxn]; //迷宫信息
bool inq[maxn][maxn] = {false}; //记录位置(x,y)是否已入过队
int X[4] = {0,0,1,-1}; //增量数组
int Y[4] = {1,-1,0,0};//检测位置(x,y)是否有效
bool test(int x,int y){if(x>=n || x<0 || y>=m || y<0) return false; //超过边界if(maaze[x][y] == '*') return false; //墙壁if(inq[x][y] == true) return false; //已入队return true;
}
int BFS(){queue<node> q; //定义队列q.push(S); //将起点入队while(!q.empty()){node top = q.top();q.pop();if(top.x == T.x && top.y == T.y){return top.step; //终点,直接返回最少步数}for(int i=0;i<4;i++){ //循环4次,得到4个相邻位置int newX = top.x+X[i];int newY = top.y+Y[i];if(test(newX,newY)){ //位置(newX,newY)有效//设置Node的坐标为(newX,newY)Node.x = newX,Node.y = newY;Node.step = top.step+1; //Node层数为top的层数+1q.push(Node); //将节点加入队列inq[newX][newY] = true; //设置位置(newX,newY)已入队}}}return -1;//无法到达终点T
}int main(){scanf("%d%d",&n,&m);for(int i=0;i<n;i++){getchar(); //过滤掉每行后面的换行符for(int j=0;j<m;j++){maze[i][j] = getchar();}maze[i][m+1] = '\0';}scanf("%d%d%d%d",&S.x,&S.Y,&T.x,&T.y); //起点和终点的坐标S.step = 0; //初始化起点的层数为0printf("%d\n",BFS());return 0;
}

相关文章:

(适合中白)数据结构进阶篇——搜索专题(广度优先搜索算法BFS和深度优先搜索算法DFS)

深度优先搜索DFS&广度优先搜索BFS 深度优先搜索广度优先搜索 深度优先搜索 当碰到岔路口时&#xff0c;总是以深度作为前进的关键词&#xff0c;不碰到死胡同就不回头的这种搜索方式被称为深度优先搜索(Depth First Search) 深度优先搜索是一种枚举所有完整路径以遍历所有情…...

SGLang实战问题全解析:从分布式部署到性能调优的深度指南

引言&#xff1a;当高性能推理遇上复杂生产环境 在大型语言模型(LLM)的生产部署中&#xff0c;SGLang以其革命性的RadixAttention和结构化编程能力&#xff0c;正成为越来越多企业的首选推理引擎。然而&#xff0c;当我们将32B/70B级别的大模型部署到实际生产环境时&#xff0…...

Java大视界:解码航天遥测数据的银河密码——从GB到PB的技术革命

当长征火箭划破苍穹的瞬间&#xff0c;每秒产生的遥测数据足以填满一部4K电影。在这场与星辰对话的征程中&#xff0c;Java大数据生态正扮演着解码宇宙密码的"数字炼金师"。本文将带您穿越三个认知维度&#xff0c;揭示Java技术栈如何重构航天数据分析的底层逻辑。 …...

《C++探幽:STL(string类源码的简易实现(下))》

作者的个人gitee▶️ 作者的算法讲解主页 每日一言&#xff1a;“驿寄梅花&#xff0c;鱼传尺素&#xff0c;砌成此恨无重数。&#x1f338;&#x1f338;” 接《C探幽&#xff1a;STL&#xff08;string类源码的简易实现&#xff08;上&#xff09;&#xff09;》&#x1f534…...

求线性表的倒数第K项 (数组、头插法、尾插法)

给定一系列正整数&#xff0c;请设计一个尽可能高效的算法&#xff0c;查找倒数第K个位置上的数字。 输入格式: 输入首先给出一个正整数K&#xff0c;随后是若干非负整数&#xff0c;最后以一个负整数表示结尾&#xff08;该负数不算在序列内&#xff0c;不要处理&#xff09…...

rustdesk自建服务器怎么填写客户端配置信息

目录 # id、api、中继都怎么填&#xff1f;rustdesk程序启动后服务不自动启动 # id、api、中继都怎么填&#xff1f; rustdesk程序启动后服务不自动启动 完全退出RudtDesk程序&#xff08;右下角托盘区有的话&#xff0c;需要右键点退出&#xff09; 创建windows服务&#xff…...

4月8日日记

今天抖音刷到一个视频 记了一下笔记 想做自媒体&#xff0c;直播&#xff0c;抖音是最大的平台&#xff0c;但是我的号之前因为跟人互喷被封号了 今天想把实名认证转移到新号上&#xff0c;试了一下竟然这次成功了&#xff0c;本以为能开直播了但是 还是因为之前的号有违规记…...

VScode添加python解释器

先安装python扩展 然后点ctrlshiftp搜索python:select&#xff0c;选择解析器&#xff08;或者也可以直接点左下方的&#xff09;...

Elasticsearch | ES索引模板、索引和索引别名的创建与管理

关注&#xff1a;CodingTechWork 引言 在使用 Elasticsearch (ES) 和 Kibana 构建数据存储和分析系统时&#xff0c;索引模板、索引和索引别名的管理是关键步骤。本文将详细介绍如何通过 RESTful API 和 Kibana Dev Tools 创建索引模板、索引以及索引别名&#xff0c;并提供具…...

用 Python 造轮子:打造轻量级 HTTP 调试工具

目录 一、为什么需要自建工具&#xff1f; 二、核心功能设计 三、技术选型 四、分步实现 第一步&#xff1a;搭建基础框架 第二步&#xff1a;实现请求转发逻辑 第三步&#xff1a;响应格式化处理 第四步&#xff1a;历史记录存储 五、进阶优化技巧 六、使用示例 七…...

java设计模式-原型模式

原型模式 1、原型模式(Prototype模式)是指&#xff1a;用原型实例指定创建对象的种类&#xff0c;并通过拷贝这些原型&#xff0c;创建新的对象 2、原型模式是一种创见性设计模式&#xff0c;允许一个对象再创建另一个可定制的对象&#xff0c;无需知道如何创建的细节。 3、工作…...

【Java设计模式】第9章 原型模式讲解

9. 原型模式 9.1 原型模式讲解 定义:通过拷贝原型实例创建新对象,无需调用构造函数。特点: 创建型模式无需了解创建细节适用场景: 类初始化消耗资源多对象创建过程繁琐(如属性赋值复杂)循环体中需创建大量对象优点: 性能优于直接new简化创建流程缺点: 必须实现clone()…...

Python 快速搭建一个小型的小行星轨道预测模型 Demo

目录 ✅ Demo 目标&#xff1a; &#x1f9ea; 模型方案选择 方案 1&#xff1a;开普勒 LSTM 混合预测&#xff08;推荐 &#x1f4a1;&#xff09; 方案 2&#xff1a;全 AI&#xff1a;LSTM 直接拟合轨迹 &#x1f6a7; 环境准备 &#x1f527; 示例代码结构&#xff…...

【AI】Ragflow构建本地知识库

https://github.com/infiniflow/ragflow/blob/main/README_zh.md DeepSeek搭建的本地知识库很呆&#xff1f;不符合自己的预期&#xff1f;看完这个视频你就明白了&#xff01;这样部署吊打其他的本地部署&#xff01;跟着教程来&#xff0c;不怕学不会&#xff01;_哔哩哔哩_…...

【Django】教程-12-柱状图

【Django】教程-1-安装创建项目目录结构介绍 【Django】教程-2-前端-目录结构介绍 【Django】教程-3-数据库相关介绍 【Django】教程-4-一个增删改查的Demo 【Django】教程-5-ModelForm增删改查规则校验【正则钩子函数】 【Django】教程-6-搜索框-条件查询前后端 【Django】教程…...

市政消防栓智能监控管理系统(Axure高保真原型)

在城市的运转体系中&#xff0c;市政消防栓扮演着无可替代的关键角色&#xff0c;作为城市公共安全基础设施的核心&#xff0c;它是火灾扑救时的关键水源保障&#xff0c;其重要性不言而喻。当火灾这头 “猛兽” 突然来袭&#xff0c;市政消防栓就是那道阻止火势蔓延、守护生命…...

机器学习课堂6交叉熵代价函数的逻辑回归模型

代码 # 2-10交叉熵代价函数的逻辑回归模型 import pandas as pd import numpy as np import matplotlib.pyplot as plt# 参数设置 iterations 1000 # 迭代次数 learning_rate 0.1 # 学习率 m_train 250 # 训练样本数量# 读入酒驾检测数据集 df pd.read_csv(alcohol_d…...

华为ar1200修改con口密码

<Huawei> <Huawei>sys Enter system view, return user view with CtrlZ. [Huawei]user-interface console 0 进入端口 [Huawei-ui-console0]authentication-mode pass 以pass模式登录 [Huawei-ui-console0]set authentication password cipher …...

Java 集合有序性与重复性总结及记忆技巧

Java 集合有序性与重复性总结及记忆技巧 一、集合分类速查表 集合类型是否有序是否允许重复记忆口诀ArrayList✅ 有序&#xff08;插入顺序&#xff09;✅ 可重复"数组列表&#xff0c;顺序记牢"LinkedList✅ 有序&#xff08;插入顺序&#xff09;✅ 可重复"…...

机器学习--词向量转换

引言 在自然语言处理&#xff08;NLP&#xff09;的广阔领域中&#xff0c;计算机面临的一大挑战是理解人类语言的丰富性和复杂性。文本数据对于机器而言&#xff0c;最初只是一连串难以理解的字符。词向量转换便成为了一座关键的桥梁&#xff0c;它将文本中的单词映射为数值向…...

时序数据异常检测-综述

更新中 异常检测基本概念 广义的Out-of-Distribution(广义的OOD)来描述异常检测的相关问题。OOD包括五个相关的子领域,分别为Anomaly Detection(AD)、Novelty Detection(ND)、Open Set Recogntion(OSR)、Out-of-Distribution(OOD)和Outlier Detection(OD)。这5个…...

2025年Python的主要应用场景

李升伟 编译 Python在2025年仍是最受欢迎和强大的编程语言之一。其简洁易读的语法以及庞大的库生态系统&#xff0c;使其成为各行业开发者的首选。无论是构建复杂的数据管道&#xff0c;还是自动化重复性任务&#xff0c;Python都能提供广泛的应用场景&#xff0c;以实现快速、…...

树的深度遍历和广度遍历

目录 一、深度优先遍历&#xff08;递归&#xff09;二叉树的深度优先遍历&#xff08;递归&#xff09; 二、广度优先遍历二叉树的广度遍历 一、深度优先遍历&#xff08;递归&#xff09; #include<iostream> #include<vector>using namespace std;const int N1…...

C++函数如何返回多个参数

在编程中&#xff0c;我们经常会遇到需要函数返回多个值的场景。虽然 C 函数不能直接返回多个参数&#xff0c;但通过一些间接的方法&#xff0c;我们可以轻松实现这一需求。本文将详细介绍几种常见的实现方式&#xff0c;并分析它们的优缺点和适用场景。 1. 引言 在 C 中&…...

Python 实现的运筹优化系统代码详解(0-1规划指派问题)

一、引言 在数学建模的广阔领域中&#xff0c;指派问题作为一类经典且重要的组合优化问题&#xff0c;频繁出现在各类实际场景里。例如&#xff0c;在人力资源管理中&#xff0c;如何将不同技能水平的员工高效地分配到各个项目&#xff0c;以实现项目成本最小化或收益最大化&am…...

深度集成学习不均衡样本图像分类

用五个不同的网络&#xff0c;然后对分类概率进行平均&#xff0c;得到分类结果。基本上分类精度可以提升10% 1.导入基本库 import torch import copy import torch.nn as nn import torchvision.models as models from torchvision import datasets from torchvision import…...

ubuntu 20.04 复现 LVI-SAM

1.环境配置 ubuntu20.04 ROS-Noetic GTSAM 4.0.2 Ceres 1.14.0 前面的我都安装过了&#xff0c;但Ceres 我安装的是 2.2.0,现在安装Ceres 1.14.0 sudo apt-get update sudo apt-get install cmake libgoogle-glog-dev libgflags-dev libatlas-base-dev libeigen3-dev lib…...

每日OJ题_剑指offer数组篇(剑指offer04+剑指offer11+剑指offer21)

目录 剑指 Offer 04二维数组中的查找 代码解析 剑指 Offer 11旋转数组的最小数字 代码解析1 代码解析2 剑指 Offer 21. 调整数组顺序使奇数位于偶数前面 代码解析1 代码解析2 剑指 Offer 04二维数组中的查找 LCR 121. 寻找目标值 - 二维数组 - 力扣&#xff08;LeetCo…...

使用 `tcpdump` 抓取 LiDAR 网络数据包详解

在调试机器人系统或自动驾驶平台时&#xff0c;我们经常需要分析网络中的 LiDAR&#xff08;激光雷达&#xff09;数据流。本文将介绍如何使用 tcpdump 工具对指定 IP 的数据包进行抓取和分析&#xff0c;特别是 LiDAR 数据的典型 UDP 报文。 一、什么是 tcpdump&#xff1f; …...

【NLP 55、强化学习与NLP】

万事开头难&#xff0c;苦尽便是甜 —— 25.4.8 一、什么是强化学习 强化学习和有监督学习是机器学习中的两种不同的学习范式 强化学习&#xff1a;目标是让智能体通过与环境的交互&#xff0c;学习到一个最优策略以最大化长期累积奖励。 不告诉具体路线&#xff0c;首先去做…...

【Linux】单例模式及其在线程池中的应用

&#x1f4e2;博客主页&#xff1a;https://blog.csdn.net/2301_779549673 &#x1f4e2;博客仓库&#xff1a;https://gitee.com/JohnKingW/linux_test/tree/master/lesson &#x1f4e2;欢迎点赞 &#x1f44d; 收藏 ⭐留言 &#x1f4dd; 如有错误敬请指正&#xff01; &…...

Ansible的使用2

#### 一、Ansible变量 ##### facts变量 > facts组件是Ansible用于采集被控节点机器的设备信息&#xff0c;比如IP地址、操作系统、以太网设备、mac 地址、时间/日期相关数据&#xff0c;硬件信息等 - setup模块 - 用于获取所有facts信息 shell ## 常用参数 filter…...

十三届蓝桥杯省赛A组 扫描游戏

#算法/线段树 #算法/快读 参考题解: 题解参考 这题思路: 先将坐标进行极角排序,按照顺时针的先后顺序,如果出现两个坐标在一个象限中,我们就先判断这两个坐标是否在同一条直线上,如果在同一条直线上,我们按照离原点最近的长度进行排序 之后,我们通过线段树的方法,定义结点tr[i]…...

Python 序列构成的数组(list.sort方法和内置函数sorted)

list.sort方法和内置函数sorted list.sort 方法会就地排序列表&#xff0c;也就是说不会把原列表复制一份。这 也是这个方法的返回值是 None 的原因&#xff0c;提醒你本方法不会新建一个列 表。在这种情况下返回 None 其实是 Python 的一个惯例&#xff1a;如果一个函数 或者…...

C++类与对象进阶知识深度解析

目录 一、再谈构造函数 &#xff08;一&#xff09;构造函数体赋值 &#xff08;二&#xff09;初始化列表 &#xff08;三&#xff09;成员变量初始化顺序 &#xff08;四&#xff09;explicit关键字 二、static成员 &#xff08;一&#xff09;概念 &#xff08;二&am…...

【机器学习案列】基于LightGBM算法的互联网防火墙异常行为检测:数据不平衡的解决方案

&#x1f9d1; 博主简介&#xff1a;曾任某智慧城市类企业算法总监&#xff0c;目前在美国市场的物流公司从事高级算法工程师一职&#xff0c;深耕人工智能领域&#xff0c;精通python数据挖掘、可视化、机器学习等&#xff0c;发表过AI相关的专利并多次在AI类比赛中获奖。CSDN…...

详解minio部署

MinIO 是一款高性能、开源的分布式对象存储解决方案&#xff0c;专为存储非结构化数据&#xff08;如图片、视频、备份数据等&#xff09;而设计。MinIO 在吞吐量和延迟上表现出高性能提供与 Amazon S3 完全兼容的 API&#xff0c;支持水平扩展&#xff0c;支持端到端加密、访问…...

校园AI体育:科技赋能教育,运动点亮未来

校园AI体育&#xff1a;科技赋能教育&#xff0c;运动点亮未来 在数字化浪潮的推动下&#xff0c;人工智能&#xff08;AI&#xff09;已经悄然走进校园&#xff0c;成为教育领域的一股创新力量。而在体育教育中&#xff0c;AI技术的引入更是为传统体育教学注入了新的活力。校…...

LeetCode算法题(Go语言实现)_35

题目 给你一棵根为 root 的二叉树&#xff0c;请你返回二叉树中好节点的数目。 「好节点」X 定义为&#xff1a;从根到该节点 X 所经过的节点中&#xff0c;没有任何节点的值大于 X 的值。 一、代码实现 func goodNodes(root *TreeNode) int {if root nil {return 0}return d…...

ROS2_control 对机器人控制(不完整,有时间再更新)

ROS2_control 对机器人控制 安装与介绍安装介绍 使用gz 中写法.yaml文件中写法type: joint_state_broadcaster/JointStateBroadcaster的来源 命令接口关节控制command_interfacetransmission CMakelist.txt与package.xml文件 gz_ros2_control与自定义插件例子描述自定义插件使用…...

SAP-ABAP:SAP Enterprise Services Repository(ESR)技术全景解析

以下是对SAP PO中Enterprise Services Repository(ESR)的深度技术解析,包含详细架构设计、开发实践及企业级应用方案: SAP Enterprise Services Repository(ESR)技术全景解析 一、ESR核心架构与组件关系 1. 技术堆栈定位 ┌─────────────────────…...

每日一道leetcode

2130. 链表最大孪生和 - 力扣&#xff08;LeetCode&#xff09; 题目 在一个大小为 n 且 n 为 偶数 的链表中&#xff0c;对于 0 < i < (n / 2) - 1 的 i &#xff0c;第 i 个节点&#xff08;下标从 0 开始&#xff09;的孪生节点为第 (n-1-i) 个节点 。 比方说&…...

通过Aop实现限制修改删除指定账号的数据

1、需求 对于Teach账号创建的数据&#xff0c;其他用户仅仅只有查询的权限&#xff0c;而不能修改和删除。并且部分接口只允许Teach账号访问 2、实现思路 在删除和修改时往往需要传递数据的id&#xff0c;进而可以通过id查询该数据是否由Teach账号创建。当然我们可以在每个删…...

递归实现指数型枚举

我们以n2 为例 我们每次都有选和不选两种 方案&#xff0c;对于每个数字 核心代码 tatic void dfs(int u) { // u代表当前处理的数字if (u > n) { // 终止条件&#xff1a;处理完所有数字for (int i 1; i < n; i) { // 遍历所有数字if (nums[i]) {…...

无代码国产流程引擎 FlowLong 1.1.6 发布

无代码国产流程引擎 FlowLong 1.1.6 于 2025 年 4 月 7 日发布。 FlowLong 是一款纯血国产自研的工作流引擎&#xff0c;具有以下特点&#xff1a; 核心精简&#xff1a;引擎核心仅 8 张表实现逻辑数据存储&#xff0c;采用 json 数据格式存储模型&#xff0c;结构简洁直观。组…...

软考高项-考前冲刺资料-M 类【项目管理类】【光头张老师出品】

重点考点汇总 一、案例答题时需要注意: 1.条目写要清晰,要标注 1、2、3、4、… 2.关键字突出,关键字一定是专业词汇如 “监控”“控制成本”…等等,代替自己平时工作中的用此。 3.尽量多写几点,错了不扣分,但是避免重复写,避免写了一大段的内容,但是表达的是一个观点。…...

LLM Agents项目推荐:MetaGPT、AutoGen、AgentVerse详解

这一部分我们将深入介绍三大备受关注的LLM Agents项目&#xff1a;MetaGPT、AutoGen和AgentVerse&#xff0c;包括它们的背景、设计思路、主要功能、技术亮点以及典型应用场景。 1. MetaGPT&#xff1a;让AI像软件工程团队一样协作 项目背景 MetaGPT由Huang et al.于2023年提…...

win10家庭版安装Docker

win10家庭版本中成功安装Docker&#xff0c;亲测&#xff01; 1、下载Docker 下载地址&#xff1a;http://mirrors.aliyun.com/docker-toolbox/windows/docker-toolbox/ Docker的有CE和EE版&#xff0c;CE为免费版&#xff0c;EE由公司支持的付费版&#xff0c;在此选择CE版本…...

mapbox基础,加载ESRI OpenStreetMap开放街景标准风格矢量图

👨‍⚕️ 主页: gis分享者 👨‍⚕️ 感谢各位大佬 点赞👍 收藏⭐ 留言📝 加关注✅! 👨‍⚕️ 收录于专栏:mapbox 从入门到精通 文章目录 一、🍀前言1.1 ☘️mapboxgl.Map 地图对象1.1 ☘️mapboxgl.Map style属性二、🍀加载ESRI OpenStreetMap开放街景标准风…...

【网络安全 | 漏洞挖掘】通过分析JS文件实现接口未授权访问与账户接管

未经许可,不得转载。 文中所述漏洞均已修复,未经授权不得进行非法渗透测试。 文章目录 正文正文 大约一年前,我给我妈买了一辆 2023 款斯巴鲁 Impreza,前提是她得答应我,之后我可以借来做一次“白帽渗透测试”。过去几年我一直在研究其他车企的安全问题,但一直没有机会仔…...