深度优先搜索(Depth-First Search, DFS)是一种用于遍历或搜索树或图的算法。这个算法会尽可能深地搜索树的分支。当节点v的所在边都已被探寻过,搜索将回溯到发现节点v的那条边的起始节点。这个过程一直进行到已发现从源节点可达的所有节点为止。如果还存在未被发现的节点,则选择其中一个作为源节点并重复以上过程,整个进程反复进行直到所有节点都被访问为止。
DFS 的基本思想
1、选择:从某个顶点v出发,选择一条从v出发的未探索的边。
2、标记:标记这条边为已探索,并沿着这条边移动到下一个顶点。
3、归:继续深度优先搜索,直到当前顶点v的所有边都已探索完毕。
4、回溯:如果顶点v的所有边都已探索完毕,回溯到v的前一个顶点,并尝试v的其他未探索的边。
DFS 的应用
1、图的遍历:可以用来遍历或搜索图中的所有顶点。
2、解决迷宫问题:寻找从起点到终点的路径。
3、拓扑排序:在有向无环图(DAG)中,对所有顶点进行线性排序,使得对于任何从顶点u到顶点v的有向边,u在排序中都出现在v的前面。
4、检测环:在图中检测是否存在环。
DFS 的实现
DFS 可以通过递归或栈(显式或隐式)来实现。以下是使用递归方式实现DFS的基本伪代码:
def DFS(visited, graph, node):
if node not in visited:
print(node)
visited.add(node)
for neighbour in graph[node]:
DFS(visited, graph, neighbour)
# 示例图,以邻接表形式表示
graph = {
'A': ['B', 'C'],
'B': ['D', 'E'],
'C': ['F'],
'D': [],
'E': ['F'],
'F': []
}
visited = set()
DFS(visited, graph, 'A')
在这个示例中,我们从节点’A’开始进行深度优先搜索。visited集合用于跟踪已经访问过的节点,以防止重复访问和陷入无限循环。graph是一个以邻接表形式表示的图。
注意事项
当图不是连通图时,需要选择多个未访问的顶点作为起始点进行DFS,以确保所有顶点都被访问到。
DFS可能会因为图的结构而访问到同一顶点多次(尤其是在有环的图中),但每个顶点在visited集合中只会被记录一次。
DFS的时间复杂度依赖于图的结构和实现的具体细节,但通常是O(V + E),其中V是顶点的数量,E是边的数量。