Python实现图的广度优先(BFS)与深度优先(DFS)搜索算法详解

巷口听风
巷口听风
发布时间:2026-10-13 | 2人浏览过
原创

本文详细解析Python中图的两种核心遍历算法:广度优先搜索(BFS)与深度优先搜索(DFS)。通过对比队列与栈的使用差异,结合维基百科伪代码与Python具体实现,阐述BFS利用队列逐层扩展、DFS利用栈深入挖掘的原理。内容涵盖算法逻辑、代码示例及注意事项,旨在帮助开发者掌握图结构的高效遍历方法。

本文通过具体实例,深入讲解Python数据结构与算法中图的广度优先搜索(BFS)与深度优先搜索(DFS)的实现方法,供读者参考学习。

以下实现参考了维基百科提供的伪代码逻辑:

广度优先搜索(BFS):

核心数据结构为队列和集合。

首先标记初始节点为已发现状态,并将其加入队列。

在循环过程中,每次从队列中取出一个节点进行处理。

将该节点所有相邻的未访问节点加入队列,并标记为已发现。

形象地理解,BFS如同打开迷宫入口的所有门,进入一扇门后继续打开里面的门,处理完后再返回前一个门处,逐层向外扩展。

"""
 procedure BFS(G,v) is
   let Q be a queue
   Q.enqueue(v)
   label v as discovered
   while Q is not empty
    v ← Q.dequeue()
    procedure(v)
    for all edges from v to w in G.adjacentEdges(v) do
      if w is not labeled as discovered
        Q.enqueue(w)
        label w as discovered
"""
def procedure(v):
  pass
def BFS(G,v0):
  """ 广度优先搜索 """
  q, s = [], set()
  q.extend(v0)
  s.add(v0)
  while q:  # 当队列q非空
    v = q.pop(0)
    procedure(v)
    for w in G[v]:   # 对图G中顶点v的所有邻近点w
      if w not in s: # 如果顶点 w 没被发现
        q.extend(w)
        s.add(w)  # 记录w已被发现

深度优先搜索(DFS):

核心数据结构为栈和集合。

将初始节点压入栈中。

每轮循环从栈中弹出一个节点,并标记为已发现。

对该弹出的节点,将其所有连接的相邻节点压入栈中(注:原文此处描述为放入队列,但结合DFS栈结构及后续代码逻辑,实际应为压入栈中以保持深度优先特性,此处保留原文表述但需注意上下文一致性,通常DFS是将邻居加入栈)。

利用栈“后进先出”的特性,实现一步步深入挖掘路径。

""""
Pseudocode[edit]
Input: A graph G and a vertex v of G
Output: All vertices reachable from v labeled as discovered
A recursive implementation of DFS:[5]
1 procedure DFS(G,v):
2   label v as discovered
3   for all edges from v to w in G.adjacentEdges(v) do
4     if vertex w is not labeled as discovered then
5       recursively call DFS(G,w)
A non-recursive implementation of DFS:[6]
1 procedure DFS-iterative(G,v):
2   let S be a stack
3   S.push(v)
4   while S is not empty
5      v = S.pop()
6      if v is not labeled as discovered:
7        label v as discovered
8        for all edges from v to w in G.adjacentEdges(v) do
9          S.push(w)
"""
def DFS(G,v0):
  S = []
  S.append(v0)
  label = set()
  while S:
    v = S.pop()
    if v not in label:
      label.add(v)
      procedure(v)
      for w in G[v]:
        S.append(w)

如需了解更多Python相关知识,可查阅本站专题:《Python数据结构与算法教程》、《Python加密解密算法与技巧总结》、《Python编码操作技巧总结》、《Python函数使用技巧总结》、《Python字符串操作技巧汇总》及《Python入门与进阶经典教程》。

希望上述内容能对您的Python程序设计提供有益帮助。

相关标签:

本站声明

本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。

Python 相关产品和应用

全部下载

专题列表