“ 你所有流过的泪,是一条渡你的河, 你所有受过的苦,将照亮你前方的路;岁月从没有放过我们,我们也不能辜负岁月。”

最近过的不好~

被虐

自信全无

各种害怕、自卑~

唯有努力前行,安慰自己

记录下两种算法BFS和DFS的学习之路:

BFS和DFS,这两个是比较重要的概念,是很多很多算法的基础,另外设计到数学当中的树和图,已帮你百度:

所谓的图就是许多的点和许多的边把这些点连了起来,具体每个点放在那里没啥关系,重点是他们之间的连接关系。一个图长得就像是下面这样:

这个图有6个点,8条边,其中有一条是自己连接自己的。另外图的话有:有向图,无向图等等,还有很多很多分类,比如二分图等等,上图只是一种。

恩,其实,树也是图,只是比较特殊而已,它有N个点,N-1条边,而且这N个点是互相连通的,那么这个图就能画成一颗树一样的样子。

接下来

进入正题~

BFS:Breadth-First-Search,宽度(广度)优先搜索;DFS:Depth-first search,深度优先搜索。

二者都是对图或树的一种搜索或遍历方法,只不过搜索的形式不一样。对于一个图来说,搜索就是从某个点开始,不停的搜索与他相连的所有的点,然后以此接连下去,直到所有的点都被搜索到了。

为了区分BFS和DFS的遍历方式,我们拿上面的图来举例:

比如上图,如果从1开始进行搜索的话,BFS的步骤就是,先搜索所有和1相连的,也就是2和5被找到了,然后再从2开始搜索和他相连的,也就是3被找到了,然后从5搜,也就是4被找到了,然后从3开始搜索,4被找到了,但是4之前已经被5找到了,所以忽略掉就行。然后3开始搜索,忽略4所以啥都没搜到,然后从4开始,6被找到了。。。

这样,这就是BFS。。。

  而DFS的步骤是:从1开始,先找到其中一个相连的,2被找到了,然后直接开始从2开始搜索,3被找到了,然后从3开始搜索,4被找到了,然后从4开始搜索,5被找到了,然后从5开始搜索,忽略已经找到的所以啥都没找到。然后没路可走了,回到前面去再走另一条路,从4开始,6被找到了,然后又没路可走了,然后再回去前面4,然后没路了 ,回去前面3,然后一直这样。。。

  DFS 就是像走迷宫一样一条路走到头直到走不通才回到前一个换一条路。。。就是这样。。。

总的来说:DFS和BFS主要是运用于对于图和树的搜索,但是绝大部分问题模型都是可以建模变成一个图或者树的,所以差不多不少问题都会涉及到这两个。

那具体怎么用代码实现这两种方式呢?

图的表示:

对于图上的每个点来说就是标号1,2,3....N就好,表示有N个结点,一般题目也已经标好号了,然后边的话一般会就是 u,v 这样表示有一条边连接u点和v点。

存储一个图的边有三种方法:(存图就是对于每个点u,记录它能到的所有点就行了...)

  1.邻接矩阵:

  直接开一个N×N的二维数组E,然后 E[i][j] 为1的时候表示 i 和 j 之间有一条边,0的时候就没有。

  这样很方便简单,但是有几个缺陷,首先是效率问题,超过1000个点一般不管是空间还是时间都不允许了。然后就是如果从 3 到 5 有两条边的话,就没法表示了。。。

  所以一般很少用了现在,当然有些算法还是会用到的。

int E[110][110];

E[1][2]=1;

E[5][3]=0;

2.邻接链表:

  使用链表的方式保存一个结点的所有边,就是每个点都有一个链表。当然写个链表很麻烦,所以一般是用vector来替代。就像是下面这样。

vector <int> E[110];

E[3].push_back(6) // 有一条从3到6的边。

3.前向星:

   这个名字实在逼格太高,而且很好用效率也高,所以我一直都用这种方式来存图。他和链表几乎没什么区别,就是每次添加新的边的时候往开头加,而不是往最后加。具体就像是下面这样:

struct Edge
{int to,next;
};Edge E[1010];            // 总共不超过1000条边。
int head[110],Ecou;        // 不超过100个点。void init()                // 初始化。
{memset(head,-1,sizeof(head));Ecou=0;
}void addEdge(int u,int v)    // 增加边 u,v。
{E[Ecou].to=v;E[Ecou].next=head[u];head[u]=Ecou++;
}

好的~

可来说一说BFS、DFS怎么写?

BFS的写法:

注:BFS需要一个队列这种数据结构来保存,在每次找到和u相连的之后要一个个找这些点,符合先进先出。代码如下:(采用第二种存图方式。)

bool vis[110];            // 记录已经走过的点,防止重复访问。void BFS(int root,int N)        // N个点的图,从root点开始搜索。
{queue <int> que;memset(vis,0,sizeof(vis));    // 初始化。vis[root]=1;que.push(root);int u,len;while(!que.empty()){u=que.front();que.pop();len=E[u].size();for(int i=0;i<len;++i)        // 找到和u相连的所有点,存在一个vector里面。if(vis[E[u][i]]==0){vis[E[u][i]]=1;que.push(E[u][i]);}}
}

DFS的写法:

注:DFS需要一个栈(stack),因为每次都是搜到之后不停的往下搜,符合先进先出。但是一般来说不用栈,而是直接通过函数的递归就行了。

bool vis[110];
int N;void DFS(int u)
{int len;vis[u]=1;len=E[u].size();for(int i=0;i<len;++i)if(vis[E[u][i]]==0)DFS(E[u][i]);
}

