【搜索回溯算法】:BFS的魔力--如何使用广度优先搜索找到最短路径
✨感谢您阅读本篇文章,文章内容是个人学习笔记的整理,如果哪里有误的话还请您指正噢✨
✨ 个人主页:余辉zmh–CSDN博客
✨ 文章所属专栏:搜索回溯算法篇–CSDN博客
文章目录
- 一.广度优先搜索(BFS)解决最短路问题
- 1.基本思想
- 2.算法步骤
- 二.例题
- 1.迷宫中离入口最近的出口
- 2.为高尔夫比赛砍树
- 3.最小基因变化
- 4.单词接龙
一.广度优先搜索(BFS)解决最短路问题
1.基本思想
- 广度优先搜索是一种图(或树)的遍历算法。在解决边权相等的最短问题时,他从起始节点开始,逐层的向外扩展搜索。
- 因为边权相等,所以先被搜索到的节点一定是通过最少的边到达的。
2.算法步骤
- 初始化
- 将起始节点标记为已访问,并将其加入到队列中。
- 记录起始节点到自身的距离为0。
- 搜索过程
- 取出队列头部节点
- 遍历该节点所有未访问的相邻节点
- 对于相邻节点,标记为已访问,并将其加入到队列中,然后距离加一。
- 重复上述操作,直到队列为空,或者找到目标节点。
二.例题
1.迷宫中离入口最近的出口
题目:
算法原理:
广度搜索,最短路的经典例题,给定迷宫中的起始位置,找到距离出口的最近距离,也就是离开迷宫的最短路径长度。
本道题就是棋盘格式,在二维数组中搜索,所以每一个位置都有上下左右四个方向可以搜索,但是不能越界,具体的搜索方式和上面图中的样例相同。
代码实现:
//重命名
typedef pair<int, int> PII;
//两个数组用来四个方向搜索
int dx[4] = {0, 0, 1, -1};
int dy[4] = {1, -1, 0, 0};int nearestExit(vector<vector<char>>& maze, vector<int>& entrance){//获取行数和列数int m = maze.size(), n = maze[0].size();//创建一个布尔类型的二维数组vector<vector<bool>> check(m, vector<bool>(n));//创建一个队列,存放的是数组的下标queue<PII> q;//将起始位置入队,并标记为已遍历q.push({entrance[0], entrance[1]});check[entrance[0]][entrance[1]] = true;int step = 0;while(!q.empty()){//每一次外层循环,表示向外扩展一层,层数就是步数,所以步数加一step++;//获取当前层有多少个下标,依次出队int sz = q.size();while(sz--){auto [a,b]=q.front();q.pop();//遍历当前位置的四个方向for (int k = 0; k < 4; k++){int x = a + dx[k], y = b + dy[k];if(x>=0&&x<m&&y>=0&y<n&&maze[x][y]=='.'&&check[x][y]==false){//如果符合入队条件并且是出口时,直接返回当前步数if(x==0||x==m-1||y==0||y==n-1){return step;}//如果符合入队条件但不是出口时,入队并标记为已遍历else{q.push({x, y});check[x][y] = true;}}}}}//如果循环结束也没找到出口,说明不存在出口return -1;
}
2.为高尔夫比赛砍树
题目:
!
算法原理:
因为力扣官方给的示例不是很好,没有完整的描述题目中的规则,所以这里没有展示官方示例,在下面图片中,我会先写一个示例来讲解本道题的题意,然后再写算法原理。本道题可以理解为上面的那道题的扩展,不再局限于一个起始位置和终点位置搜索
以图中的为例,既然要找到砍树所有树的最少步数,而砍树的顺序是固定的,所以只能限制每一次移动到下一个树时,必须是最短的路径,这不就转换成迷宫问题吗,以上面的砍树顺序为例,先从1到2,最短路径就是1->8->2,最少步数是2,再从2到4,最短路径就是2->8->4或者2->10->4,最少步数就是2,依次类推,将每一次的最少步数累加到一起,就是整个的最少步数。如果出现某个位置到某个位置不能到达时,比如有障碍不能通过,直接返回-1,因为出现某个树不能被砍掉,即使前面的步数再少,也不能砍完所有的树。
代码实现:
//重命名
typedef pair<int, int> PII;
//两个数组用来四个方向搜索
int dx[4] = {0, 0, 1, -1};
int dy[4] = {1, -1, 0, 0};
int m = 0;
int n = 0;int bfs(vector<vector<int>>& forest,int bx,int by,int ex,int ey){//如果起始位置就等于终点位置返回0if(bx==ex&&by==ey){return 0;}//初始化布尔类型的二维数组,用来标记已遍历的位置vector<vector<bool>> check(m, vector<bool>(n));//创建一个队列,将起始位置入队queue<PII> q;q.push({bx, by});check[bx][by] = true;int ret = 0;while(!q.empty()){ret++;int sz = q.size();while(sz--){//先获取队头元素auto [i, j] = q.front();q.pop();for (int k = 0; k < 4; k++){int x = i + dx[k], y = j + dy[k];if(x>=0&&x<m&&y>=0&&y<n&&forest[x][y]!=0&&check[x][y]==false){if(x==ex&&y==ey){return ret;}else{q.push({x, y});check[x][y] = true;}}}}}return -1;
}
int cutOffTree(vector<vector<int>>& forest){//获取行数和列数m = forest.size();n = forest[0].size();//新建立一个数组,用来存放每个位置的下标vector<PII> trees;//遍历整个原始数组,将大于等于1的位置存放到新数组中for (int i = 0; i < m; i++){for (int j = 0; j < n; j++){if(forest[i][j]>1){trees.push_back({i, j});}}}//按照原数组位置对应的值进行从小到大排序//使用Lambda表达式自定义排序规则,[&]是捕获列表,可以访问forest变量,()内是参数列表,{}内是函数体定义比较规则sort(trees.begin(), trees.end(), [&](const PII &p1, const PII &p2){return forest[p1.first][p1.second] < forest[p2.first][p2.second]; });int bx = 0, by = 0;int ret = 0;for(auto& [a,b] : trees){//根据起始位置和终点位置找到最短步数int step = bfs(forest, bx, by, a, b);//如果返回的最短步数是-1,说明无法从当前起始位置到终点位置,直接输出-1if(step==-1){return -1;}//如果返回的不是-1,说明找到最短步数,累加ret += step;//将当前的终点位置作为下一个的起始位置bx = a, by = b;}return ret;
}
3.最小基因变化
题目:
算法原理:
本道题刚开始看可能觉得没有什么思路,但这也是最短路最经典的一个例题,虽然不是棋盘格式的搜索,但是根据题意我们可以自己写出搜索展开图,画出搜索展开图后就能明白为什么是最短路问题以及为什么可以用广度搜索来解。
本道题有两个细节要处理,一个是如何判断变化后的基因是否重复出现,一个是变化后的基因是否存在与基因库中;
因为基因序列是用字符串的形式表示,所以对于这两个细节的处理都可以借助哈希表来实现。
一个哈希表check用来存放每次变化后的基因,如果存放前发现哈希表中已经存在该变化后的基因,说明重复出现,不再添加到哈希表中。
另一个哈希表hash用来存放基因库中的基因序列,先遍历整个基因库,将所有基因序列存放到哈希表中,题中要求变化后的基因必须存在于基因库中才是有效的基因序列,所以变化后的基因在存放到另一个哈希表前,先判断是否存在基因库中,如果不存在该基因库中就不再添加,存在就继续存放,同时要判断是否重复出现。
搜索的实现方式还是和上面的格式一样,借助队列来实现,循环逐层搜索,直到找到目标基因序列。
代码实现:
int minMutation(string startGene, string endGene, vector<string>& bank){//建立两个哈希表,一个用来存放变化后的基因,防止相同的基因重复查找//一个用来存放基因库中的基因unordered_set<string> check;unordered_set<string> hash(bank.begin(), bank.end());//判断特殊情况,变化前基因等于变化后要查找的基因,直接返回0次if(startGene==endGene){return 0;}//如果变化后要查找的基因不在基因库中,直接返回-1if(hash.count(endGene)==0){return -1;}//建立一个队列,将变化前的基因入队,并存放到检查哈希表中queue<string> q;q.push(startGene);check.insert(startGene);string change = "ACGT";int ret = 0;while(!q.empty()){//每循环一次,相当与向外扩展一层,变化次数加一ret++;int sz = q.size();while(sz--){string t=q.front();q.pop();//i循环表示一个基因8个位置的变化,j循环表示一个位置有4种情况变化for (int i = 0; i < 8; i++){//这里内层每次循环要拷贝一下原字符串,在拷贝的基础上变化,防止原字符串变化string tmp = t;for (int j = 0; j < 4; j++){tmp[i] = change[j];//变化后的字符串要存在基因库中才能存放到检查哈希表中,并且不能重复存放if(hash.count(tmp)!=0&&check.count(tmp)==0){//如果满足上面两个条件并且就是结束字符串,直接返回当前变化次数if(tmp==endGene){return ret;}//如果不是结束字符串,入队,并且存放到检查哈希表中else{q.push(tmp);check.insert(tmp);}}}}}}//循环结束后还没有返回,说明没有找到结束字符串,返回-1return -1;
}
4.单词接龙
题目:
算法原理:
本道题可以说和上面的那道题最小基因变化一模一样,连代码过程几乎都是一样的,唯一有点不同的就是,上面那道题中一个位置只有四个字符可以变化,而本道题中一个位置有26个字符可以变化,所以在循环时对这点的处理不同,其他地方都是一模一样,所以上面那道题理解之后,本道题就会变得非常简单。
代码实现:
int ladderLength(string beginWord, string endWord, vector<string>& wordList){//和上一道题基因变化一样unordered_set<string> check;unordered_set<string> hash(wordList.begin(), wordList.end());if(beginWord==endWord){return 2;}if(hash.count(endWord)==0){return 0;}queue<string> q;q.push(beginWord);check.insert(beginWord);int ret = 1;while(!q.empty()){ret++;int sz = q.size();while(sz--){string t=q.front();q.pop();for (int i = 0; i < t.size(); i++){string tmp = t;for (char ch = 'a'; ch <= 'z'; ch++){tmp[i] = ch;if(hash.count(tmp)!=0&&check.count(tmp)==0){if(tmp==endWord){return ret;}else{q.push(tmp);check.insert(tmp);}}}}}}return 0;
}
以上就是关于使用广度优先搜索解决最短路问题的讲解,如果哪里有错的话,可以在评论区指正,也欢迎大家一起讨论学习,如果对你的学习有帮助的话,点点赞关注支持一下吧!!!
相关文章:
【搜索回溯算法】:BFS的魔力--如何使用广度优先搜索找到最短路径
✨感谢您阅读本篇文章,文章内容是个人学习笔记的整理,如果哪里有误的话还请您指正噢✨ ✨ 个人主页:余辉zmh–CSDN博客 ✨ 文章所属专栏:搜索回溯算法篇–CSDN博客 文章目录 一.广度优先搜索(BFS)解决最短路…...
JavaSE第十一天——集合框架Collection
一、List接口 List接口是一个有序的集合,允许元素有重复,它继承了Collection接口,提供了许多额外的功能,比如基于索引的插入、删除和访问元素等。 常见的List接口的实现类有ArrayList、LinkedList和Vector。 List接口的实现类 …...
Three城市引擎地图插件Geo-3d
一、简介 基于Three开发,为Three 3D场景提供GIS能力和城市底座渲染能力。支持Web墨卡托、WGS84、GCJ02等坐标系,支持坐标转换,支持影像、地形、geojson建筑、道路,植被等渲染。支持自定义主题。 二、效果 三、代码 //插件初始化…...
深度学习|表示学习|卷积神经网络|详细推导每一层的维度变化|14
如是我闻: 一个经典的卷积神经网络(CNN)架构,呈现的是输入图像通过多个卷积层、池化层以及全连接层,最终输出分类结果的过程。整个过程的核心是理解输入特征图的尺寸如何在每一层发生变化,我们可以通过卷积…...
多级缓存(亿级并发解决方案)
多级缓存(亿级流量(并发)的缓存方案) 传统缓存的问题 传统缓存是请求到达tomcat后,先查询redis,如果未命中则查询数据库,问题如下: (1)请求要经过tomcat处…...
BOM对象location与数组操作结合——查询串提取案例
BOM对象location与数组操作结合——查询串提取案例 前置知识 1. Location 对象 Location 对象是 JavaScript 提供的内置对象之一,它表示当前窗口或框架的 URL,并允许你通过它操作或获取 URL 的信息。可以通过 window.location 访问。 主要属性&#…...
读书笔记--分布式服务架构对比及优势
本篇是在上一篇的基础上,主要对共享服务平台建设所依赖的分布式服务架构进行学习,主要记录和思考如下,供大家学习参考。随着企业各业务数字化转型工作的推进,之前在传统的单一系统(或单体应用)模式中&#…...
GOGOGO 枚举
含义:一种类似于类的一种结构 作用:是Java提供的一个数据类型,可以设置值是固定的 【当某一个数据类型受自身限制的时候,使用枚举】 语法格式: public enum 枚举名{…… }有哪些成员? A、对象 public …...
【Linux】Linux基础开发工具
1 Linux 软件包管理器 yum 1.1软件包 在Linux下安装软件, 一个通常的办法是下载到程序的源代码, 并进行编译, 得到可执行程序. 但是这样太麻烦了, 于是有些人把一些常用的软件提前编译好, 做成软件包(可以理解成windows上的安装程序)放在一个服务器上,通过包管理器可以很方便的…...
嵌入式C语言:结构体的多态性之结构体中的void*万能指针
目录 一、void*指针在结构体中的应用 二、实现方式 2.1. 定义通用结构体 2.2. 定义具体结构体 2.3. 初始化和使用 三、应用场景 3.1. 内存管理函数 3.2. 泛型数据结构(链表) 3.3. 回调函数和函数指针 3.4. 跨语言调用或API接口(模拟…...
重构进行时:一秒告别 !=null 判空
重构进行时:一秒告别 !null 判空 空指针异常(NullPointerException)是Java开发中常见的错误之一。 许多开发者在遇到空指针问题时,往往会习惯性地使用! null来进行判断。 然而,当代码中频繁出现这种判断时ÿ…...
React 中hooks之useSyncExternalStore使用总结
1. 基本概念 useSyncExternalStore 是 React 18 引入的一个 Hook,用于订阅外部数据源,确保在并发渲染下数据的一致性。它主要用于: 订阅浏览器 API(如 window.width)订阅第三方状态管理库订阅任何外部数据源 1.1 基…...
Semaphore 与 线程池 Executor 有什么区别?
前言:笔者在看Semaphone时 突然脑子宕机,啥啥分不清 Semaphore 和 Executor 的作用,故再次记录。 一、什么是Semaphore? Semaphore 是 Java 并发编程(JUC)中一个重要的同步工具,它的作用是 控…...
Rust:高性能与安全并行的编程语言
引言 在现代编程世界里,开发者面临的最大挑战之一就是如何平衡性能与安全性。在许多情况下,C/C这样的系统级编程语言虽然性能强大,但其内存管理的复杂性导致了各种安全漏洞。为了解决这些问题,Rust 作为一种新的系统级编程语言进入…...
论文笔记(六十三)Understanding Diffusion Models: A Unified Perspective(六)(完结)
Understanding Diffusion Models: A Unified Perspective(六)(完结) 文章概括指导(Guidance)分类器指导无分类器引导(Classifier-Free Guidance) 总结 文章概括 引用: …...
Redis --- 分布式锁的使用
我们在上篇博客高并发处理 --- 超卖问题一人一单解决方案讲述了两种锁解决业务的使用方法,但是这样不能让锁跨JVM也就是跨进程去使用,只能适用在单体项目中如下图: 为了解决这种场景,我们就需要用一个锁监视器对全部集群进行监视…...
电脑怎么格式化?格式化详细步骤
格式化是我们在日常使用电脑时可能会用到的一种操作,无论是清理磁盘空间、安装新系统,还是解决磁盘读写错误,都可能需要格式化。不过,对于一些不熟悉电脑操作的用户来说,格式化听起来可能有些复杂。其实,只…...
TikTok广告投放优化策略:提升ROI的核心技巧
在短许多品牌和商家纷纷投入广告营销,争夺这片潜力巨大的市场。然而,在激烈的竞争环境中,如何精准有效地投放广告,优化广告效果,实现更高的投资回报率(ROI)成为了广告主关注的核心。 一. 精准受…...
视觉语言模型 (VLMs):跨模态智能的探索
文章目录 一. VLMs 的重要性与挑战:连接视觉与语言的桥梁 🌉二. VLMs 的核心训练范式:四种主流策略 🗺️1. 对比训练 (Contrastive Training):拉近正例,推远负例 ⚖️2. 掩码方法 (Masking):重构…...
第05章 08 绘制脑部体绘制图的阈值等值面
绘制脑部体绘制图的阈值等值面,例如肌肉和头骨骼,需要对医学图像数据进行阈值处理,并使用体绘制技术来可视化这些结构。以下是一个基于VTK/C的示例代码,展示如何读取DICOM图像数据,应用阈值过滤器来提取特定组织&#…...
类和对象(4)——多态:方法重写与动态绑定、向上转型和向下转型、多态的实现条件
目录 1. 向上转型和向下转型 1.1 向上转型 1.2 向下转型 1.3 instanceof关键字 2. 重写(overidde) 2.1 方法重写的规则 2.1.1 基础规则 2.1.2 深层规则 2.2 三种不能重写的方法 final修饰 private修饰 static修饰 3. 动态绑定 3.1 动态绑…...
动态规划<九>两个数组的dp
目录 引例 LeetCode经典OJ题 1.第一题 2.第二题 3.第三题 4.第四题 5.第五题 6.第六题 7.第七题 引例 OJ传送门LeetCode<1143>最长公共子序列 画图分析: 使用动态规划解决 1.状态表示 ------经验题目要求 经验为选取第一个字符串的[0,i]区间以及第二个字…...
Go:基于Go实现一个压测工具
文章目录 写在前面整体架构通用数据处理模块Http请求响应数据处理Curl参数解析处理 客户端模块Http客户端处理Grpc客户端处理Websocket客户端处理 连接处理模块GrpcHttp 统计数据模块统计原理实现过程 写在前面 本篇主要是基于Go来实现一个压测的工具,关于压测的内…...
2025年数学建模美赛 A题分析(2)楼梯使用频率数学模型
2025年数学建模美赛 A题分析(1)Testing Time: The Constant Wear On Stairs 2025年数学建模美赛 A题分析(2)楼梯磨损分析模型 2025年数学建模美赛 A题分析(3)楼梯使用方向偏好模型 2025年数学建模美赛 A题分…...
在Ubuntu上用Llama Factory命令行微调Qwen2.5的简单过程
半年多之前写过一个教程:在Windows上用Llama Factory微调Llama 3的基本操作_llama-factory windows-CSDN博客 如果用命令行做的话,前面的步骤可以参考上面这个博客。安装好环境后, 用自我认知数据集微调Lora模块:data/identity.j…...
虹科分享 | 汽车NVH小课堂之听音辨故障
随着车主开始关注汽车抖动异响问题,如何根据故障现象快速诊断异响来源,成了汽修人的必修课。 一个比较常用的方法就是靠“听”——“听音辨故障”。那今天,虹科Pico也整理了几个不同类型的异响声音,一起来听听看你能答对几个吧 汽…...
RoboVLM——通用机器人策略的VLA设计哲学:如何选择骨干网络、如何构建VLA架构、何时添加跨本体数据
前言 本博客内解读不少VLA模型了,包括π0等,且如此文的开头所说 前两天又重点看了下openvla,和cogact,发现 目前cogACT把openvla的动作预测换成了dit,在模型架构层面上,逼近了π0那为了进一步逼近&#…...
【SpringBoot教程】Spring Boot + MySQL + HikariCP 连接池整合教程
🙋大家好!我是毛毛张! 🌈个人首页: 神马都会亿点点的毛毛张 在前面一篇文章中毛毛张介绍了SpringBoot中数据源与数据库连接池相关概念,今天毛毛张要分享的是关于SpringBoot整合HicariCP连接池相关知识点以及底层源码…...
0.91英寸OLED显示屏一种具有小尺寸、高分辨率、低功耗特性的显示器件
0.91英寸OLED显示屏是一种具有小尺寸、高分辨率、低功耗特性的显示器件。以下是对0.91英寸OLED显示屏的详细介绍: 一、基本参数 尺寸:0.91英寸分辨率:通常为128x32像素,意味着显示屏上有128列和32行的像素点,总共409…...
【insert函数】
在 C 中,std::string::insert 是一个功能强大的成员函数,用于在字符串的指定位置插入内容。它有多个重载版本,支持插入 字符、字符串、子字符串 等。以下是 insert 所有相关函数的详细介绍: 1. 插入字符串 函数签名: …...
Python 如何进行文本匹配:difflib| python 小知识
Python 如何进行文本匹配:difflib| python 小知识 difflib是Python标准库中的一个工具,用于比较和处理文本差异。它提供了一组用于比较和处理文本差异的功能,可以用于比较字符串、文件等。本文将详细介绍difflib模块的用法和实现细节&#x…...
MySQL误删数据怎么办?
文章目录 1. 从备份恢复数据2. 通过二进制日志恢复数据3. 使用数据恢复工具4. 利用事务回滚恢复数据5. 预防误删数据的策略总结 在使用MySQL进行数据管理时,误删数据是一个常见且具有高风险的操作。无论是因为操作失误、系统故障,还是不小心执行了删除命…...
可以称之为“yyds”的物联网开源框架有哪几个?
有了物联网的发展,我们的生活似乎也变得更加“鲜活”、有趣、便捷,包具有科技感的。在物联网(IoT)领域中,也有许多优秀的开源框架支持设备连接、数据处理、云服务等,成为被用户们广泛认可的存在。以下给大家…...
为AI聊天工具添加一个知识系统 之74 详细设计之15 正则表达式 之2
本文要点 要点 本项目(为AI聊天工具添加一个知识系统)中的正则表达式。 正则表达式的三“比”。正则表达式被 一、排比为三种符号(元符号-圈号,特殊符号-引号,普通符号-括号) 引号<<a线性回归bo…...
Java 注解与元数据
Java学习资料 Java学习资料 Java学习资料 一、引言 在 Java 编程中,注解(Annotation)和元数据(Metadata)是两个重要的概念。注解为程序提供了一种在代码中嵌入额外信息的方式,这些额外信息就是元数据。元…...
【橘子Kibana】Kibana的分析能力Analytics简易分析
一、kibana是啥,能干嘛 我们经常会用es来实现一些关于检索,关于分析的业务。但是es本身并没有UI,我们只能通过调用api来完成一些能力。而kibana就是他的一个外置UI,你完全可以这么理解。 当我们进入kibana的主页的时候你可以看到这样的布局。…...
度小满前端面试题及参考答案
<form>标签使用过哪些 tag? <form>标签中常使用的标签有很多。 <input>:这是最常用的标签之一,用于创建各种类型的输入字段,如文本框、密码框、单选按钮、复选框、文件上传框等。通过设置type属性来指定输入类型,例如type="text"创建文本输入…...
Padas进行MongoDB数据库CRUD
在数据处理的领域,MongoDB作为一款NoSQL数据库,以其灵活的文档存储结构和高扩展性广泛应用于大规模数据处理场景。Pandas作为Python的核心数据处理库,能够高效处理结构化数据。在MongoDB中,数据以JSON格式存储,这与Pandas的DataFrame结构可以很方便地互相转换。通过这篇教…...
LQ1052 Fibonacci斐波那契数列
题目描述 Fibonacci斐波那契数列也称为兔子数列,它的递推公式为:FnFn-1Fn-2,其中F1F21。 当n比较大时,Fn也非常大,现在小蓝想知道,Fn除以10007的余数是多少,请你编程告诉她。 输入 输入包含一…...
华硕笔记本装win10哪个版本好用分析_华硕笔记本装win10专业版图文教程
华硕笔记本装win10哪个版本好用?华硕笔记本还是建议安装win10专业版。Win分为多个版本,其中家庭版(Home)和专业版(Pro)是用户选择最多的两个版本。win10专业版在功能以及安全性方面有着明显的优势ÿ…...
编译器gcc/g++ --【Linux基础开发工具】
文章目录 一、背景知识二、gcc编译选项1、预处理(进行宏替换)2、编译(生成汇编)3、汇编(生成机器可识别代码)4、链接(生成可执行文件或库文件) 三、动态链接和静态链接四、静态库和动态库1、动静态库2、编译…...
八股文 (一)
文章目录 项目地址一、前端1.1 大文件上传,预览1.2 首页性能优化1.2 流量染色,灰度发布1.3 Websock心跳机制,大数据实时数据优化1.4 Gpu 加速 fps优化1.5 echarts包大小优化和组件封装1.6 前端监控系统1.7 超大虚拟列表卡顿1. 实现2. 相关问题(1) 什么是虚拟化列表,为什么要…...
c语言无符号的变量不能和有符号的直接比较,或者使用移项解决符号问题
使用移项解决问题,简单来说就是无符号运行不要有减号,使用移项后的加号代替 if(uEventDirLimitSize > uEventAndNormalDirSize) {if((uEventDirLimitSize - uEventAndNormalDirSize) > pStConfig->stParam.stUserParam.uEventRemain){return O…...
安卓日常问题杂谈(一)
背景 关于安卓开发中,有很多奇奇怪怪的问题,有时候这个控件闪一下,有时候这个页面移动一下,这些对于快速开发中,去查询,都是很耗费时间的,因此,本系列文章,旨在记录安卓…...
电力晶体管(GTR)全控性器件
电力晶体管(Giant Transistor,GTR)是一种全控性器件,以下是关于它的详细介绍:(模电普通晶体管三极管进行对比学习) 基本概念 GTR是一种耐高电压、大电流的双极结型晶体管(BJT&am…...
【美】Day 1 CPT申请步骤及信息获取指南(Day1 CPT)
参考文章:【美】境外申请Day 1 CPT完整流程(境外Day 1 CPT) 文章目录 **一、申请前准备:了解Day 1 CPT基本要求****二、选择Day 1 CPT学校****1. 搜索学校****2. 筛选标准** **三、申请流程****1. 提交学校申请****2. 转SEVIS记录…...
梯度下降优化算法-动量法
1. 动量法的数学原理 1.1 标准梯度下降回顾 在标准梯度下降中,参数的更新公式为: θ t 1 θ t − η ⋅ ∇ θ J ( θ t ) \theta_{t1} \theta_t - \eta \cdot \nabla_\theta J(\theta_t) θt1θt−η⋅∇θJ(θt) 其中: θ t …...
游戏引擎介绍:Game Engine
简介 定义:软件框架,一系列为开发游戏的工具的集合 可协作创意生产工具,复杂性艺术,注重realtime实时 目的 为艺术家,设计师,程序员设计工具链 游戏引擎开发参考书 推荐:Game Engine Archite…...
zookeeper-3.8.3-基于ACL的访问控制
ZooKeeper基于ACL的访问控制 ZooKeeper 用ACL控制对znode的访问,类似UNIX文件权限,但无znode所有者概念,ACL指定ID及对应权限,且仅作用于特定znode,不递归。 ZooKeeper支持可插拔认证方案,ID格式为scheme…...
ResNeSt: Split-Attention Networks 参考论文
参考文献 [1] Tensorflow Efficientnet. https://github.com/tensorflow/tpu/tree/master/models/official/efficientnet. Accessed: 2020-03-04. 中文翻译:[1] TensorFlow EfficientNet. https://github.com/tensorflow/tpu/tree/master/models/official/efficien…...