--图--
并查集
并查集原理
在一些应用问题中,需要将n个不同的元素划分成一些不相交的集合。开始时,每个元素自成一个单元素集合,然后按一定的规律将归于同一组元素的集合合并。在此过程中要反复用到查询某一个元素归属于那个集合的运算。适合于描述这类问题的抽象数据类型称为并查集(union-findset)。
下边是我画的一个示例图,好好看看如何划分集合的规则
存储并查集的数组有如下特点:
1. 数组的下标对应集合中元素的编号
2. 数组中如果为负数,负号代表根,数字代表该集合中元素个数
3. 数组中如果为非负数,代表该元素双亲在数组中的下标
下边是并查集合并集合的一个示例图
这里将例子中的第二个集合合并到第一个集合。这里的并查集变化如上。
通常并查集有如下功能:
1、查找元素属于哪个集合
沿着数组表示的树形关系,向上找到根节点,即数组中该集合表示负数的位置。
2、查看两个元素是否属于同一个集合
沿着数组表示的树形关系,向上找到根节点,看根节点是否相同
3、将两个集合归并成一个集合
(1)将两个集合中的元素合并
(2)将一个集合名称改为另一个集合的名称
4、集合的个数
遍历数组,数组中元素为负数的个数即集合的个数
并查集代码实现
/*
* 数据结构--------并查集
*/
class UnionFindSet
{
public:UnionFindSet(size_t n):_ufs(n, -1){}//合并,x1和x2进行合并void Union(int x1, int x2){int root1 = FindRoot(x1);int root2 = FindRoot(x2);//如果本身就在一个集合,就不用再合并了if (root1 == root2){return;}//走到这里就说明不是一个集合了/** 这里做数据压缩,当数据量大的时候,能较好的提升效率* 这里假定将数据量小的往数据量大的合并*/if (abs(_ufs[root1]) < abs(_ufs[root2])){std::swap(root1, root2);}/** 这里假定是将第二个合并到第一个*/_ufs[root1] += _ufs[root2];_ufs[root2] = root1;}//找根的位置int FindRoot(int x){int root = x;while (_ufs[root] >= 0){root = _ufs[root];}/** 路径压缩* 路径压缩,就是将多层压成一层的,将多层转变为根的孩子*/while (_ufs[x] >= 0){//由叶节点到根,依次修改int parent = _ufs[x];_ufs[x] = root;x = parent;}return root;}//x1和x2是否在一个集合中bool InSet(int x1, int x2){return FindRoot(x1) == FindRoot(x2);}//计算集合中树的数量 size_t SetSize(){size_t size = 0;for (size_t i = 0; i < _ufs.size(); ++i){if (_ufs[i] < 0) {++size;}}return size;}
private:vector<int> _ufs;
};
这里在合并和查找根的时候做些了路径压缩的优化。合并的时候,策略是将数据量少的合并到数据量多的,较少操作的数据量。查找的时候,策略将多层的数据优化为一层,提升查找效率。
图
图的基础知识
完全图:在有n个顶点的无向图中,若有n * (n-1)/2条边,即任意两个顶点之间有且仅有一条边,则称此图为无向完全图,比如上图G1;在n个顶点的有向图中,若有n * (n-1)条边,即任意两个顶点之间有且仅有方向相反的边,则称此图为有向完全图。
邻接顶点:在无向图中G中,若(u, v)是E(G)中的一条边,则称u和v互为邻接顶点,并称边(u,v)依附于顶点u和v;在有向图G中,若<u, v>是E(G)中的一条边,则称顶点u邻接到v,顶点v邻接自顶点u,并称边<u, v>与顶点u和顶点v相关联。
顶点的度:顶点v的度是指与它相关联的边的条数,记作deg(v)。在有向图中,顶点的度等于该顶点的入度与出度之和,其中顶点v的入度是以v为终点的有向边的条数,记作indev(v);顶点v的出度是以v为起始点的有向边的条数,记作outdev(v)。因此:dev(v) = indev(v) + outdev(v)。注意:对于无向图,顶点的度等于该顶点的入度和出度,即dev(v) = indev(v) = outdev(v)。
路径:在图G = (V, E)中,若从顶点vi出发有一组边使其可到达顶点vj,则称顶点vi到顶点vj的顶点序列为从顶点vi到顶点vj的路径。
路径长度:对于不带权的图,一条路径的路径长度是指该路径上的边的条数;对于带权的图,一条路径的路径长度是指该路径上各个边权值的总和。
简单路径与回路:若路径上各顶点v1,v2,v3,…,vm均不重复,则称这样的路径为简单路
径。若路径上第一个顶点v1和最后一个顶点vm重合,则称这样的路径为回路或环。
子图:设图G = {V, E}和图G1 = {V1,E1},若V1属于V且E1属于E,则称G1是G的子图。
连通图:在无向图中,若从顶点v1到顶点v2有路径,则称顶点v1与顶点v2是连通的。如果图中任意一对顶点都是连通的,则称此图为连通图。
强连通图:在有向图中,若在每一对顶点vi和vj之间都存在一条从vi到vj的路径,也存在一条从vj到vi的路径,则称此图是强连通图。
生成树:一个连通图的最小连通子图称作该图的生成树。有n个顶点的连通图的生成树有n个顶点和n-1条边。
最小生成树
连通图中的每一棵生成树,都是原图的一个极大无环子图,即:从其中删去任何一条边,生成树 就不在连通;反之,在其中引入任何一条新边,都会形成一条回路。
若连通图由n个顶点组成,则其生成树必含n个顶点和n-1条边。因此构造最小生成树的准则有三条:
1. 只能使用图中的边来构造最小生成树
2. 只能使用恰好n-1条边来连接图中的n个顶点
3. 选用的n-1条边不能构成回路
克鲁斯卡尔算法
贪心策略:每次迭代时,选出一条具有最小权值,且两端点不在同一连通分量上的边,加入生成树。
步骤:1、初始化即将返回的生成树。2、使用优先级队列选出图中的最小边。3、使用并查集判断选出的最小边是否会构成环。如若选出的最小边并未出现在并查集中,则可以将其加入并查集中,视为找到了一条新的边。
图解:
代码实现:
struct Edge
{size_t _srci;size_t _dsti;W _w;Edge(size_t srci, size_t dsti, const W& w):_srci(srci),_dsti(dsti),_w(w){}bool operator>(const Edge& e) const{return _w > e._w;}
};
/*
* 克鲁斯卡尔算法(最小生成树)
*/
W Kruskal(Self& minTree)
{//初始化size_t n = _vertexs.size();minTree._vertexs = _vertexs;minTree._indexMap = _indexMap;minTree._matrix.resize(n);for (size_t i = 0; i < n; ++i){minTree._matrix[i].resize(n, MAX_W);}//使用优先级队列找出最小边priority_queue<Edge, vector<Edge>, std::greater<Edge>> Minque; //greaterfor (size_t i = 0; i < n; ++i){for (size_t j = 0; j < n; ++j){//这里是无向图,所以使用i<j 可以避免重复查找if (i < j && _matrix[i][j] != MAX_W){Minque.push(Edge(i, j, _matrix[i][j]));}}}//选出n-1条边size_t size = 0;W totalW = W();//这里使用并查集,将选入的边收入同一个集合UnionFindSet ufs(n);while (!Minque.empty()){//取出最小边Edge min = Minque.top();Minque.pop();if (!ufs.InSet(min._srci, min._dsti))//该最小边并未出现在集合中{cout << _vertexs[min._srci] << "->" << _vertexs[min._dsti] << ":" << min._w << endl;minTree._AddEdge(min._srci, min._dsti, min._w);ufs.Union(min._srci, min._dsti);++size;totalW += min._w;}else{cout << "构成环:";cout << _vertexs[min._srci] << "->" << _vertexs[min._dsti] << ":" << min._w << endl;}}if (size == n - 1){return totalW;}else{return W();}}
普利姆算法
贪心策略:选择当前未被选中的顶点中,与已选顶点集合距离最近的顶点,并将其加入到最小生成树中(即每次选边的时候是从两个集合中的顶点直接相连的边中选取权值最小的那一条。),直到所有顶点都被选中。
步骤:1、初始化最小生成树,并确定起点。2、使用优先级队列选出已选集合和未选集合之间最近的边。3、如果选出的最近边在已选集合中,则构环。反之,则不构环,将最近边加入已选集合中
代码实现:
//普利姆算法W Prim(Self& minTree, const W& src){size_t srci = GetVertexIndex(src);size_t n = _vertexs.size();minTree._vertexs = _vertexs;minTree._indexMap = _indexMap;minTree._matrix.resize(n);for (size_t i = 0; i < n; ++i){minTree._matrix[i].resize(n, MAX_W);}vector<bool> X(n, false);//已选集合vector<bool> Y(n, true);//未选集合X[srci] = true;Y[srci] = false;//从X->Y集合中连接的边里面选出最小的边priority_queue<Edge, vector<Edge>, greater<Edge>> minq;for (size_t i = 0; i < n; ++i){if (_matrix[srci][i] != MAX_W){minq.push(Edge(srci, i, _matrix[srci][i]));}}cout << "Prim开始选边" << endl;size_t size = 0;W totoalW = W();while (!minq.empty()){Edge min = minq.top();minq.pop();//如果最小边的目标点也在X集合中,则构成环if (X[min._dsti] == true){cout << "构成环:";cout << _vertexs[min._srci] << "->" << _vertexs[min._dsti] << ":" << min._w << endl;}else{minTree._AddEdge(min._srci, min._dsti, min._w);cout << _vertexs[min._srci] << "->" << _vertexs[min._dsti] << ":" << min._w << endl;X[min._dsti] = true;Y[min._dsti] = false;++size;totoalW += min._w;if (size == n - 1){break;}for (size_t i = 0; i < n; ++i){/** 将新添加顶点的相邻边添加进优先级队列,但是上一个顶点的边不能在添加进去,* 即不能存在在未添加集合X中*/if (_matrix[min._dsti][i] != MAX_W && X[i] == false){minq.push(Edge(min._dsti, i, _matrix[min._dsti][i]));}}}}if (size == n - 1){return totoalW;}else{return W();}}
最短路径
(单源)迪杰斯特拉算法
贪心策略:选择当前未被选中的顶点中,与已选顶点集合距离最近的顶点,并将其加入到已选集合中。
步骤:1、构造两个数组,dist表示记录srci-其他顶点最短路径权值数组;pPath表示记录srci-其他顶点最短路径父顶点数组。2、选择的最短路径顶点且不在已选集合中。3、进行松弛操作,更新其它路径。
缺陷:不适用于负权值的有向图
代码实现:
/*
* src表示源点
* dist表示记录srci-其他顶点最短路径权值数组
* pPath表示记录srci-其他顶点最短路径父顶点数组
*/
void Dijkstra(const V& src, vector<W>& dist, vector<int>& pPath)
{size_t srci = GetVertexIndedx(src);size_t n = _vertexs.size();dist.resize(n, MAX_W);pPath.resize(n, -1);dist[srci] = 0;pPath[srci] = srci;vector<bool> S(n, false);//已经确定最短路径的顶点集合for (size_t k = 0; k < n; ++k){/** 选最短路径顶点且不在S更新其它路径*/int u = 0;//这里的u表示不在集合S中的点的下标W min = MAX_W;//这里是记录源点到u的最小权值for (size_t i = 0; i < n; ++i){if (S[i] == false && dist[i] < min){u = i;min = dist[i];}}S[u] = true;//将u加入已选定的集合中/** 松弛操作更新u连接顶点v* (srci->u + u->v) < (srci->v),则更新*/for (size_t v = 0; v < n; ++v){if (S[v] == false&& _matrix[u][v] != MAX_W&& (dist[u] + _matrix[u][v] < dist[v])){dist[v] = dist[u] + _matrix[u][v];pPath[v] = u;}}}
}
(单源)贝尔曼福德算法
核心:每次迭代对每条边都进行松弛操作(即先后对所有的顶点的相邻顶点进行松弛),执行迭代的次数最多是边的个数。
步骤:执行流程和迪杰斯特拉算法类似,都是以松弛操作为核心。
优势:寻找最短路径的时候,能够解决带有负权路径的情况。
代码实现:
bool BellmanFord(const V& src, vector<W>& dist, vector<int>& pPath)
{size_t n = _vertexs.size();size_t srci = GetVertexIndedx(src);//vector<W> dist,记录srci-其它顶点最短路径权值数组dist.resize(n, MAX_W);//vector<int> pPath 记录srci-其它顶点最短路径顶点数组pPath.resize(n, -1);//先更新srci->srci为缺省值dist[srci] = W();//最多更新n轮cout << "----upgrade start!!----" << endl;for (size_t k = 0; k < n; ++k){//i->j 松弛更新cout << "第" << k + 1 << "轮更新" << endl;//类似冒泡排序的优化-----提前跳出bool update = false;for (size_t i = 0; i < n; ++i){for (size_t j = 0; j < n; ++j){// srci->i,i->jif (_matrix[i][j] != MAX_W && dist[i] + _matrix[i][j] < dist[j]){update = true;cout << _vertexs[i] << "->" << _vertexs[j] << ":" << _matrix[i][j] << endl;dist[j] = dist[i] + _matrix[i][j];;pPath[j] = i;}}}//如果这个轮次中没有更新出更短路径,那么后续的轮次就不需要再走了if (update == false){break;}}/** 检测负权回路* 贝尔曼福特算法无法解决带负权回路的情况*/for (size_t i = 0; i < n; ++i){for (size_t j = 0; j < n; ++j){// 还能继续更新就表示带负权回路if (_matrix[i][j] != MAX_W && dist[i] + _matrix[i][j] < dist[j]){return false;}}}cout << "----upgrade done!!----" << endl;return true;
}
相关文章:
--图--
并查集 并查集原理 在一些应用问题中,需要将n个不同的元素划分成一些不相交的集合。开始时,每个元素自成一个单元素集合,然后按一定的规律将归于同一组元素的集合合并。在此过程中要反复用到查询某一个元素归属于那个集合的运算。适合于描述…...
Python中的count()方法
文章目录 Python中的count()方法基本语法在不同数据类型中的使用1. 列表(List)中的count()2. 元组(Tuple)中的count()3. 字符串(String)中的count() 高级用法1. 指定搜索范围2. 统计复杂元素 注意事项 Python中的count()方法 前言:count()是Python中用于序列类型&a…...
通过gird布局实现div的响应式分布排列
目标:实现对于固定宽度的div盒子在页面中自适应排布,并且最后一行的div盒子可以与前面的盒子对齐。 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport" con…...
Edge 浏览器推出 Copilot Vision:免费实时解析屏幕内容;Aqua Voice:极速 AI 语音输入工具丨日报
开发者朋友们大家好 这里是 「RTE 开发者日报」 ,每天和大家一起看新闻、聊八卦。我们的社区编辑团队会整理分享 RTE(Real-Time Engagement) 领域内「有话题的 技术 」、「有亮点的 产品 」、「有思考的 文章 」、「有态度的 观点 」、「有看…...
Linux 防火墙( iptables )
目录 一、 Linux 防火墙基础 1. 防火墙基础概念 (1)防火墙的概述与作用 (2)防火墙的结构与匹配流程 (3)防火墙的类别与各个防火墙的区别 2. iptables 的表、链结构 (1)规则表 …...
Hook插件
hook插件 1.概念 在JavaScript中,hook是一种能够拦截和修改函数或方法行为的技术。通过使用hook,开发者可以在现有的函数执行前、执行后或者替换函数的实现逻辑。hook目的是找到函数入口以及一些参数变化,便于分析js逻辑。 2.hook的作用&a…...
ORA-00600: internal error code, arguments: [kcratr_nab_less_than_odr], [1],
因客户机房断电,2台主机和共享存储全部断电,来电后,集群启动正常,实例无法正常启动,手动启动报错如下 SQL > startup; ORACLE instance started. Total System Global Area 3.9551E10 bytes Fixed Size …...
R4打卡——tensorflow实现火灾预测
🍨 本文为🔗365天深度学习训练营中的学习记录博客 🍖 原作者:K同学啊 1.检查GPU import tensorflow as tf import pandas as pd import numpy as npgpus tf.config.list_physical_devices("GPU") if gpus:…...
基于AI大语言模型的历史文献分析在气候与灾害重建领域中的技术应用
随着人工智能技术的快速发展,大语言模型(如GPT、BERT等)在自然语言处理领域取得了显著进展,特别是在非结构化文本数据的分析方面,极大地拓展了我们的研究视角。这些技术不仅提高了处理和理解文本数据的效率,…...
CSS 字体背景波浪
<!DOCTYPE html> <html lang"zh-CN"><head><meta charset"UTF-8"><title>字体背景波浪</title><style>/* HTML: <div class"loader"></div> *//* HTML: <div class"loader"…...
2025能源网络安全大赛CTF --- Crypto wp
文章目录 前言simpleSigninNumberTheory 前言 大半年以来写的第一篇文章!!! simpleSignin 题目: from Crypto.Util.number import * from gmpy2 import * import osflag bxxx p next_prime(bytes_to_long(os.urandom(128))…...
Redis面试——日志
一、RDB(Redis DataBase) RDB 全程是 Redis DataBase,它是一种将 Redis 在某一时刻内存中的数据以快照形式保存到磁盘的机制 ,相当于给执行save/bgsave命令时刻的内存数据库数据拍了一张快照我们如果通过save命令来执行快照&…...
计算机视觉与深度学习 | 基于YOLOv8与光流法的目标检测与跟踪(Python代码)
===================================================== github:https://github.com/MichaelBeechan CSDN:https://blog.csdn.net/u011344545 ===================================================== 目标检测与跟踪 关键实现逻辑检测-跟踪协作机制特征点选择策略运动…...
nginx-基础知识
目录 相关协议: HTTP协议特点 HTTP协议的原理 HTTP协议的请求方式 HTTP协议的状态码 nginx的功能 nginx缓存 nginx异步非阻塞 nginxI/O多路复用 nginx常用模块以及其功能 相关协议: HTTP协议,超文本传输协议,占用端口80…...
class的访问器成员
class的访问器成员 本质是 class 的语法糖 等价于对象的defineProperty对象里面也能使用 class Product{constructor(count, price){this.count count;this.price price;}get total(){ // 相当于getterreturn this.count * this.price;}}const product new Product(10, 10…...
学习海康VisionMaster之矩形检测
这几天太忙了,好几天没有学习了,今天终于空下来了,继续学习之路吧。 一:进一步学习了 今天学习下VisionMaster中的矩形检测,这个一开始我以为是形态学方面的检测,实际操作下来其实还是边缘直线的衍生应用&…...
【已更新】2025华中杯C题数学建模网络挑战赛思路代码文章教学数学建模思路:就业状态分析与预测
完整内容请看文末最后的推广群 先展示问题一代码和结果、再给出四个问题详细的模型 按性别分析就业与失业状态: employment_status 失业 sex 0 182 1 163 按学历分析就业与失业状态: employment_status 失业 edu_level 0 10 1 172 2 163 按年龄区间分…...
CS144 Lab1实战记录:实现TCP重组器
文章目录 1 实验背景与要求1.1 TCP的数据分片与重组问题1.2 实验具体任务 2 重组器的设计架构2.1 整体架构2.2 数据结构设计 3 重组器处理的关键场景分析3.1 按序到达的子串(直接写入)3.2 乱序到达的子串(需要存储)3.3 与已处理区…...
Linux信号三部曲:产生机制、处理方式与内核接口
Linux系列 文章目录 Linux系列前言一、背景知识铺垫1.1 信号的基本概念1.2 进程对信号的处理 二、信号的产生2.1 前台进程和后台进程2.2 键盘组合键2.3 kill 命令2.4 系统调用2.4.1 signal()接口2.4.2 kill()接口2.4.3 raise()接口2.4.4 abort()接口 总结 前言 Linux中&#x…...
对抗生成进化:基于DNA算法的AIGC检测绕过——让AI创作真正“隐形“
一、技术背景与核心思想 2025年,AIGC检测工具(如Originality.AI 5.0)的识别准确率已达99.3%。本研究提出基于染色体编码的对抗进化框架(CAEF),通过模拟生物进化过程动态优化生成模型,成功将检测…...
探索大语言模型(LLM):马尔可夫链——从诗歌分析到人工智能的数学工具
提出背景与灵感起源 马尔可夫链由俄国数学家安德雷马尔可夫于1906年提出,最初是为了挑战当时概率论中“独立性假设”的局限性。他希望通过研究相依变量序列,证明即使随机变量之间存在依赖关系,大数定律和中心极限定理仍然成立。 灵感来源&am…...
深入解析Java Socket服务器实现:从基础到优雅停机
本文将详细解析一个基于Java Socket实现的服务器程序,涵盖线程池管理、心跳检测、优雅停机等关键特性,并最终提供完整代码实现。 1. 架构概述 这个Socket服务器实现具有以下核心特性: 基于Java原生Socket API实现使用线程池处理客户端连接…...
AI+SWAT模型革命性应用!ArcGIS Pro流域水循环/水生态智能模拟实战;SWAT模型下载 安装 运行 建模流程
⚠️您是否面临: 传统水文模型效率低下? 多源空间数据处理耗时? 复杂生态过程难以量化? 💡当SWAT模型遇见"ArcGIS ProAI": → 传统需要1个月的参数率定缩短至3天 → 多情景分析报告自动生成&a…...
《AI大模型应知应会100篇》第23篇:角色扮演技巧:让AI成为你需要的专家
第23篇:角色扮演技巧:让AI成为你需要的专家 摘要 在当今人工智能快速发展的时代,大模型已经不仅仅是简单的问答工具,它们可以通过角色扮演技巧模拟各类专家身份,从而为用户提供更专业、更有针对性的服务。本文将深入探…...
【17】数据结构之图的遍历篇章
目录标题 图的遍历深度优先遍历 Depth First Search广度优先遍历 Breadth First Search 图的遍历 从图中某一个顶点出发,沿着一些边访遍图中所有的顶点,且使用每个顶点仅被访问一次,这个过程称为图的遍历.Graph Traversal. 其中,…...
【gpt生成-其一】以go语言为例,详细描述一下 :语法规范BNF/EBNF形式化描述
在 Go 语言中通过 EBNF 形式化描述语法规范需要结合语言规范文档的结构,以下是详细实现方法及标准规范示例: 一、Go 语法规范结构(基于 Go 1.21 标准) ebnf 复制 // 基础元素定义 letter "A" ... "Z&quo…...
深度剖析:GPT-3.5与GPT-4的主要区别及架构解析
随着自然语言处理技术的飞速发展,OpenAI推出的各类语言模型备受瞩目。尤其是GPT-3.5和GPT-4这两个版本之间的差异,成为了技术爱好者、研究人员和企业关注的焦点。在这篇文章中,我们将探讨这两个版本的主要区别以及它们的架构特点,…...
协同推荐算法实现的智能商品推荐系统 - [基于springboot +vue]
🛍️ 智能商品推荐系统 - 基于springboot vue 🚀 项目亮点 欢迎来到未来的购物体验!我们的智能商品推荐系统就像您的私人购物顾问,它能读懂您的心思,了解您的喜好,为您精心挑选最适合的商品。想象一下&am…...
【运维学习】lvs + keepalived + 主从dns 项目搭建
需求 主机规划 环境搭建 配置主从dns 主dns 从dns 配置web服务 搭建lvs keepalived 配置master 配置backup 更改dns配置 添加VIP 配置内核参数 更改web配置 添加VIP 配置内核参数 客户端测试 需求 主机规划 主机名IP角色lvs-master192.168.239.105主lvs&#x…...
ESP32-idf学习(二)esp32C3作服务端与电脑蓝牙数据交互
一、当前需求 目前是想利用蓝牙来传输命令,或者一些数据,包括电脑、手机与板子的数据传输,板子与板子之间的数据传输。构思是一个板子是数据接收终端,在电脑或手机下发指令后,再给其他板子相应指令,也需要…...
考道路运输安全员证应具备哪些经验?
考道路运输安全员证,通常没有明确的工作经验年限要求,但具备以下相关经验会对考试有很大帮助: 驾驶经验:报考要求取得相应的机动车驾驶证 1 年以上。有实际驾驶经验,能更好地理解驾驶员的操作规范、疲劳驾驶等问题&…...
ubtuntu安装docker拉取iwebsec镜像
docker安装: --可以在这之前换源(非必要)没有权限直接加sudo sudo apt-get update sudo apt-get upgrade 安装依赖: sudo apt install apt-transport-https ca-certificates curl software-properties-common gnupg lsb-re…...
Using the CubeMX code (一)(GPIO,PWM ,Cube AI,手写数字识别 MNIST,Demo)
该例程对使用CubeMX初始化GPIO做了示范,GPIO使用HAL库进行GPIO编程分为以下几个步骤: 一、例程简述 1. 包含必要的头文件和HAL库的相关头文件 CubeMX初始化会自动包含,对手敲HAL感兴趣的同学可以熟悉下生成的代码框架学习哦~ 2. 初始化GP…...
【第46节】windows程序的其他反调试手段中篇
目录 引言 一、利用SetUnhandledExceptionFilter/Debugger Interrupts 二、Trap Flag 单步标志异常 三、利用SeDebugPrivilege 进程权限 四、利用DebugObject:NtQueryObject() 五、OllyDbg:Guard 六、Software Breakpoint Detection 引言 在程序反调试领域,存…...
【APM】How to enable Trace to Logs on Grafana?
系列文章目录 【APM】Observability Solution 【APM】Build an environment for Traces, Metrics and Logs of App by OpenTelemetry 【APM】NET Traces, Metrics and Logs to OLTP 【APM】How to enable Trace to Logs on Grafana? 前言 本文将介绍如何在Grafana上启用 …...
第十节:性能优化-如何排查组件不必要的重复渲染?
工具:React DevTools Profiler 方法:memo、shouldComponentUpdate深度对比 React 组件性能优化:排查与解决重复渲染问题指南 一、定位性能问题:React DevTools 高级用法 使用 React Developer Tools Profiler 精准定位问题组件&…...
Spring Boot 项目中发布流式接口支持实时数据向客户端推送
1、pom依赖添加 <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-webflux</artifactId></dependency>2、事例代码 package com.pojo.prj.controller;import com.pojo.common.core.utils.String…...
SpringBoot整合Thymeleaf变量渲染全解析:从基础到高阶实践
Thymeleaf作为SpringBoot官方推荐的模板引擎,其核心价值在于将动态数据无缝注入静态HTML模板。本文将从基础语法到复杂场景,深入剖析Thymeleaf对各种类型变量的渲染机制。 一、环境搭建与基础配置 依赖注入 在pom.xml中引入核心依赖:<dependency><groupId>org.s…...
【verilog】Verilog 工程规范编码模板
这一套【Verilog 工程规范编码模板】,适合写清晰、可维护、可综合的 RTL 代码,适用于 FPGA/ASIC 开发: 📘 Verilog 工程级编码规范模板 1️⃣ 模块结构规范 module my_module #(parameter WIDTH 8 // 模块参数 )(input wire c…...
satoken的奇奇怪怪的错误
发了 /user/getBrowseDetail和/user/getResponDetail,但为什么进入handle里面有三次?且第一次的handle类型是AbstractHandleMapping$PreFlightHttpRequestHandlerxxx,这一次进来的时候flag为false,StpUtils.checkLogin抛出了异常 第二次进来的…...
使用prometheus-operator部署prometheus服务,并对外提供访问
先决条件: 已经部署好k8s #这里我使用的版本是1.28.12 [rootprometheus-operator /zpf/prometheus/kube-prometheus/manifests]$kubectl version Client Version: v1.28.12 Kustomize Version: v5.0.4-0.20230601165947-6ce0bf390ce3 Server Version: v1.28.12安装git服务 #安…...
FPGA阵列
FPGA(现场可编程门阵列)阵列是由多个 FPGA 芯片组成的集合,通过特定的架构和互联方式协同工作,以实现强大的计算和处理能力。以下是关于 FPGA 阵列的详细介绍: 基本原理 FPGA 是一种可重构的集成电路,内部…...
Oracle补丁安装工具opatch更新报错处理
今日,在进行Oracle补丁升级更新opatch工具包后,执行opatch命令出现了如下报错: [oracles203116 ~]$ opatch version /u01/product/oracle/12.1.0/db_1/OPatch/opatch: line 839: [: too many arguments /u01/product/oracle/12.1.0/db_1/O…...
前端笔记-html+css测试2
HTML & CSS 能力测试卷 选择题(每题2分,共20分) 下列哪个HTML5标签用于定义文档的导航链接? A) <nav> B) <navigate> C) <navbar> D) <navigation> CSS中哪个属性用于设置元素的透明度?…...
Visual Studio C++ 常用配置变量表
前言 visual studio中常用配置变量表 帮助你快速查阅,复制粘贴嘎嘎方便! 附上美图!! 一、解决方案 & 项目路径 变量含义示例(典型用法)$(SolutionDir)解决方案文件所在目录(末尾带\)$(S…...
论文阅读VACE: All-in-One Video Creation and Editing
code:https://github.com/ali-vilab/VACE 核心 单个模型同时处理多种视频生成和视频编辑任务通过VCU(视频条件单元)进行实现 方法 视频任务 所有的视频相关任务可以分为4类 文本生视频 参考图片生视频 视频生视频 视频mask生视频 VCU …...
【Python Cookbook】迭代器与生成器(一)
迭代器与生成器(一) 1.手动遍历迭代器2.代理迭代3.使用生成器创建新的迭代模式4.实现迭代器协议 1.手动遍历迭代器 你想遍历一个可迭代对象中的所有元素,但是却不想使用 for 循环。 为了手动的遍历可迭代对象,使用 next() 函数并…...
Qwen2.5-VL视觉大语言模型复现过程,没碰到什么坑
视频讲解:Qwen2.5-VL视觉大语言模型复现过程,没碰到什么坑_哔哩哔哩_bilibili Qwen2.5-VL视觉大语言模型复现过程,没碰到什么坑 今天复现下Qwen2.5-VL玩玩 https://github.com/QwenLM/Qwen2.5-VL 创建conda环境,实测22.04&#x…...
LVGL填充函数
lvgl填充函数的位置: static void disp_flush(lv_disp_drv_t * disp_drv, const lv_area_t * area, lv_color_t * color_p) {LCD_Color_Fill(area->x1,area->y1,area->x2,area->y2,(u16*)color_p);lv_disp_flush_ready(disp_drv); }填充函数的具体内容…...
关于 传感器 的详细解析,涵盖定义、分类、工作原理、常见类型、应用领域、技术挑战及未来趋势,结合实例帮助理解其核心概念
以下是关于 传感器 的详细解析,涵盖定义、分类、工作原理、常见类型、应用领域、技术挑战及未来趋势,结合实例帮助理解其核心概念: 一、传感器的定义与核心功能 1. 定义 传感器(Sensor)是一种能够将物理量ÿ…...