深度优先搜索(Depth-First Search,DFS)是一种用于遍历或搜索树或图的算法。这种算法会尽可能深地搜索树的分支。当节点v的所有边都已被探寻过,搜索将回溯到发现节点v的那条边的起始节点。这个过程一直进行到已发现从源节点可达的所有节点为止。如果还存在未被发现的节点,则选择其中一个作为源节点并重复以上过程,整个进程反复进行直到所有节点都被访问为止。
定义
深度优先搜索是一种先深度后广度的遍历算法,它沿着树的深度遍历树的节点,尽可能深地搜索树的分支。
原理
深度优先搜索的原理可以概括为以下几个步骤:
- 从根节点开始,将根节点标记为已访问。
- 遍历根节点的所有未访问的邻接节点,对每一个邻接节点:
a. 标记该节点为已访问。
b. 递归地执行深度优先搜索。 - 如果所有邻接节点都被访问过,回溯到上一个节点,继续执行步骤2,直到所有节点都被访问过。
用途
深度优先搜索算法有多种用途,包括但不限于:
- 查找图中的路径或连通性。
- 拓扑排序。
- 检测图中是否有环。
- 寻找图中的桥或割点。
Python Demo
下面是一个使用深度优先搜索算法遍历树的Python示例。
# 使用递归实现的深度优先搜索
def dfs_recursive(graph, node, visited):
if node not in visited:
print(node, end=" ")
visited.add(node)
for neighbour in graph[node]:
dfs_recursive(graph, neighbour, visited)
# 使用栈实现的深度优先搜索
def dfs_stack(graph, start_node):
visited = set()
stack = [start_node]
while stack:
node = stack.pop()
if node not in visited:
print(node, end=" ")
visited.add(node)
stack.extend(graph[node])
# 构建图
graph = {
'A': ['B', 'C'],
'B': ['D', 'E'],
'C': ['F'],
'D': [],
'E': ['F'],
'F': []
}
# 使用递归进行深度优先搜索
print("递归DFS:")
dfs_recursive(graph, 'A', set())
# 使用栈进行深度优先搜索
print("\n栈DFS:")
dfs_stack(graph, 'A')
这个示例中,我们定义了一个简单的无向图,并使用两种方法实现了深度优先搜索:一种是递归实现,另一种是使用栈。运行这段代码,会分别以递归和栈的方式打印出图的深度优先遍历结果。
--------------------------------------------------------------------------------------------------------------------------------------
作者个人简介:
💐大厂多年AI算法经验,创业中,兼任算法/产品/工程
🍎持续分享aigc干货
❤️提供人工智能相关岗位简历优化和技能辅导服务,欢迎骚扰。
🌺提供aigc产品推广服务
微信公众号:
Ai自然说
关注后,自动发送您一份ai算法学习路线资料,完全免费。
个人微信:
pichaqiu1
这是我的个人微信,欢迎添加,找我讨论AI相关的内容。
微信群:
攒了一个微信群,大家可以在里面讨论AI相关的技术、产品、运营、商业知识和资讯,欢迎扫码加入。
知识星球:
运营了一个知识星球,我在里面会定期分享一些关于ai的高质量干货,欢迎扫码加入。