depth first search深度优先搜索算法介绍
深度优先搜索(Depth-First Search, DFS)是一种用于遍历或搜索树或图的算法。这个算法沿着树的深度遍历树的节点,尽可能深地搜索树的分支。当节点v的所在边都已被探寻过,搜索将回溯到发现节点v的那条边的起始节点。这个过程一直进行到已发现从源节点可达的所有节点为止。如果还存在未被发现的节点,则另选一个未探索的节点作为源节点,重复以上过程,直到所有节点都被探索为止。
DFS 的基本思想
访问顶点:选择一个顶点作为起始点,标记为已访问。
探索邻接点:从当前顶点出发,探索其所有未被访问的邻接点。对于每个邻接点,递归地执行DFS。
回溯:若当前顶点的所有邻接点都已被访问,则回溯到该顶点的前一个顶点。
DFS 的实现方式
DFS 可以通过递归或栈(显式或隐式)来实现。
递归实现
递归实现是最直观和简单的方式。对于每个顶点,我们检查其所有未被访问的邻接点,并对每个邻接点递归地执行DFS。
def dfs(graph, node, visited=None):
if visited is None:
visited = set()
if node not in visited:
print(node)
visited.add(node)
for neighbour in graph[node]:
dfs(graph, neighbour, visited)
# 示例图(邻接表表示)
graph = {
'A': ['B', 'C'],
'B': ['D', 'E'],
'C': ['F'],
'D': [],
'E': ['F'],
'F': []
}
# 从顶点 'A' 开始DFS
dfs(graph, 'A')
栈实现
栈实现DFS需要手动管理一个栈来模拟递归的调用栈。
def dfs_iterative(graph, start):
visited = set()
stack = [start]
while stack:
vertex = stack.pop()
if vertex not in visited:
print(vertex)
visited.add(vertex)
# 注意,这里是将邻接点加入栈,实现的是后序遍历的效果
# 如果需要前序遍历,则将邻接点push的顺序调整即可
stack.extend(reversed(graph[vertex]))
# 从顶点 'A' 开始DFS
dfs_iterative(graph, 'A')
DFS 的应用
DFS 在许多领域都有应用,包括:
图的遍历:找到图中所有的节点。
拓扑排序:在有向无环图(DAG)中,对顶点进行线性排序。
解决迷宫问题:找到从起点到终点的路径。
连接组件:查找图中所有的连接组件。
强连通组件:在有向图中查找所有的强连通组件。
回溯算法:在解决某些类型的优化问题时,DFS 可用于生成所有可能的候选解。
depth first search深度优先搜索算法python实现样例
下面是一个python实现的深度优先搜索算法的示例代码:
# 创建一个图的类
class Graph:
def __init__(self):
self.graph = {}
# 添加边
def add_edge(self, node, edges):
self.graph[node] = edges
# 深度优先搜索算法
def dfs(self, start_node):
visited = set()
def dfs_helper(node):
visited.add(node)
print(node, end=' ')
for neighbor in self.graph[node]:
if neighbor not in visited:
dfs_helper(neighbor)
dfs_helper(start_node)
# 测试代码
if __name__ == '__main__':
g = Graph()
g.add_edge(0, [1, 2, 3])
g.add_edge(1, [0, 4, 5])
g.add_edge(2, [0, 6])
g.add_edge(3, [0, 7])
g.add_edge(4, [1])
g.add_edge(5, [1])
g.add_edge(6, [2])
g.add_edge(7, [3])
g.dfs(0)
输出结果为:0 1 4 5 2 6 3 7