BFS和DFS(一)

BFS(Breadth First Search),DFS(Depth First Search)

BFS 广度优先搜索,DFS 深度优先搜索是两种常用的图搜索算法。

BFS

在图上进行BFS之前,我们先来看一下在树上进行BFS的结果。

对如图一棵树BFS的过程即按层进行遍历的过程。结果为 ABCDEFGH。

 然而,图没有根结点,因此我们需要规定一个节点作为源节点。在这里,我们规定A为源节点。

对该图进行BFS结果为 ABCDEF (通常情况下,BFS结果不唯一,如ACBDEF ,ACBEDF都是BFS的结果)。

虽然BFS的结果不唯一,但如ABCEDF并不是BFS的结果(因为BE之间不相连)。

 

DFS

DFS同BFS一样,同样是从一个节点开始,随便选一条路,直到走到不能走再往回走。

同样以这张图为例,以A为源节点进行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、付费专栏及课程。

余额充值