BFS和DFS

一、BFS的介绍
BFS(广度优先搜索,也可称宽度优先搜索)是连通图的一种遍历策略。因为它的基本思想是从一个顶点V0开始,辐射状地优先遍历其周围较广的区域。
广度优先搜索(BFS)类似于二叉树的层序遍历算法,它的基本思想是:首先访问起始顶点v,然后由v出发,依次访问v的各个未被访问过的邻接顶点w1,w2,w3….wn,然后再依次访问w1,w2,…,wi的所有未被访问过的邻接顶点,再从这些访问过的顶点出发,再访问它们所有未被访问过的邻接顶点….以此类推,直到途中所有的顶点都被访问过为止。
二、BFS搜索的步骤
    1、首先创建一个visit[ ]数组和一个队列q,分别用来判断该位置是否已经访问过及让未访问过的点入队;
    2、初始化visit[ ]数组,清空q队列;
    3、让起点start入队,并使该点的visit置1;
    4、while(!q.empty()){......}执行搜索操作,
        a、取出队头元素后使队头元素出队,判断该元素是否为目标到达点;
        b、如果是目标点,就返回结果(一般是最短时间、最短路径);
        c、如果不是目标点,就继续访问与其相邻的位置点,将可走的相邻的位置点入队,并更新visit[ ]数组;
三、BFS的应用
BFS算法一般应用于单源最短路径的搜索。

1、寻找非加权图(或者所有边权重相同)中任两点的最短路径。

2、寻找其中一个连通分支中的所有节点。(扩散性)

3、bfs染色法判断是否为二分图。

四、DFS的介绍

深度优先搜索算法(Depth First Search,简称DFS):一种用于遍历或搜索树或图的算法。 沿着树的深度遍历树的节点,尽可能深的搜索树的分支。当节点v的所在边都己被探寻过或者在搜寻时结点不满足条件,搜索将回溯到发现节点v的那条边的起始节点。整个进程反复进行直到所有节点都被访问为止。

算法基本思想:

回溯法:(探索与回溯法)是一种选优搜索法,又称为试探法,按选优条件向前搜索,以达到目标。但当探索到某一步时,发现原先选择并不优或达不到目标,就退回一步重新选择,这种走不通就退回再走的技术为回溯法,而满足回溯条件的某个状态的点称为“回溯点”。

五:DFS的搜索步骤

1、创建一个空栈stack(用来存放节点)和一个空列表visit(用来存放已访问的节点)

2、依次将起始点及邻接点加入stack和visit中

3、poo出栈中最后进入的节点,从图中获取该节点的邻接点

4、如果邻接点不在visit中,则将该邻接点加入stack和visit中

5、输出pop出的节点

6、重复3、4、5,直至栈为空

六:BFS与DFS的区别

广度优先搜索(BFS) 深度优先搜索(DFS)
1 BFS在Graph中逐级访问节点。 DFS访问图深度明智的节点。 它会访问节点,直到到达叶或没有未访问节点的节点为止。
2 在开始任何其他节点之前,必须先充分探究一个节点。 一旦发现另一个未探索节点,就会暂停对该节点的探索。
3 使用队列数据结构存储未探索的节点。 使用堆栈数据结构存储未探索的节点。
4 BFS较慢,需要更多的内存。 DFS更快并且需要更少的内存。
5 一些应用:
  • 在图中查找所有连接的组件。
  • 查找两个节点之间的最短路径。
  • 查找一个连接的组件内的所有节点。
  • 测试图的二等性。
一些应用:
  • 拓扑排序。
  • 查找连接的组件。
  • 解决迷宫等难题。
  • 查找牢固连接的组件。
  • 查找图形的关节点(切顶点)。

 

上一篇:网络设备


下一篇:MAC下 mysql不能插入中文和中文乱码的问题总结