【算法小总结】广度优先搜索剖析

简介:

广度优先搜索

以前一直用搜索用的都是深搜,因为听说有很多题能用广搜就能用深搜什么的。今天老老实实的去看广搜了,结果发现我之前想的太天真的,DFSBFS不仅在性质上不同,而且对于某些题和某些情况,用BFSDFS要快(不是绝对)。

 

今天好好说道说道这个BFS(广度优先搜索)

 

很多问题(如过迷宫问题),每走下一步,都要考虑很多种情况,这个时候,就要每一步每一步的去试探,去找到合适的方案,也是就是传说中的“搜索”。

 

当然,想试探出结果,可以去将一种方案走到底,遇到不能走或者其他不符合要求的情况再退回来,选择下一个方案继续尝试,这种可以称作所谓的“深度优先搜索”(DFS;还有一种方式,就是所有方案我先都尝试第一步,检测是否找到结果,如果没有,继续尝试所有方案的第二步。。。。直到找到合适的结果或方案,这种搜索方式成为“宽度优先搜索”。

 

当然,上面的话是我自己对DFSBFS的理解和概括,下面是官方的总结(摘自ppt

 

优先搜索也称为宽度优先搜索,它是一种先生成的节点先扩展的策略。

 

广度优先搜索算法如下:(用QUEUE

    (1) 把初始节点S0放入Open表中;

    (2) 如果Open表为空,则问题无解,失败退出;

    (3) Open表的第一个节点取出放入Closed表,并记该节点为n

    (4) 考察节点n是否为目标节点。若是,则得到问题的解,成功退出;

    (5) 若节点n不可扩展,则转第(2)步;

    (6) 扩展节点n,将其不在Closed表中的子节点放入Open表的尾部,并为每一个子节点设置指向父节点的指针,然后转第(2)步。

 

 

让我们来看看广度优先搜索和深度优先搜索的区别在哪

首先这是我们要搜索的图(图片摘自互联网):

 

用深搜:

 

搜索方式:

路径1 ==> A --> B --> E --> H  路径2 ==> i

路径3 ==> C  路径4 ==> D --> F --> K --> L  路径5 ==> G

 

用广搜:

 

搜索方式:

路径1 ==> A  路径2 ==> B --> C --> D  路径3 ==> E --> F --> G

路径4 ==> H --> i --> K  路径5 ==> L

 

如果要搜的答案在H,那么很显然深搜先搜到

如果答案在D,那么广搜比深搜先搜到

 

DFSBFS的效率还是分情况描述的,所以我就不做过多比较。。。

 

我来说说我总结的广搜过程:

1.建立一个空队列,将根节点Root(搜索的初始第一步)放在队首。

2.Root出队列,同时将Root的所有可能情况(假设s1,s2,s3)压入队列

3.然后判断队首元素(s1),判断s1是否是可行情况,如果可行,将s1的下一步可行情况压入队列。s1出队列。

4.接下来一直执行23两步,直到找到答案或者全部搜索完毕。

 

如(图画的不好见谅!)

 

假设需要从1开始,找到5,队列的变换过程如下:

 

开始1(此时队列中有 (下面先后顺序按队首到队尾))

1出队列,将1的可能解23加入队列 (此时队列中有 3

2出队列,将2的可能解45加入队列 (此时队列中有 345

3出队列,将3的可能解67加入队列 (此时队列中有 4567

4出队列,将4的可能解89加入队列 (此时队列中有 56789

5出队列,找到答案,结束。

 

可以看看下面的例题:http://blog.csdn.net/acmman/article/details/38345509

相关文章
|
6月前
|
算法 Python
Python算法——广度优先搜索
Python算法——广度优先搜索
166 0
|
28天前
|
算法 测试技术 C#
【广度优先搜索】【堆】【C++算法】407. 接雨水 II
【广度优先搜索】【堆】【C++算法】407. 接雨水 II
|
3月前
|
算法 测试技术 C++
【广度优先搜索】【拓扑排序】【C++算法】913. 猫和老鼠
【广度优先搜索】【拓扑排序】【C++算法】913. 猫和老鼠
|
4月前
|
存储 算法 搜索推荐
算法06-搜索算法-广度优先搜索
算法06-搜索算法-广度优先搜索
|
9月前
|
算法
第 7 天_广度优先搜索 / 深度优先搜索【算法入门】
第 7 天_广度优先搜索 / 深度优先搜索【算法入门】
95 0
|
5月前
|
算法 Python
Python 数据结构和算法:解释深度优先搜索(DFS)和广度优先搜索(BFS)。
Python 数据结构和算法:解释深度优先搜索(DFS)和广度优先搜索(BFS)。
|
5月前
|
存储 算法 Java
java树和图相关的算法:二叉树遍历、深度优先搜索、广度优先搜索等
树和图相关的算法:二叉树遍历、深度优先搜索、广度优先搜索等
37 0
|
9月前
|
算法
第 8 天_广度优先搜索 / 深度优先搜索【算法入门】
第 8 天_广度优先搜索 / 深度优先搜索【算法入门】
111 0
|
存储 算法 Python
广度优先搜索算法从浅到深
广度优先搜索算法是一种图搜索算法,用于在图或树等数据结构中寻找从起点开始到达目标节点的最短路径。该算法从起点开始搜索,逐层地向外遍历其相邻节点,直到找到目标节点或遍历完整张图。
201 0
|
算法
算法刷题第九天:广度优先搜索 / 深度优先搜索--3
需要额外的 dis 数组记录每个新鲜橘子被腐烂的最短时间,大小为 O(nm),且广度优先搜索中队列里存放的状态最多不会超过nm 个,最多需要 O(nm) 的空间,所以最后的空间复杂度为 O(nm)。
70 0
算法刷题第九天:广度优先搜索 / 深度优先搜索--3