广度/宽度优先搜索(BFS)

2023-10-30

转自:https://blog.csdn.net/raphealguo/article/details/7523411

1.前言

广度优先搜索(也称宽度优先搜索,缩写BFS,以下采用广度来描述)是连通图的一种遍历策略。因为它的思想是从一个顶点V0开始,辐射状地优先遍历其周围较广的区域,故得名。 

一般可以用它做什么呢?一个最直观经典的例子就是走迷宫,我们从起点开始,找出到终点的最短路程,很多最短路径算法就是基于广度优先的思想成立的。

算法导论里边会给出不少严格的证明,我想尽量写得通俗一点,因此采用一些直观的讲法来伪装成证明,关键的point能够帮你get到就好。

2.图的概念

刚刚说的广度优先搜索是连通图的一种遍历策略,那就有必要将图先简单解释一下。

 

图2-1 连通图示例图

如图2-1所示,这就是我们所说的连通图,这里展示的是一个无向图,连通即每2个点都有至少一条路径相连,例如V0到V4的路径就是V0->V1->V4。

一般我们把顶点用V缩写,把边用E缩写。

3.广度优先搜索


3.1.算法的基本思路

常常我们有这样一个问题,从一个起点开始要到一个终点,我们要找寻一条最短的路径,从图2-1举例,如果我们要求V0到V6的一条最短路(假设走一个节点按一步来算)【注意:此处你可以选择不看这段文字直接看图3-1】,我们明显看出这条路径就是V0->V2->V6,而不是V0->V3->V5->V6。先想想你自己刚刚是怎么找到这条路径的:首先看跟V0直接连接的节点V1、V2、V3,发现没有V6,进而再看刚刚V1、V2、V3的直接连接节点分别是:{V0、V4}、{V0、V1、V6}、{V0、V1、V5}(这里画删除线的意思是那些顶点在我们刚刚的搜索过程中已经找过了,我们不需要重新回头再看他们了)。这时候我们从V2的连通节点集中找到了V6,那说明我们找到了这条V0到V6的最短路径:V0->V2->V6,虽然你再进一步搜索V5的连接节点集合后会找到另一条路径V0->V3->V5->V6,但显然他不是最短路径。

你会看到这里有点像辐射形状的搜索方式,从一个节点,向其旁边节点传递病毒,就这样一层一层的传递辐射下去,知道目标节点被辐射中了,此时就已经找到了从起点到终点的路径。

我们采用示例图来说明这个过程,在搜索的过程中,初始所有节点是白色(代表了所有点都还没开始搜索),把起点V0标志成灰色(表示即将辐射V0),下一步搜索的时候,我们把所有的灰色节点访问一次,然后将其变成黑色(表示已经被辐射过了),进而再将他们所能到达的节点标志成灰色(因为那些节点是下一步搜索的目标点了),但是这里有个判断,就像刚刚的例子,当访问到V1节点的时候,它的下一个节点应该是V0和V4,但是V0已经在前面被染成黑色了,所以不会将它染灰色。这样持续下去,直到目标节点V6被染灰色,说明了下一步就到终点了,没必要再搜索(染色)其他节点了,此时可以结束搜索了,整个搜索就结束了。然后根据搜索过程,反过来把最短路径找出来,图3-1中把最终路径上的节点标志成绿色。

整个过程的实例图如图3-1所示。

初始全部都是白色(未访问)

即将搜索起点V0(灰色)

已搜索V0,即将搜索V1、V2、V3

……终点V6被染灰色,终止

找到最短路径

图3-1 寻找V0到V6的过程

3.2.广度优先搜索流程图

 

图3-2 广度优先搜索的流程图

在写具体代码之前有必要先举个实例,详见第4节。

4.实例

第一节就讲过广度优先搜索适用于迷宫类问题,这里先给出POJ3984《迷宫问题》。

 

《迷宫问题》

定义一个二维数组: 
int maze[5][5] = {
    0, 1, 0, 0, 0,
    0, 1, 0, 1, 0,
    0, 0, 0, 0, 0,
    0, 1, 1, 1, 0,
    0, 0, 0, 1, 0,
};
它表示一个迷宫,其中的1表示墙壁,0表示可以走的路,只能横着走或竖着走,不能斜着走,要求编程序找出从左上角到右下角的最短路线。 

 

题目保证了输入是一定有解的。

也许你会问,这个跟广度优先搜索的图怎么对应起来?BFS的第一步就是要识别图的节点跟边!

