使用队列在Python中实现广度优先搜索算法
发布时间:2023-12-23 18:32:09
广度优先搜索(BFS)是一种图搜索算法,用于在图中找到从起始节点到目标节点的最短路径。BFS从起始节点开始,逐层地向外扩展,直到找到目标节点或者遍历完整个图。在BFS中,我们使用队列来保存待扩展的节点。
下面是一个使用队列实现BFS算法的Python例子:
from collections import deque
# 定义图的节点类
class Node:
def __init__(self, value):
self.value = value
self.edges = []
def add_edge(self, node):
self.edges.append(node)
# 广度优先搜索算法
def bfs(start_node, target_value):
# 使用双向队列作为待扩展的节点队列
queue = deque()
# 使用集合记录已经访问过的节点
visited = set()
# 将起始节点放入队列
queue.append(start_node)
while queue:
# 取出队列中的当前节点
current_node = queue.popleft()
# 如果当前节点已经被访问过,则跳过
if current_node in visited:
continue
# 将当前节点标记为已访问
visited.add(current_node)
# 如果当前节点的值等于目标值,则找到目标节点
if current_node.value == target_value:
return current_node
# 将当前节点的相邻节点加入队列
for edge in current_node.edges:
if edge not in visited:
queue.append(edge)
# 如果队列为空,表示遍历完整个图也没找到目标节点
return None
# 创建图的节点
nodeA = Node("A")
nodeB = Node("B")
nodeC = Node("C")
nodeD = Node("D")
nodeE = Node("E")
# 添加节点之间的边
nodeA.add_edge(nodeB)
nodeA.add_edge(nodeC)
nodeB.add_edge(nodeD)
nodeD.add_edge(nodeE)
# 使用BFS算法查找从起始节点A到目标节点E的最短路径
result = bfs(nodeA, "E")
# 输出最短路径
if result:
path = []
current_node = result
while current_node:
path.append(current_node.value)
current_node = current_node.parent
path.reverse()
print("最短路径:", "->".join(path))
else:
print("未找到最短路径")
在上述例子中,我们首先定义了图的节点类Node,每个节点都有一个值和一个包含相邻节点的列表edges。然后,我们使用Node类创建图的节点,并通过add_edge方法添加节点之间的边。
接下来,我们实现了bfs函数来进行广度优先搜索。函数使用双向队列deque作为待扩展的节点队列,使用集合visited记录已经访问过的节点。在每一次循环中,我们取出队列中的当前节点current_node,并将其标记为已访问。然后,判断当前节点的值是否等于目标值,如果是,则找到了目标节点,返回该节点。如果不是,则将当前节点的相邻节点加入队列。
最后,我们使用bfs函数查找从起始节点A到目标节点E的最短路径。如果找到了最短路径,则输出该路径;否则,输出未找到最短路径的提示信息。
通过使用队列实现BFS算法,我们可以在图中找到从起始节点到目标节点的最短路径。BFS算法的时间复杂度是O(V+E),其中V是图中的节点数,E是图中的边数。而且,由于BFS是逐层进行扩展的,所以可以找到最短路径。
