4.20 训练日志

     最近几天没咋注重做题,自己读题大部分都有障碍,需要借助翻译。把课件上的代码自己亲手敲了一遍,发现其实有很多细节上的问题,不知道换别的题能不能处理好。
      切入正题,这次主要总结一下广度优先搜索(BFS)。
      1) 算法原理
      广度优先搜索即Breadth First Search,也是图遍历算法的一种。用一句话概括就是:“我会分身我怕谁?!”。          
      BFS的具体算法描述为选择一个起始点v放入一个先进先出的队列中,执行如下操作:           
      a. 如果队列不为空,弹出一个队列首元素,记为当前结点,执行b;否则算法结束;           
      b. 将与 当前结点 相邻并且尚未被访问的结点的信息进行更新,并且全部放入队列中,继续执行a;
      维护广搜的数据结构是队列和HASH,队列就是官方所说的open-close表,HASH主要是用来标记状态的,比如某个状态并不是一个整数,可能是一个字符串,就需要用字符串映射到一个整数,可以自己写个散列HASH表,不建议用STL的map,效率奇低。
  1. 算法实现
    广搜一般用队列维护状态,写成伪代码如下:
    def BFS(v):
    resetArray(visited,false)
    visited[v] = true
    queue.push(v)
    while not queue.empty():
    v = queue.getfront_and_pop()
    for u in adjcent_list[v]:
    if visited[u] is false:
    dosomething(u)
    queue.push(u)
    3)基础算法样式
    int bfs()
    {
    /初始化,初始状态存入队列;
    队列首指针 head = 0;
    尾指针 tail = 1;
    /
    do
    {
    /指针 head 后移一位,指向扩展节点;/
    for(int i = 1;i<=max;i++)
    //max为产生子节点的规则数;
    {
    if(子节点符合条件)
    {
    tail指针增1,把新节点存入列尾;
    if(新节点与原已产生节点重复)
    删去该节点(取消入队,tail减1);
    else
    if(新节点是目标节点)
    输出并退出;
    }
    }
    }while(head<tail);
    //队列为空;
    }
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值