4.1.识别出节点跟边

节点就是某种状态,边就是节点与节点间的某种规则。

对应于《迷宫问题》,你可以这么认为,节点就是迷宫路上的每一个格子(非墙),走迷宫的时候,格子间的关系是什么呢?按照题目意思,我们只能横竖走,因此我们可以这样看,格子与它横竖方向上的格子是有连通关系的,只要这个格子跟另一个格子是连通的,那么两个格子节点间就有一条边。

如果说本题再修改成斜方向也可以走的话,那么就是格子跟周围8个格子都可以连通,于是一个节点就会有8条边(除了边界的节点)。

4.2.解题思路

对应于题目的输入数组:

0, 1, 0, 0, 0,
    0, 1, 0, 1, 0,
    0, 0, 0, 0, 0,
    0, 1, 1, 1, 0,
    0, 0, 0, 1, 0,

我们把节点定义为(x,y),(x,y)表示数组maze的项maze[x][y]。

于是起点就是(0,0),终点是(4,4)。按照刚刚的思路,我们大概手工梳理一遍:

初始条件:

起点Vs为(0,0)

终点Vd为(4,4)

灰色节点集合Q={}

初始化所有节点为白色节点

开始我们的广度搜索!

手工执行步骤【PS:你可以直接看图4-1】:

1.起始节点Vs变成灰色,加入队列Q,Q={(0,0)}

2.取出队列Q的头一个节点Vn,Vn={0,0},Q={}

3.把Vn={0,0}染成黑色,取出Vn所有相邻的白色节点{(1,0)}

4.不包含终点(4,4),染成灰色,加入队列Q,Q={(1,0)}

5.取出队列Q的头一个节点Vn,Vn={1,0},Q={}

6.把Vn={1,0}染成黑色,取出Vn所有相邻的白色节点{(2,0)}

7.不包含终点(4,4),染成灰色,加入队列Q,Q={(2,0)}

8.取出队列Q的头一个节点Vn,Vn={2,0},Q={}

9.把Vn={2,0}染成黑色,取出Vn所有相邻的白色节点{(2,1), (3,0)}

10.不包含终点(4,4),染成灰色,加入队列Q,Q={(2,1), (3,0)}

11.取出队列Q的头一个节点Vn,Vn={2,1},Q={(3,0)}

12. 把Vn={2,1}染成黑色,取出Vn所有相邻的白色节点{(2,2)}

13.不包含终点(4,4),染成灰色,加入队列Q,Q={(3,0), (2,2)}

14.持续下去,知道Vn的所有相邻的白色节点中包含了(4,4)……

15.此时获得了答案

 

起始你很容易模仿上边过程走到终点,那为什么它就是最短的呢?

怎么保证呢?

我们来看看广度搜索的过程中节点的顺序情况:

 

图4-1 迷宫问题的搜索树

你是否观察到了,广度搜索的顺序是什么样子的?

图中标号即为我们搜索过程中的顺序,我们观察到,这个搜索顺序是按照上图的层次关系来的,例如节点(0,0)在第1层,节点(1,0)在第2层,节点(2,0)在第3层,节点(2,1)和节点(3,0)在第3层。

我们的搜索顺序就是第一层->第二层->第三层->第N层这样子。

我们假设终点在第N层,因此我们搜索到的路径长度肯定是N,而且这个N一定是所求最短的。

我们用简单的反证法来证明:假设终点在第N层上边出现过,例如第M层,M<N,那么我们在搜索的过程中,肯定是先搜索到第M层的,此时搜索到第M层的时候发现终点出现过了,那么最短路径应该是M,而不是N了。

所以根据广度优先搜索的话,搜索到终点时,该路径一定是最短的。

4.3.代码

