Python实现图的广度优先(BFS)与深度优先(DFS)搜索算法详解
本文详细解析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程序设计提供有益帮助。
本站声明
本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。













