如何通过Python代码实例实现基于BFS和DFS的模拟?

2026-05-05 13:081阅读0评论SEO基础
  • 内容介绍
  • 文章标签
  • 相关推荐

本文共计558个文字,预计阅读时间需要3分钟。

如何通过Python代码实例实现基于BFS和DFS的模拟?

BFS算法是一种用于图和树遍历的算法,它按照广度优先的原则,从源节点开始,逐层探索所有可达节点。BFS算法通常使用队列来实现,具体步骤如下:

1. 初始化:创建一个队列和一个集合,分别用于存储待访问的节点和已访问过的节点。

2.将源节点入队,并将源节点加入已访问集合。

3.当队列为空时,算法结束。

4.从队列中取出一个节点,并将其所有未访问过的邻接节点加入队列和已访问集合。

5.重复步骤4,直到队列为空。

BFS算法的优点是能够找到最短路径,并且在无权图中,BFS总是能够找到最短路径。其缺点是对于稠密图,BFS的空间复杂度较高,因为它需要存储所有已访问过的节点。

BFS

如何通过Python代码实例实现基于BFS和DFS的模拟?

""" # @Time : 2020/11/8 # @Author : Jimou Chen """ # 广搜 def bfs(graph, start): queue = [start] # 先把起点入队列 visited = set() # 访问国的点加入 visited.add(start) while len(queue): vertex = queue.pop(0) # 找到队列首元素的连接点 for v in graph[vertex]: if v not in visited: queue.append(v) visited.add(v) # 打印弹出队列的该头元素 print(vertex, end=' ') if __name__ == '__main__': graph = { 'A': ['B', 'D', 'I'], 'B': ['A', 'F'], 'C': ['D', 'E', 'I'], 'D': ['A', 'C', 'F'], 'E': ['C', 'H'], 'F': ['B', 'H'], 'G': ['C', 'H'], 'H': ['E', 'F', 'G'], 'I': ['A', 'C'] } bfs(graph, 'A')

A B D I F C H E G
Process finished with exit code 0

DFS

""" # @Time : 2020/11/8 # @Author : Jimou Chen """ # 深搜 def dfs(graph, start): stack = [start] visited = set() visited.add(start) while len(stack): vertex = stack.pop() # 找到栈顶元素 for v in graph[vertex]: if v not in visited: stack.append(v) visited.add(v) print(vertex, end=' ') if __name__ == '__main__': graph = { 'A': ['B', 'D', 'I'], 'B': ['A', 'F'], 'C': ['D', 'E', 'I'], 'D': ['A', 'C', 'F'], 'E': ['C', 'H'], 'F': ['B', 'H'], 'G': ['C', 'H'], 'H': ['E', 'F', 'G'], 'I': ['A', 'C'] } dfs(graph, 'E')

E H G F B A I D C
Process finished with exit code 0

总结

很明显一个用了队列,一个用了栈

利用python语言优势,只需改动pop即可

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持易盾网络。

本文共计558个文字,预计阅读时间需要3分钟。

如何通过Python代码实例实现基于BFS和DFS的模拟?

BFS算法是一种用于图和树遍历的算法,它按照广度优先的原则,从源节点开始,逐层探索所有可达节点。BFS算法通常使用队列来实现,具体步骤如下:

1. 初始化:创建一个队列和一个集合,分别用于存储待访问的节点和已访问过的节点。

2.将源节点入队,并将源节点加入已访问集合。

3.当队列为空时,算法结束。

4.从队列中取出一个节点,并将其所有未访问过的邻接节点加入队列和已访问集合。

5.重复步骤4,直到队列为空。

BFS算法的优点是能够找到最短路径,并且在无权图中,BFS总是能够找到最短路径。其缺点是对于稠密图,BFS的空间复杂度较高,因为它需要存储所有已访问过的节点。

BFS

如何通过Python代码实例实现基于BFS和DFS的模拟?

""" # @Time : 2020/11/8 # @Author : Jimou Chen """ # 广搜 def bfs(graph, start): queue = [start] # 先把起点入队列 visited = set() # 访问国的点加入 visited.add(start) while len(queue): vertex = queue.pop(0) # 找到队列首元素的连接点 for v in graph[vertex]: if v not in visited: queue.append(v) visited.add(v) # 打印弹出队列的该头元素 print(vertex, end=' ') if __name__ == '__main__': graph = { 'A': ['B', 'D', 'I'], 'B': ['A', 'F'], 'C': ['D', 'E', 'I'], 'D': ['A', 'C', 'F'], 'E': ['C', 'H'], 'F': ['B', 'H'], 'G': ['C', 'H'], 'H': ['E', 'F', 'G'], 'I': ['A', 'C'] } bfs(graph, 'A')

A B D I F C H E G
Process finished with exit code 0

DFS

""" # @Time : 2020/11/8 # @Author : Jimou Chen """ # 深搜 def dfs(graph, start): stack = [start] visited = set() visited.add(start) while len(stack): vertex = stack.pop() # 找到栈顶元素 for v in graph[vertex]: if v not in visited: stack.append(v) visited.add(v) print(vertex, end=' ') if __name__ == '__main__': graph = { 'A': ['B', 'D', 'I'], 'B': ['A', 'F'], 'C': ['D', 'E', 'I'], 'D': ['A', 'C', 'F'], 'E': ['C', 'H'], 'F': ['B', 'H'], 'G': ['C', 'H'], 'H': ['E', 'F', 'G'], 'I': ['A', 'C'] } dfs(graph, 'E')

E H G F B A I D C
Process finished with exit code 0

总结

很明显一个用了队列,一个用了栈

利用python语言优势,只需改动pop即可

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持易盾网络。