我给出以下代码用于解决上述题目(仅仅只是核心代码):

 

 
  1. /**

  2. * 广度优先搜索

  3. * @param Vs 起点

  4. * @param Vd 终点

  5. */

  6. bool BFS(Node& Vs, Node& Vd){

  7. queue<Node> Q;

  8. Node Vn, Vw;

  9. int i;

  10.  
  11. //用于标记颜色当visit[i][j]==true时,说明节点访问过,也就是黑色

  12. bool visit[MAXL][MAXL];

  13.  
  14. //四个方向

  15. int dir[][2] = {

  16. {0, 1}, {1, 0},

  17. {0, -1}, {-1, 0}

  18. };

  19.  
  20. //初始状态将起点放进队列Q

  21. Q.push(Vs);

  22. visit[Vs.x][Vs.y] = true;//设置节点已经访问过了!

  23.  
  24. while (!Q.empty()){//队列不为空,继续搜索!

  25. //取出队列的头Vn

  26. Vn = Q.front();

  27. Q.pop();

  28.  
  29. for(i = 0; i < 4; ++i){

  30. Vw = Node(Vn.x+dir[i][0], Vn.y+dir[i][1]);//计算相邻节点

  31.  
  32. if (Vw == Vd){//找到终点了!

  33. //把路径记录,这里没给出解法

  34. return true;//返回

  35. }

  36.  
  37. if (isValid(Vw) && !visit[Vw.x][Vw.y]){

  38. //Vw是一个合法的节点并且为白色节点

  39. Q.push(Vw);//加入队列Q

  40. visit[Vw.x][Vw.y] = true;//设置节点颜色

  41. }

  42. }

  43. }

  44. return false;//无解

  45. }


 

 

5.核心代码

为了方便适用于大多数的题解,抽取核心代码如下:

 

 
  1. /**

  2. * 广度优先搜索

  3. * @param Vs 起点

  4. * @param Vd 终点

  5. */

  6. bool BFS(Node& Vs, Node& Vd){

  7. queue<Node> Q;

  8. Node Vn, Vw;

  9. int i;

  10.  
  11. //初始状态将起点放进队列Q

  12. Q.push(Vs);

  13. hash(Vw) = true;//设置节点已经访问过了!

  14.  
  15. while (!Q.empty()){//队列不为空,继续搜索!

  16. //取出队列的头Vn

  17. Vn = Q.front();

  18.  
  19. //从队列中移除

  20. Q.pop();

  21.  
  22. while(Vw = Vn通过某规则能够到达的节点){

  23. if (Vw == Vd){//找到终点了!

  24. //把路径记录,这里没给出解法

  25. return true;//返回

  26. }

  27.  
  28. if (isValid(Vw) && !visit[Vw]){

  29. //Vw是一个合法的节点并且为白色节点

  30. Q.push(Vw);//加入队列Q

  31. hash(Vw) = true;//设置节点颜色

  32. }

  33. }

  34. }

  35. return false;//无解

  36. }


 

 

对于一个题目来说,要标志节点是否访问过,用数组是一种很快速的方法,但有时数据量太大,很难用一个大数组来记录时,采用hash是最好的做法。实际上visit数组在这里也是充当hash的作用。(PS:至于hash是什么?得自己去了解,它的作用是在O(1)的时间复杂度内取出某个值)

6.其他实例

6.1.题目描述

给定序列1 2 3 4 5 6,再给定一个k,我们给出这样的操作:对于序列,我们可以将其中k个连续的数全部反转过来,例如k = 3的时候,上述序列经过1步操作后可以变成:3 2 1 4 5 6 ,如果再对序列 3 2 1 4 5 6进行一步操作,可以变成3 4 1 2 5 6.

那么现在题目就是,给定初始序列,以及结束序列,以及k的值,那么你能够求出从初始序列到结束序列的转变至少需要几步操作吗?

6.2.思路

本题可以采用BFS求解,已经给定初始状态跟目标状态,要求之间的最短操作,其实也很明显是用BFS了。

我们把每次操作完的序列当做一个状态节点。那每一次操作就产生一条边,这个操作就是规则。

假设起始节点是:{1 2 3 4 5 6},终点是:{3 4 1 2 5 6}

去除队列中的起始节点时,将它的相邻节点加入队列,其相邻节点就是对其操作一次的所有序列:

{3 2 1 4 5 6}、{1 4 3 2 5 6}、{1 2 5 4 3 6}、{1 2 3 6 5 4}

然后继续搜索即可得到终点,此时操作数就是搜索到的节点所在的层数2。

7.OJ题目

题目分类来自网络:

sicily:1048 1444 1215 1135 1150 1151 1114

pku:1136 1249 1028 1191 3278 1426 3126 3087 3414 

8.总结

假设图有V个顶点,E条边,广度优先搜索算法需要搜索V个节点,因此这里的消耗是O(V),在搜索过程中,又需要根据边来增加队列的长度,于是这里需要消耗O(E),总得来说,效率大约是O(V+E)。

其实最影响BFS算法的是在于Hash运算,我们前面给出了一个visit数组,已经算是最快的Hash了,但有些题目来说可能Hash的速度要退化到O(lgn)的复杂度,当然了,具体还是看实际情况的。

