欢迎访问宙启技术站
智能推送

使用队列在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是逐层进行扩展的,所以可以找到最短路径。