📜  python 深度优先搜索 - Python (1)

📅  最后修改于: 2023-12-03 15:34:12.909000             🧑  作者: Mango

Python 深度优先搜索

深度优先搜索(Depth-First Search,DFS)是一种搜索算法,它是从根节点开始探索,一直到某个分支到达叶节点为止,然后回溯到该节点的父节点继续搜索。DFS 可以用递归或栈的方式实现。

递归实现

下面是使用递归实现 DFS 的 Python 代码:

def dfs_recursive(graph, start, visited=None):
    if visited is None:
        visited = set()
    visited.add(start)
    print(start, end=' ')
    for neighbor in graph[start] - visited:
        dfs_recursive(graph, neighbor, visited)

其中,graph 表示图,start 表示开始节点,visited 表示已经访问过的节点(默认为 None)。首先把 start 加入 visited 集合中,然后打印 start,接着对 start 的邻居节点执行递归操作(如果邻居节点没有被访问过)。

栈实现

下面是使用栈实现 DFS 的 Python 代码:

def dfs_stack(graph, start):
    visited, stack = set(), [start]
    while stack:
        vertex = stack.pop()
        if vertex not in visited:
            visited.add(vertex)
            print(vertex, end=' ')
            stack.extend(graph[vertex] - visited)

其中,graph 表示图,start 表示开始节点。首先创建两个集合 visited 和栈 stack,把 start 加入栈中,然后循环执行以下操作:弹出栈顶节点 vertex,如果 vertex 没有被访问过,则把它加入 visited 集合并打印,接着把 vertex 的邻居节点加入栈中(如果邻居节点没有被访问过)。

应用场景

DFS 可以用于解决一些图论问题,例如:

  • 判断两个节点之间是否存在路径
  • 搜索图中的所有连通分量
  • 拓扑排序
  • 遍历迷宫、棋盘等问题
总结

Python 实现 DFS 有两种方式:递归和栈。递归实现简单,但可能会因为递归层数过深而导致栈溢出;栈实现需要手动维护一个栈,但比递归实现更节省内存。DFS 可以应用于一些图论问题,是算法学习中必不可少的算法之一。