📅  最后修改于: 2023-12-03 14:46:37.616000             🧑  作者: Mango
深度优先搜索(DFS)和广度优先搜索(BFS)是两个重要的图搜索算法,它们在许多算法和数据结构问题中都有广泛的应用。在Python中,我们可以使用递归和队列来实现这两个算法。
DFS从起点开始,尽可能深地搜索图,直到到达没有未探索节点的路径的端点。如果没有到达目标状态,那么就回溯到前一个状态,然后继续搜索。
以下是一个基本的DFS实现:
def dfs(graph, start, visited=None):
if visited is None:
visited = set()
visited.add(start)
for next in graph[start] - visited:
dfs(graph, next, visited)
return visited
这个函数接受一个无向图和一个起点作为参数,并返回一个包含所有已访问节点的集合。它使用递归来实现DFS。
我们可以通过以下方式来调用这个函数:
graph = {'A': {'B', 'C'},
'B': {'A', 'D', 'E'},
'C': {'A', 'F'},
'D': {'B'},
'E': {'B', 'F'},
'F': {'C', 'E'}}
dfs(graph, 'A')
在这个例子中,我们从'A'开始,应该会得到{'A', 'B', 'C', 'D', 'E', 'F'}。
广度优先搜索比DFS更加迭代,并以与树的层次结构类似的顺序递增遍历节点。它依靠FIFO队列来管理已发现但未访问的节点,并使用一个跟踪每个节点距起点有多远的“step”字典。
以下是一个基本的BFS实现:
def bfs(graph, start):
visited, queue = set(), [start]
while queue:
vertex = queue.pop(0)
if vertex not in visited:
visited.add(vertex)
queue.extend(graph[vertex] - visited)
return visited
这个函数接受一个无向图和一个起点作为参数,并返回一个包含所有已访问节点的集合。它使用队列来实现BFS。
我们可以通过以下方式来调用这个函数:
graph = {'A': {'B', 'C'},
'B': {'A', 'D', 'E'},
'C': {'A', 'F'},
'D': {'B'},
'E': {'B', 'F'},
'F': {'C', 'E'}}
bfs(graph, 'A')
在这个例子中,我们从'A'开始,应该会得到{'A', 'B', 'C', 'D', 'E', 'F'}。
总结:DFS是一种自上而下的搜索策略,先深度搜索再回溯到前一个节点,BFS是一种自下而上的搜索策略,先广度搜索再逐层往下搜索。DFS可以使用递归来实现,BFS需要使用队列实现。在Python中,这两种算法都可以使用set和dict作为数据结构来表示无向图。