📜  python中的dfs和bfs(1)

📅  最后修改于: 2023-12-03 14:46:37.616000             🧑  作者: Mango

Python中的DFS和BFS

深度优先搜索(DFS)和广度优先搜索(BFS)是两个重要的图搜索算法,它们在许多算法和数据结构问题中都有广泛的应用。在Python中,我们可以使用递归和队列来实现这两个算法。

DFS

DFS从起点开始,尽可能深地搜索图,直到到达没有未探索节点的路径的端点。如果没有到达目标状态,那么就回溯到前一个状态,然后继续搜索。

以下是一个基本的DFS实现:

def dfs(graph, start, visited=None):
    if visited is None:
        visited = set()
    visited.add(start)
    
    for next in graph[start] - visited:
        dfs(graph, next, visited)
    
    return visited

这个函数接受一个无向图和一个起点作为参数,并返回一个包含所有已访问节点的集合。它使用递归来实现DFS。

我们可以通过以下方式来调用这个函数:

graph = {'A': {'B', 'C'},
         'B': {'A', 'D', 'E'},
         'C': {'A', 'F'},
         'D': {'B'},
         'E': {'B', 'F'},
         'F': {'C', 'E'}}

dfs(graph, 'A')

在这个例子中,我们从'A'开始,应该会得到{'A', 'B', 'C', 'D', 'E', 'F'}。

BFS

广度优先搜索比DFS更加迭代,并以与树的层次结构类似的顺序递增遍历节点。它依靠FIFO队列来管理已发现但未访问的节点,并使用一个跟踪每个节点距起点有多远的“step”字典。

以下是一个基本的BFS实现:

def bfs(graph, start):
    visited, queue = set(), [start]
    while queue:
        vertex = queue.pop(0)
        if vertex not in visited:
            visited.add(vertex)
            queue.extend(graph[vertex] - visited)
    return visited

这个函数接受一个无向图和一个起点作为参数,并返回一个包含所有已访问节点的集合。它使用队列来实现BFS。

我们可以通过以下方式来调用这个函数:

graph = {'A': {'B', 'C'},
         'B': {'A', 'D', 'E'},
         'C': {'A', 'F'},
         'D': {'B'},
         'E': {'B', 'F'},
         'F': {'C', 'E'}}

bfs(graph, 'A')

在这个例子中,我们从'A'开始,应该会得到{'A', 'B', 'C', 'D', 'E', 'F'}。

总结:DFS是一种自上而下的搜索策略,先深度搜索再回溯到前一个节点,BFS是一种自下而上的搜索策略,先广度搜索再逐层往下搜索。DFS可以使用递归来实现,BFS需要使用队列实现。在Python中,这两种算法都可以使用set和dict作为数据结构来表示无向图。