BFS和DFS

一、前言

我们首次接触 BFS 和 DFS 时,应该是在数据结构课上讲的 “图的遍历”。还有就是刷题的时候,遍历二叉树我们会经常用到BFS和DFS。

二、区别

广度优先搜索算法(Breadth-First-Search,缩写为 BFS),是一种利用队列实现的搜索算法。简单来说,其搜索过程和 “湖面丢进一块石头激起层层涟漪” 类似。

深度优先搜索算法(Depth-First-Search,缩写为 DFS),是一种利用递归实现的搜索算法。简单来说,其搜索过程和 “不撞南墙不回头” 类似。

BFS 的重点在于队列,而 DFS 的重点在于递归。这是它们的本质区别。

BFS从起点出发,对于每次出队列的点,都要遍历其四周的点。所以说 BFS 的搜索过程和 “湖面丢进一块石头激起层层涟漪” 很相似,此即 “广度优先搜索算法” 中“广度”的由来。

DFS从起点出发,先把一个方向的点都遍历完才会改变方向...... 所以说,DFS 的搜索过程和 “不撞南墙不回头” 很相似,此即 “深度优先搜索算法” 中“深度”的由来。

三、总结

BFS 常用于找单一的最短路线,它的特点是 "搜到就是最优解",而 DFS 用于找所有解的问题,它的空间效率高,而且找到的不一定是最优解,必须记录并完成整个搜索,故一般情况下,深搜需要非常高效的剪枝(剪枝的概念请百度)。

 

 

 

 

 

 

 

### BFS DFS 的特点及应用场景 #### 特点对比 广度优先搜索 (BFS) 深度优先搜索 (DFS) 是图树结构中最常用的两种遍历方法。以下是两者的具体特点: 1. **探索顺序** - 广度优先搜索 (BFS) 按照层次依次访问节点,即先访问当前层的所有节点再进入下一层[^3]。 - 深度优先搜索 (DFS) 则沿着一条路径尽可能深入地访问节点直到无法继续,然后再回溯并尝试其他分支[^1]。 2. **数据结构支持** - BFS 使用队列作为辅助数据结构来存储待访问的节点,确保按先进先出的原则处理节点[^4]。 - DFS 可通过递归调用栈或者显式的栈实现,利用后进先出的方式管理未完成的子树遍历操作[^2]。 3. **时间复杂度与空间需求** - 时间复杂度方面两者均为 O(V+E),其中 V 表示顶点数量 E 边的数量。 - 空间消耗上,由于 BFS 需要维护整个宽度方向上的节点列表,在某些极端情况下可能占用较多内存;相比之下,DFS 更节省空间因为它仅需保留从根到叶的一条路径信息即可。 #### 应用场景分析 1. **寻找最短路径问题** - 如果目标是最少步数到达某个特定位置,则应选用 BFS 方法。这是因为当首次抵达终点时所经历的距离必然最小——这是由其逐级扩展特性决定的。 2. **全解枚举任务** - 对于需要穷尽所有可能性的情况,例如生成排列组合等问题,推荐采用 DFS 技术。它能够有效减少中间状态保存量从而提高效率。 3. **拓扑排序或其他依赖关系解析场合** - 当存在明确的方向性先后次序约束条件下构建解决方案时,这两种技术都可以发挥作用。不过通常来说,基于堆栈特性的 DFS 实现起来更为直观简便一些。 ```python from collections import deque def bfs(graph, start_node): visited = set() queue = deque([start_node]) while queue: node = queue.popleft() if node not in visited: print(node) visited.add(node) neighbors = graph[node] for neighbor in neighbors: if neighbor not in visited: queue.append(neighbor) def dfs_recursive(graph, current_node, visited=None): if visited is None: visited = set() if current_node not in visited: print(current_node) visited.add(current_node) for next_node in graph[current_node]: if next_node not in visited: dfs_recursive(graph, next_node, visited) graph_example = { 'A': ['B', 'C'], 'B': ['D', 'E'], 'C': ['F'], 'D': [], 'E': ['F'], 'F': [] } print("BFS Traversal:") bfs(graph_example, 'A') print("\nDFS Recursive Traversal:") dfs_recursive(graph_example, 'A') ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值