首页 > 其他 > 详细

广度优先搜索(一)

时间:2016-02-05 22:14:25      阅读:164      评论:0      收藏:0      [点我收藏+]

深度优先搜索回顾

搜索算法的实现,从树的遍历角度讲,有深度优先和广度优先两种。深度优先我们在前边已经介绍过,我们先来简单回顾一下:
     如算法名称那样,深度优先搜索所遵循的搜索策略是尽可能“深”地搜索树。在深度优先搜索中,对于当前发现的结点,如果它还存在以此结点为起点而未探测到的边,就沿此边继续搜索下去,若当结点的所有边都己被探寻过.将回溯到当前结点的父结点,继续上述的搜索过程直到所有结点都被探寻为止。
    深度优先搜索在树的遍历中也称作树的先序遍历。对于树而言,深度优先搜索的思路可以描述为:
    (1)将根结点置为出发结点。
    (2)访问该出发结点.
    (3)依次将出发结点的子结点置为新的出发结点.进行深度优先遍历(执行(2))。
    (4)退回上一层的出发结点。

深度优先搜索图示(以八数码问题为例)

技术分享

广度优先搜索的过程

广度优先搜索算法(又称宽度优先搜索)是最简便的图的搜索算法之一,这一算法也是很多重要的图的算法的原型。Dijkstra单源最短路径算法和Prim最小生成树算法都采用了和宽度优先搜索类似的思想。
        广度优先算法的核心思想是:从初始节点开始,应用算符生成第一层节点,检查目标节点是否在这些后继节点中,若没有,再用产生式规则将所有第一层的节点逐一扩展,得到第二层节点,并逐一检查第二层节点中是否包含目标节点。若没有,再用算符逐一扩展第二层的所有节点……,如此依次扩展,检查下去,直到发现目标节点为止。即
       ⒈从图中的某一顶点V0开始,先访问V0;
       ⒉访问所有与V0相邻接的顶点V1,V2,......,Vt;
       ⒊依次访问与V1,V2,......,Vt相邻接的所有未曾访问过的顶点;
       ⒋循此以往,直至所有的顶点都被访问过为止。
       这种搜索的次序体现沿层次向横向扩长的趋势,所以称之为广度优先搜索。
技术分享

广度优先搜索算法描述1:

 1 Program Bfs;
 2 初始化,初始状态存入队列;
 3 队列首指针head:=0; 尾指针tail:=1 4 repeat
 5     指针head后移一位,指向待扩展结点;
 6     for I=1 to max do        //max为产生子结点的规则数
 7        if 子结点符合条件 then
 8           if 新结点与原已产生结点不重复 then
 9               begin
10                  tail指针增1,把新结点存入列尾;
11                  if新结点是目标结点 then 输出并退出;
12               end;
13 until(head>=tail);            //队列为空

广度优先搜索算法描述2:

 1 Program Bfs; 
 2 初始化,初始状态存入队列; 
 3 队列首指针head:=0; 尾指针tail:=1 4 repeat 
 5     指针head后移一位,指向待扩展结点; 
 6     for I=1 to max do        //max为产生子结点的规则数
 7        if 子结点符合条件 then 
 8     if 新结点是目标结点 then 输出
 9      else
10       if新结点与原已产生结点不重复 then 
11         tail 指针增1,把新结点存入队尾; 
12 until(head>=tail);   {队列空}

广度优先搜索注意事项:

        1、每生成一个子结点,就要提供指向它们父亲结点的指针。当解出现时候,通过逆向跟踪,找到从根结点到目标结点的一条路径。当然不要求输出路径,就没必要记父亲。
        2、生成的结点要与前面所有已经产生结点比较,以免出现重复结点,浪费时间,还有可能陷入死循环。
        3、如果目标结点的深度与“费用”(如:路径长度)成正比,那么,找到的第一个解即为最优解,这时,搜索速度比深度搜索要快些,在求最优解时往往采用广度优先搜索;如果结点的“费用”不与深度成正比时,第一次找到的解不一定是最优解。
        4、广度优先搜索的效率还有赖于目标结点所在位置情况,如果目标结点深度处于较深层时,需搜索的结点数基本上以指数增长。

广度优先搜索应用举例

【例1】图4表示的是从城市A到城市H的交通图。从图中可以看出,从城市A到城市H要经过若干个城市。现要找出一条经过城市最少的一条路线。

技术分享

【算法分析】
看到这图很容易想到用邻接距阵来表示,0表示能走,1表示不能走。如图。

技术分享

 

广度优先搜索(一)

原文:http://www.cnblogs.com/vacation/p/5183547.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!