BFS适合此类题目:给定初始状态跟目标状态,要求从初始状态到目标状态的最短路径。

9.扩展

进而扩展的话就是双向广度搜索算法,顾名思义,即是从起点跟终点分别做广度优先搜索,直到他们的搜索过程中有一个节点相同了,于是就找到了起点跟终点的一条路径。

腾讯笔试题目:假设每个人平均是有25个好友,根据六维理论,任何人之间的联系一定可以通过6个人而间接认识,间接通过N个人认识的,那他就是你的N度好友,现在要你编程验证这个6维理论。

此题如果直接做广度优先搜索,那么搜索的节点数可能达到25^6,如果是用双向的话,两个树分别只需要搜索到3度好友即可,搜索节点最多为25^3个,但是用双向广度算法的话会有一个问题要解决,就是你如何在搜索的过程中判断第一棵树中的节点跟第二棵树中的节点有相同的呢?按我的理解,可以用Hash,又或者放进队列的元素都是指向原来节点的指针,而每个节点加入一个color的属性,这样再搜索过程中就可以根据节点的color来判断是否已经被搜索过了。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

广度/宽度优先搜索(BFS) 的相关文章

  • so库的反编译,反汇编

    Linux APP SO的反汇编工具 ida Pro 可以反汇编app和SO库 有函数名 但是不能反编译到code这一级别 下载最强的反编译工具 ida Pro 6 4 Plus rar 还有这个反汇编工具 没用过 转自 http bbs
  • PHP学习笔记——加密解密

    一 MD5算法 MD5消息摘要算法 Message Digest Algorithm 是R Rivest设计的 它对输入的任意长度的消息进行运算 产生一个128位的消息摘要 随着穷举攻击和密码分析的发展 MD5算法已经不再那么流行了 1 算
  • Python 中 import 的机制与实现

    转自 http python jobbole com 82604 本文所涉及到的代码在github上 概述 Python 是一门优美简单 功能强大的动态语言 在刚刚接触这门语言时 我们会被其优美的格式 简洁的语法和无穷无尽的类库所震撼 在真
  • boost::bind 详解

    转自 https www cnblogs com benxintuzi p 4862129 html boost bind是标准库函数std bind1st和std bind2nd的一种泛化形式 其可以支持函数对象 函数 函数指针 成员函数
  • MD5 加密算法详细介绍

    MD5是什么 message digest algorithm 5 信息 摘要算法 经常说的 MD5加密 就是它 信息 摘要算法 在下载一下东西时 经常在一些压缩包属性里 看到md5值 而且这个下载页面 很可能会在某一个地方 写了一句 此文
  • Unity3D protobuf-net使用方式

    1 下载protobuf net 2 创建Unity工程 创建一个Plugins文件夹 将protobuf net解压把里面得protobuf net放到Plugins 3 创建一个名为mcs的文本文件 里面写上 unsafe 4 重启Un
  • 需要注意字节序的大端(big endian)和小端(little endian)的几种情景

    大端 big endian 在内存中 按照从最低有效字节到最高有效字节的顺序存储对象 即数据的高字节 保存在内存的低地址中 而数据的低字节 保存在内存的高地址中 小端 little endian 在内存中 按照从最高有效字节到最低有效字节的
  • linux shell 编程

    转自 http blog csdn net fpmystar article details 4183678 和 http blog csdn net buutterfly article details 6615162 在进行linux测
  • C++智能指针简单剖析

    转自 https www cnblogs com lanxuezaipiao p 4132096 html 导读 最近在补看 C Primer Plus 第六版 这的确是本好书 其中关于智能指针的章节解析的非常清晰 一解我以前的多处困惑 C
  • C++ STL之vector用法总结

    转自 https www cnblogs com zhonghuasong p 5975979 html 介绍 vector是表示可变大小数组的序列容器 就像数组一样 vector也采用的连续存储空间来存储元素 也就是意味着可以采用下标对v
  • 广度/宽度优先搜索(BFS)

    转自 https blog csdn net raphealguo article details 7523411 1 前言 广度优先搜索 也称宽度优先搜索 缩写BFS 以下采用广度来描述 是连通图的一种遍历策略 因为它的思想是从一个顶点V
  • 理解CPU/寄存器/内存之间的关系

    转自 https blog csdn net qq 27689785 article details 82975575 CPU 寄存器 内存 因为要了解多线程 自然少不了一些硬件知识的科普 我没有系统学习过硬件知识 仅仅是从书上以及网络上看
  • R与SPSS、SAS相比较_Python 在数据分析工作中的地位与R语言、SAS、SPSS 比较如何?

    转自 http m elecfans com article 611407 html 统计分析的软件和程序分析 能够用来做统计分析的软件和程序很多 目前应用比较广泛的包括 SPSS SAS R语言 Matlab S PLUS S Miner
  • C/C++编程笔记:C++中的指针与引用,又在什么时候使用?

    C和C 支持与大多数其他编程语言不同的指针 其他语言包括C Java Python Ruby Perl和PHP 从表面上看 引用和指针非常相似 都用于使一个变量提供对另一变量的访问 两者都提供了许多相同的功能 因此通常不清楚这些不同机制之间
  • QT学习——QFileSystemModel与QTreeView显示文件夹下的文件信息

    最近因为项目需求 使用QT做界面 新手学习 记录一些笔记 虽然QT已经做好了标准对话框的国际化 但是有时候对于中文的翻译可能达不到我们期望的 所以就需要我们自己来修改 比如下面的代码中 利用了国际化 写在main函数中 QApplicati
  • unique_ptr的使用和陷阱

    转自 https blog csdn net qq 33266987 article details 78784286 unique ptr的使用 分配内存 与shared ptr不同 unique ptr没有定义类似make shared
  • make时遇到File `Makefile' has modification time 4e+04 s in the future的解决办法

    1 原因 是虚拟机时间和电脑时间不匹配造成 2 解决办法 在VMware 菜单虚拟机 M gt 设置 S gt 选项下设置开启时间同步 然后重启虚拟机 3 若还出现 warning Clock skew detected Your buil
  • QT学习——QTreeView获取选中单行数据和多行数据

    个人感觉QTreeView有些地方的使用没有MFC的CListCtrl方便 比如在不响应单击信号的情况下 获取选中行的数据 单行和多行 也许因为我是新手吧 一 获取单行选中的数据 QModelIndex selected ui treeVi
  • Thread Local Storage---__thread 关键字的使用方法

    转自 http blog csdn net yusiguyuan article details 22938671 thread是GCC内置的线程局部存储设施 存取效率可以和全局变量相比 thread变量每一个线程有一份独立实体 各个线程的
  • 开源软件许可证—GPL、AGPL、LGPL、Apache、ZLIB/LIBPNG、MIT

    转自 http www dushibaiyu com 2013 08 E5 BC 80 E6 BA 90 E8 BD AF E4 BB B6 E8 AE B8 E5 8F AF E8 AF 81 gpl E3 80 81agpl E3 80

随机推荐

  • 【Unity3D】代码移动动画优化

    设置X轴和Y轴的动画曲线 通过AnimationCurve Evaluate获取进度中X和Y移动的进度的值 控制偏移 可以根据动画曲线控制平移时候的效果 using LuaInterface using System Collections
  • 论文笔记(1)DenseBox: Unifying Landmark Localization with End to End Object Detection

    本文的贡献有一下几点 1 实现了end to end的学习 同时完成了对bounding box和物体类别的预测 2 在多任务学习中融入定位信息 提高了检测的准确率 我们先来看看他和其他几篇代表性文章之间的不同 在OverFeat 1 中提
  • 机器学习方法(四):决策树Decision Tree原理与实现技巧

    欢迎转载 转载请注明 本文出自Bin的专栏blog csdn net xbinworld 技术交流QQ群 433250724 欢迎对算法 技术 应用感兴趣的同学加入 前面三篇写了线性回归 lasso 和LARS的一些内容 这篇写一下决策树这
  • DVWA 通关笔记:JavaScript Attacks

    概述 什么是JavaScript Attack JavaScript Attack即JS攻击 攻击者可以利用JavaScript实施攻击 通关要求 提交 success 一词即可获胜 下面我们分别对Low 低级 Medium 中级 High
  • java流程控制语句

    流程控制语句 一 分支语句 1 1 流程控制语句分类 1 2 if语句 1 3 switch语句 二 循环语句 2 1 for循环语句 2 2 while循环语句 2 3 do while循环语句基本格式 2 4 三种循环的区别 2 5 跳
  • 一种基于深度学习的单导联心电信号睡眠呼吸暂停检测方法

    在R峰识别的基础上 加入S峰的识别 并论正了该策略对检测结果的有效性 1 大致方法 将数据集 ECG信号 划分为每五分钟的一个片段 为了减少噪声和信号伪影 首先对信号应用了一个有限脉冲响应 FIR 带通滤波器 使用保持8 12Hz的带通滤波
  • 【Lingo 18.0及其安装教程】

    Lingo 18 0及其安装教程 Lingo是Linear Interactive and General Optimizer的缩写 即 交互式的线性和通用优化求解器 由美国LINDO系统公司 Lindo System Inc 推出的 可以
  • 小程序使用变量的值作为变量使用

    使用同一个日期选择组件 给不同的日期选择框赋值 发现想动态的给不同的组件赋值 这时候需要根据变量中暂存的组件变量赋值 这里做一下记录 calendarSelect event this setData calendarVisable fal
  • Linux常用命令-文件操作 网络命令 性能命令

    1 1文件操作命令 改变目录 cd 查看当前路径 pwd 创建目录 mkdir tmp test 创建文件 touch tmp a txt 删除文件或文件夹 rm tmp a txt 删除文件 rm r tmp test 删除文件夹 复制文
  • table2excel 导出表格有边框,文字居中

    应项目需要 前端直接导出表格中的数据 百度找到了table2excel 很实用 但是导出的表格没有边框 且表格中的数据没有居中 网上没找到对应的办法 就自己对table2excel js做了修改 能够实现导出的表格有边框 文字居中的要求 故
  • python print格式化输出

    在 Python 中 以 f 或 F 前缀开始的字符串表示格式化字符串字面量 通常称为 f string 从 Python 3 6 开始引入 它们是一种在字符串中嵌入表达式的新方法 这些表达式在运行时会被评估 然后使用 将它们插入到字符串中
  • Maven项目出现 ;about:black#block

    这是因为url路径有问题 检查元素 看到action是空的 解决这个问题 就可以解决问题了 这么简单的问题 为啥没有发现 因为配了域名映射的缘故 tomact一直访问的是 该文件下的项目 而我的工程项目是放在webapps下面的 这就导致我
  • NFS服务器的搭建(文件共享)

    NFS NFS目的是让不同计算机不同操作系统之间可以彼此共享文件 采用服务器 客户端工作模式ip 在NFS服务器上将目录设置为输出目录 即共享目录 后 客户端就可以将这个目录挂载到自己系统中的某个目录下 什么是RPC守护进程 使用NFS服务
  • Qt lambda 简化你的代码 connect 写法示例 省略槽函数定义

    简述 lambda 来姆达啊 很标准哈哈 英 l md 美 l md 百度百科 Lambda 表达式 lambda expression 是一个匿名函数 Lambda表达式基于数学中的 演算得名 直接对应于其中的lambda抽象 lambd
  • 关于vue项目刷新当前页面,获取数据改变后的页面

    vue项目刷新当前页面的几种方法 vue因为生命周期的原因 很多时候碰到这种情况 页面点击修改按钮 相应需要改变的数据不改变 只有F5情况下才能刷新数据已经修改后的页面 因为虽然点击了修改数据按钮 但是vue的生命周期已经执行完了 所以页面
  • 人脸检测、对齐、跟踪、识别 论文收集

    转自 https github com ChanChiChoi awesome Face Recognition
  • 目标检测算法FPN(Feature Pyramid Networks)简介

    目标检测算法Feature Pyramid Networks FPN 由Tsung Yi Lin等人于2017年提出 论文名字为 Feature Pyramid Networks for Object Detection 可以从https
  • SLAM笔记(七)回环检测中的词袋BOW

    1 词频 摘自阮一峰博客 参见附录参考 如果某个词很重要 它应该在这篇文章中多次出现 于是 我们进行 词频 Term Frequency 缩写为TF 统计 考虑到文章有长短之分 为了便于不同文章的比较 进行 词频 标准化 一般分母设置为文章
  • Centos7镜像下载教程(2023年,4月)

    一 因为Centos官网是挂在国外的服务器上 下载镜像时相比于国内的下载速度会慢很多 所以在这里向大家分享两个国内的镜像站去下载Centos镜像 二 前往阿里云镜像站下载Centos7镜像 1 阿里云官网地址 https www aliyu
  • 广度/宽度优先搜索(BFS)

    转自 https blog csdn net raphealguo article details 7523411 1 前言 广度优先搜索 也称宽度优先搜索 缩写BFS 以下采用广度来描述 是连通图的一种遍历策略 因为它的思想是从一个顶点V