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

广度优先搜索

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

 

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

 

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

 

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

 

当然,上面的话是我自己对DFS和BFS的理解和概括,下面是官方的总结(摘自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,那么广搜比深搜先搜到

 

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

 

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

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

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

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

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

 

如(图画的不好见谅!)

 

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

 

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

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

2出队列,将2的可能解4,5加入队列 (此时队列中有 3,4,5)

3出队列,将3的可能解6,7加入队列 (此时队列中有 4,5,6,7)

4出队列,将4的可能解8,9加入队列 (此时队列中有 5,6,7,8,9)

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

 

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

时间: 2024-11-08 20:25:12

【算法小总结】广度优先搜索剖析的相关文章

算法起步之广度优先搜索

原文:算法起步之广度优先搜索           广度优先搜索算法是图的基本算法之一,图是用来保存过对多的关系的数据结构,相对于树一对多的关系更为复杂,所以难度也会比树结构难一点,图的存储一般有连接表表示跟链接矩阵表示,相比来说链接矩阵的方式更为常用,也就是用数组来存储.而广度优先搜索算法其实就是图的遍历过程,数组的遍历大家都会,数组的遍历我们是按照下标的顺序来遍历的,而图的遍历也有自己的方式,图是多对多的关系,我们可以按照各个节点直接的关联关系来遍历他们,这样便衍生出来深度优先跟广度优先,广度

C++实现广度优先搜索实例_C 语言

本文主要叙述了图的遍历算法中的广度优先搜索(Breadth-First-Search)算法,是非常经典的算法,可供C++程序员参考借鉴之用.具体如下: 首先,图的遍历是指从图中的某一个顶点出发,按照某种搜索方法沿着图中的边对图中的所有顶点访问一次且仅访问一次.注意到树是一种特殊的图,所以树的遍历实际上也可以看作是一种特殊的图的遍历.图的遍历主要有两种算法:广度优先搜索(Breadth-First-Search)和深度优先搜索(Depth-First-Search). 一.广度优先搜索(BFS)的

图的遍历(搜索)算法(深度优先算法DFS和广度优先算法BFS)

图的遍历的定义: 从图的某个顶点出发访问遍图中所有顶点,且每个顶点仅被访问一次.(连通图与非连通图) 深度优先遍历(DFS): 1.访问指定的起始顶点: 2.若当前访问的顶点的邻接顶点有未被访问的,则任选一个访问之:反之,退回到最近访问过的顶点:直到与起始顶点相通的全部顶点都访问完毕: 3.若此时图中尚有顶点未被访问,则再选其中一个顶点作为起始顶点并访问之,转 2: 反之,遍历结束.  连通图的深度优先遍历类似于树的先根遍历 如何判别V的邻接点是否被访问? 解决办法:为每个顶点设立一个"访问标志

【算法导论】图的广度优先搜索遍历(BFS)

       图的存储方法:邻接矩阵.邻接表        例如:有一个图如下所示(该图也作为程序的实例): 则上图用邻接矩阵可以表示为: 用邻接表可以表示如下: 邻接矩阵可以很容易的用二维数组表示,下面主要看看怎样构成邻接表:         邻接表存储方法是一种顺序存储与链式存储相结合的存储方法.在这种方法中,只考虑非零元素,所以在图中的顶点很多而边很少时,可以节省存储空间.         邻接表存储结构由两部分组成:对于每个顶点vi, 使用一个具有两个域的结构体数组来存储,这个数组称为顶

人工智能: 自动寻路算法实现(一、广度优先搜索)

前言 随着人工智能技术的日益发达,我们的生活中也出现了越来越多的智能产品.我们今天要关注的是智能家居中的一员:扫地机器人.智能扫地机器人可以在主人不在家的情况下自动检测到地面上的灰尘,并且进行清扫.有些更为对路线进行规划,找到可以清理灰尘的最短路径,达到省电的效果.当然,绕过障碍物也是必须拥有的技能.我们今天就来看一下扫地机器人自动寻路的算法的简单实现.这里我们不对机器人如何识别出灰尘进行讨论,我们只讨论发现了灰尘之后,机器人的路径规划进行一个分析.为了简单起见,我们假设机器人所处在的是一个M×

如何使用堆栈在树上执行广度优先搜索(逐级搜索)

简介 本文介绍了如何使用堆栈在树上执行广度优先搜索(逐级搜索),可以使用过程分配的堆栈或者使用一个独立的堆栈数据结构.BFS 是一种优先考虑广度的树扫描方式.打印的第一个节点是根节点,随后是它的直系子节点,然后是下一级子节点.在这里,根节点位于第 1 级,它的子节点位于第 2 级.接下来打印第 3 级上的孙节点.BFS 将继续以这种方式打印,直到到达最后一级.下面的树就是一个例子. (a) | v --------------------------------------------- | |

数据结构实验图论一:基于邻接矩阵的广度优先搜索遍历

数据结构实验图论一:基于邻接矩阵的广度优先搜索遍历 Time Limit: 1000MS Memory Limit: 65536KB Problem Description 给定一个无向连通图,顶点编号从0到n-1,用广度优先搜索(BFS)遍历,输出从某个顶点出发的遍历序列.(同一个结点的同层邻接点,节点编号小的优先遍历) Input 输入第一行为整数n(0< n <100),表示数据的组数. 对于每组数据,第一行是三个整数k,m,t(0<k<100,0<m<(k-1)

算法起步之深度优先搜索

原文:算法起步之深度优先搜索        说完广度优先搜索后,我们来看图的另一种遍历形式,深度优先搜索算法,深度优先总是对刚发现的节点的出阿发边进行探索,直到该节点的所有出发边都被发现为止.一旦所有的出发边都被发现,搜索就回溯到前驱结点,来搜索前驱结点的出发边.反复进行直到全部遍历.我们用递归跟栈两种方式进行实现,其实归根到底递归也是栈实现的.        递归实现:   public class DFS { private boolean[] visited; public void df

python 广度优先搜索 遍历图中的点

问题描述 python 广度优先搜索 遍历图中的点 mapmodel=[ [0,1,1,-1,1], [1,0,-1,1,-1], [1,-1,0,-1,1], [-1,1,-1,0,-1], [1,-1,1,-1,0] ] flag=[1,0,0,0,0] def dfs(current,sumpoint): if sumpoint==5: print sumpoint,flag for i in range(5): if mapmodel[current][i]==1 and flag[i]