DFS(不同版本)

本文详细介绍了深度优先搜索(DFS)算法,包括其工作原理和与广度优先搜索(BFS)的区别。通过非递归和递归两种方式展示了DFS的Python代码实现,并提供了寻找图中两个顶点间最短路径的DFS版本。此外,还讨论了如何利用DFS找到所有可能的路径。这些内容对于理解图论和搜索算法至关重要。
摘要由CSDN通过智能技术生成

DFS(深度优先搜索)

DFS也是一种常见的图的搜索算法,与BFS不同,DFS不按层级遍历,而是从一条路径遍历到末尾,再返回原来的路径,选择另一路径继续相同的操作,直到全部遍历完成,或到达停止的条件,这一过程类似于走迷宫一样。因此我们还可以用递归的方法实现DFS算法。

在BFS算法中,我们借助了队列的数据结构,遵循先进先出原则,从而实现对每一层级的遍历。与之相反,在DFS,我们需要借助堆栈的数据结构,遵循后进先出原则,从而实现深度优先。

非递归方法的代码如下:

def dfs_1(graph, start):
    """
    return:返回依次序遍历的顶点
    """
    visited, stack = set(), [start]
    while stack:
        vertex = stack.pop()
        if vertex not in visited:
            visited.add(vertex)
            stack.extend(set(graph.get_connected_nodes(vertex)) - visited)
    return visited

递归方法的代码如下:

def dfs_rec(graph, node, visited=None):
    """
    return:返回依次序遍历的顶点
    """
    if visited is None:
        visited = []
    if node not in visited:
        visited.append(node)
        for neighbour in graph.get_connected_nodes(node):
            dfs_rec(graph, neighbour, visited)
    return visited

如果需要寻找两个顶点间的最短路径,可以采用类似在BFS中找最短路径的方法,代码结构基本一致,其中的细节需要做如下改动:

def dfs_path(graph, start, goal):
    """

    :param graph:
    :param start:
    :param goal:
    :return: return the path from start to goal, when the goal is found, the
    programme will stop.
    """
    pathlist=[(start,)]
    if start == goal:
        return [start]
    while len(pathlist) > 0:
        curr_path = pathlist.pop(0)
        curr_node = curr_path[-1]
        new_nodes = graph.get_connected_nodes(curr_node)
        if len(curr_path) > 1:
            new_nodes = [node for node in new_nodes if node not in curr_path]
        if goal in new_nodes:
            goal_path = curr_path + (goal, )
            return goal_path
        new_paths = [curr_path + (node, ) for node in new_nodes]
        new_paths.extend(pathlist)
        pathlist = new_paths
    else:
        return []

同时,如果需要找到所有的路径,基本思路与BFS的类似:

def dfs_all_path(graph, start, goal):
    """

    :param graph:
    :param start:
    :param goal:
    :return: return the list of all the paths from start to goal
    """
    stack = [(start, [start])]
    while stack:
        (vertex, path) = stack.pop()
        for next in set(graph.get_connected_nodes(vertex)) - set(path):
            if next == goal:
                yield path + [next]
            else:
                stack.append((next, path + [next]))
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值