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

广度优先搜索

以前一直用搜索用的都是深搜,因为听说有很多题能用广搜就能用深搜什么的。今天老老实实的去看广搜了,结果发现我之前想的太天真的,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

上一篇:OpenJudge计算概论-扩号匹配问题【这个用到了栈的思想】


下一篇:vsftp 基于虚拟用户的ftp服务器 如何做配额