📜  dfs 算法 - Python (1)

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

DFS 算法 - Python

DFS (深度优先搜索) 算法是一种用于遍历和搜索树结构和图结构的算法。DFS 的核心思想是从一个起点开始沿着一个路径尽可能深度地搜寻,直到到达一个死胡同。然后返回到前一个节点,尝试另一个可行路径继续搜索。

实现算法

我们可以用递归或者栈来实现 DFS 算法。

首先,让我们来看看递归实现。

def dfs_recursive(node):
    if node is None:
        return

    visited.add(node)

    for neighbor in get_neighbors(node):
        if neighbor not in visited:
            dfs_recursive(neighbor)

在这个例子中,我们将根节点作为输入参数传递给算法,然后递归地访问其所有邻居节点。对于每个邻居节点,如果它还没有被访问过,我们就递归地调用 dfs_recursive 函数。

接下来,让我们看看如何用栈实现 DFS 算法。

def dfs_stack(node):
    stack = [node]

    while stack:
        curr_node = stack.pop()

        if curr_node not in visited:
            visited.add(curr_node)

            for neighbor in get_neighbors(curr_node):
                stack.append(neighbor)

这个例子中,我们使用栈来模拟递归。我们从根节点开始,将其压入栈中。然后,在 while 循环中,我们从栈中弹出当前节点并访问它。如果它还没有被访问过,我们将其标记为已访问,然后将其所有邻居节点压入栈中。

时间复杂度

DFS 算法的时间复杂度取决于搜索到的节点数量。在最坏的情况下,我们需要遍历整个图或者树,因此时间复杂度为 $O(|V| + |E|)$。其中,$|V|$ 是图或者树中节点的数量,$|E|$ 是边的数量。

空间复杂度

由于 DFS 算法使用递归或者栈来追踪遍历的路径,因此空间复杂度取决于遍历的最大深度。在最坏的情况下,我们需要遍历整个树或者图,因此空间复杂度为 $O(|V|)$。

用例

DFS 算法可以用于解决以下问题:

  • 查找图中的连通分量
  • 找到从一个节点到另一个节点的所有路径
  • 生成树和森林
  • 拓扑排序
总结

DFS 算法是一种用于遍历和搜索图和树的算法。它有多种实现方法,包括递归和栈。DFS 算法的时间复杂度为 $O(|V| + |E|)$,空间复杂度为 $O(|V|)$。它可以用于解决多种问题,如查找连通分量和找到从一个节点到另一个节点的所有路径。