广度优先搜索(BFS)和 深度优先搜索 (DFS)

什么是”搜索算法“?

  • 算法是作用于具体数据结构之上的,深度优先搜索算法和广度优先搜索算法都是基于”图“这种数据结构的。这是因为,图这种数据结构的表达能力很强,大部分设计搜索的场景都可以抽象成”图“。
  • 图上的搜索算法,最直接的理解就是,在图中能找到从一个顶点出发,到另一个顶点的路径。具体方法有很多,最简单、最”暴力“的深度优先、广度优先搜索,还有A*、IDA*等启发式搜索算法。

广度优先搜索(BFS)

  • 广度优先搜索(Breadth-Firsr-Search)简称:BFS
  • 它其实就是一种”地毯式“搜索策略,即先查找离顶点最近的,然后是次近的,依次往外搜索.
  • 广度优先搜索算法的时间、空间复杂度:
  • 最坏情况下,终止顶点t离起始顶点s很远,需要遍历完整个图才能找到。这个时候,每个顶点都要进出一遍队列,每个边也会被访问一次,所以,广度优先搜索的时间复杂度是O(V+E),V表示顶点个数,E表示边的个数。当然,对于一个连通图来说,也就是说一个图中的所有顶点都是连通的,E肯定要大于等于V-1,所以,广度优先搜索的时间复杂度也可以简写为O(E)
  • 广度优先搜索的空间消耗主要在几个辅助变量 visited 数组、queue 队列、prev 数组上。这三个存储空间的大小都不会超过顶点的个数,所以空间复杂度是 O(V)。

深度优先搜索 (DFS)

  • 深度优先搜索(Depth-First-Search),简称 DFS
  • 最直观的例子就是“走迷宫”,随意选择一个岔路口来走,走着走着发现走不通的时候,你就回退到上一个岔路口,重新选择一条路继续走,直到最终找到出口。这种走法就是一种深度优先搜索策略。
  • 深度优先搜索算法的时间、空间复杂度:
  • 每条边最多会被访问两次,一次是遍历,一次是回退。所以,深度优先搜索算法的时间复杂度是 O(E),E 表示边的个数。
  • 深度优先搜索算法的消耗内存主要是 visited、prev 数组和递归调用栈。visited、prev 数组的大小跟顶点的个数 V 成正比,递归调用栈的最大深度不会超过顶点的个数,所以总的空间复杂度就是 O(V)。

总结

  1. 广度优先搜索和深度优先搜索是图上的两种最常用、最基本的搜索算法,比起其他高级的搜索算法,比如 A*、IDA* 等,要简单粗暴,没有什么优化,所以,也被叫作暴力搜索算法。
  2. 这两种搜索算法仅适用于状态空间不大,也就是说图不大的搜索。
  3. 广度优先搜索,通俗的理解就是,地毯式层层推进,从起始顶点开始,依次往外遍历。广度优先搜索需要借助队列来实现,遍历得到的路径就是,起始顶点到终止顶点的最短路径。
  4. 深度优先搜索用的是回溯思想,非常适合用递归实现。换种说法,深度优先搜索是借助栈来实现的。
  5. 在执行效率方面,深度优先和广度优先搜索的时间复杂度都是 O(E),空间复杂度是 O(V)。
  • 1
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值