差不多就是这样,建议好好模拟使用一下~

另:

这两个算法在一定程度上其实是可以相互转化的,但是有些需要各自的特性的话就不行了。

    DFS主要的特性是深度优先,总是不停的往下找,走到没路才罢休。

    BFS则是从root开始扩展,每一层都是精密的搜索完整了才下一个。

sweet~

bye

无论怎样,一定要加油!相信自己,没有那么差,如果你自己都看不起自己,那也别指望别人能看得起你~

记录两种搜索遍历算法——BFS和DFS相关推荐

  1. 图的两种遍历算法——BFS和DFS

    一.BFS,也称广度优先搜索,和二叉树的层次遍历算法类似 //BFS bool visited[MaxVertexNum]; void BFSTraverse(Graph G){for(i=0;i&l ...

  2. 模糊匹配 读音_onenote搜索机制详解②:两种搜索模式,模糊与精确匹配

    先从纯文本搜索讲起,这是最基本也是最重要的. 从这篇开始,以及接下来连续几篇文章,都会介绍搜索的基础功能.注意,这几篇文章中谈论的都是基本的.正常的搜索功能,暂时不考虑Bug等因素. 在很多软件(例如 ...

  3. ArcGIS两种线简化算法和建筑物综合(面的简化和建筑物聚合)的参数计算方法

    ArcGIS两种线简化算法和建筑物综合(面的简化和建筑物聚合)的参数计算方法 文章目录 ArcGIS两种线简化算法和建筑物综合(面的简化和建筑物聚合)的参数计算方法 1.问题描述 2.参数计算 2.1 ...

  4. TIA博途中实现冒泡排序的两种SCL语言算法

    TIA博途中实现冒泡排序的两种SCL语言算法 TIA博途软件版本:V15.0 首先新建一个项目(具体过程这里就不演示了),添加一个FC块(或FB块均可),编程语言选择SCL,如下图,在FC的块接口中, ...

  5. 搜啊搜(论两种搜索方法)

    搜索,是在编程学习中必须掌握的一种算法,在很多数据居中的题目中,都可以使用这种方法,其具体可以分为两种类型: 1.深搜(deep first search) 相当于二叉树中的先序遍历,可以点这个来查看 ...

  6. python扫雷 广度优先_基于邻接矩阵的广度优先搜索遍历(BFS)

    数据结构实验图论一:基于邻接矩阵的广度优先搜索遍历 Time Limit: 1000MS Memory limit: 65536K 题目描述 给定一个无向连通图,顶点编号从0到n-1,用广度优先搜索( ...

  7. 拓扑排序的两种实现:Kahn算法和dfs算法

    本文将从以下几个方面介绍拓扑排序: 拓扑排序的定义和前置条件 和离散数学中偏序/全序概念的联系 典型实现算法 Kahn算法 基于DFS的算法 解的唯一性问题 实际例子 取材自以下材料: http:// ...

  8. 两种鲸鱼优化算法 (whale optimization algorithm, WOA)及仿真实验——附代码

    目录 摘要: 算法设计: WOA总体流程图如下: 增强型WOA(E-WOA) 仿真运行效果: 完整程序: 摘要: 鲸鱼优化算法 (whale optimization algorithm,WOA)是 ...

  9. iOS中的两种搜索方式UISearchDisplayController和UISearchController

    大熊猫猪·侯佩原创或翻译作品.欢迎转载,转载请注明出处. 如果觉得写的不好请多提意见,如果觉得不错请多多支持点赞.谢谢! hopy ;) 以前iOS的搜索一般都使用UISearchDisplayCon ...

最新文章

  1. 2005年2月9日(星期三) 晚上,熱 - 大年初一,首次創作。
  2. android 6gb和8gb区别,手机6GB内存和8GB内存的差距到底有多大?你可能被忽悠了!...
  3. Python 小把戏之下载小说
  4. docker omv 防火墙_OpenMediaVault(OMV)配置Docker
  5. python zipfile 模块下中文乱码 '╡┌╥╗╒┬_╒╨▒Ω╣½╕µ.docx'
  6. 了解单片机及单片机的控制原理和 DX516 的用法,控制一个 LED 灯的亮
  7. [ js处理表单 ]:保存、提交
  8. UE4 动态创建Actor并且附加static mesh
  9. android oom工具,Android OOM-Heap,MAT工具检测内存泄露
  10. 《Android深入透析》之界面
  11. 苹果或在2021年新iPhone上增加屏下Touch ID
  12. Linux就该这么学 20181008(第十三章BIND)
  13. Linux 配置LNMP服务器 并配置虚拟主机
  14. java 异常java.lang.UnsupportedOperationException
  15. Decorator模式设计模式
  16. 软件开发生命周期及各阶段文档
  17. Python爬虫从入门到精通:(6)数据解析2_使用bs4(BeautifulSoup)_Python涛哥
  18. 进阶级 - Git Hub 常用指南
  19. 服务熔断降级什么意思?
  20. cisco将计算机配置为vlan2,思科路由器如何配置VLAN的IP

热门文章

  1. SCJP认证复习~1
  2. java 分析命令_javap命令解析
  3. javaweb JAVA JSP新生报道管理系统源码JSP新生报到入学系统JSP新生报到系统
  4. 【SPI】SPI学习之SPI驱动相关
  5. linux在什么环境运行,Linux的应用环境
  6. 面试经典题——计算机网络
  7. 用CSS画简陋的足球⚽
  8. 苹果手机小技巧大全计算机,iPhone好用到哭的6个实用小技巧
  9. Exchanger 案例
  10. Python的三种主要模块介绍