图的遍历算法 —— BFS 和 DFS 的 Python 实现
程序员文章站
2022-05-24 08:47:03
...
BFS 和 DFS 是遍历图节点常用的算法
考虑下面的图,不考虑边的权重:
可以用 字典 来存储,key 为顶点,value 为相邻顶点的列表(如果考虑边的权值,则 value 为包含了边权重的字典):
G = {
'A': ['B', 'C', 'G'],
'B': ['A', 'D', 'G', 'E'],
'C': ['A'],
'D': ['B', 'C', 'E'],
'E': ['B', 'D', 'F'],
'F': ['E'],
'G': ['A', 'B']
}
1. DFS
DFS 为深度优先遍历算法,首先考虑深度,等遍历完深度后再考虑广度
算法步骤:
- 出发顶点 start 先入栈,标记为 visited
- 弹出栈顶的一个顶点,将该顶点的相邻未被访问过的顶点 neighbors 入栈,将它们都标记为已访问
- 重复上一步,直到栈空
我们可以使用 list
的 pop()
和 append()
充当栈的功能:
def DFS(G, start):
stack = []
result = []
visited = []
stack.append(start)
visited.append(start)
while stack != []:
node = stack.pop()
neighbors = G[node]
for neighbor in neighbors:
if neighbor not in visited:
stack.append(neighbor)
visited.append(neighbor)
result.append(node)
return result
结果为:
['A', 'G', 'C', 'B', 'E', 'F', 'D']
2. BFS
BFS 为广度优先,刚好与 DFS 相反
算法步骤:
- 出发顶点 start 先入队列,标记为 visited
- 第一个顶点出队列,将该顶点的相邻未被访问过的顶点 neighbors 入队列,将它们都标记为已访问
- 重复上一步,直到队列为空
我们可以使用 list
的 pop(0)
和 append()
充当队列 queue 的功能:
def DFS(G, start):
stack = []
result = []
visited = []
stack.append(start)
visited.append(start)
while stack != []:
node = stack.pop()
neighbors = G[node]
for neighbor in neighbors:
if neighbor not in visited:
stack.append(neighbor)
visited.append(neighbor)
result.append(node)
return result
print(BFS(G, 'A'))
结果为:
['A', 'B', 'C', 'G', 'D', 'E', 'F']
对比两个算法可以发现,顶点都是从列表尾部进去,唯一的差别在于出列表的元素,一个是列表尾部(stack)一个是列表首部(queue)
完结 ????
上一篇: 题目483:Nightmare
下一篇: 图的DFS/BFS遍历及基本操作
推荐阅读
-
python实现的二叉树算法和kmp算法实例
-
Python实现输入二叉树的先序和中序遍历,再输出后序遍历操作示例
-
[PHP] 算法-根据前序和中序遍历结果重建二叉树的PHP实现
-
Python和GO语言实现的消息摘要算法示例
-
Python实现常见的几种加密算法(MD5,SHA-1,HMAC,DES/AES,RSA和ECC)
-
NLP学习(四)规则分词-正向、逆向和双向最大匹配算法的中文分词-python3实现
-
可能是目前为止最为详细的深度优先搜索DFS和广度优先搜索BFS算法分析
-
Java数据结构与算法:图、图的概念、深度优先搜索DFS、广度优先搜索BFS、思路分析、代码实现
-
【数据结构】图的遍历——深度优先搜索DFS、广度优先搜索BFS
-
数据结构与算法————图的遍历DFS深度优先搜索和BFS广度优先搜索