广度优先算法

广度优先算法

广度优先搜索算法(又称宽度优先搜索)是最简便的图的搜索算法之一,这一算法也是很多重要的图的算法的原型。

Dijkstra单源最短路径算法
Prim最小生成树算法

广度优先算法的核心思想是:
从初始节点开始,应用算符生成第一层节点,检查目标节点是否在这些后继节点中,若没有,
再用产生式规则将所有第一层的节点逐一扩展,得到第二层节点,并逐一检查第二层节点中是否包含目标节点。
若没有,再用算符逐一扩展第二层的所有节点……,如此依次扩展,检查下去,直到发现目标节点为止。

⒈从图中的某一顶点V0开始,先访问V0;
⒉访问所有与V0相邻接的顶点V1,V2,…,Vt;
⒊依次访问与V1,V2,…,Vt相邻接的所有未曾访问过的顶点;
⒋循此以往,直至所有的顶点都被访问过为止。
这种搜索的次序体现沿层次向横向扩展的趋势,所以称之为广度优先搜索。

在这里插入图片描述
广度优先搜索算法描述:

int bfs()
{
初始化,初始状态存入队列;
队列首指针head=0; 尾指针tail=1do
 {
    指针head后移一位,指向待扩展结点;
    for (int i=1;i<=max;++i)             //max为产生子结点的规则数
     { 
      if (子结点符合条件)
         {
            tail指针增1,把新结点存入列尾;
            if (新结点与原已产生结点重复) 删去该结点(取消入队,tail减1;
            else
              if (新结点是目标结点) 输出并退出;
          }
      }
	}while(head<tail);                       //队列为空
}

广度优先搜索注意事项:

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

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值