深度优先遍历(Depth-First Search, DFS)和广度优先遍历(Breadth-First Search, BFS)是图论中两种重要的遍历算法,它们在解决各种问题时具有不同的优势和适用场景。
深度优先遍历是一种用于遍历或搜索树或图的算法。这个算法会尽可能深地搜索图的分支。当节点v的所在边都已被探寻过,搜索将回溯到发现节点v的那条边的起始节点。这一过程一直进行到已发现从源节点可达的所有节点为止。如果还存在未被发现的节点,则选择其中一个作为源节点并重复以上过程,整个进程反复进行直到所有节点都被访问为止。
def dfs(graph, start, visited=None):
if visited is None:
visited = set()
visited.add(start)
print(start, end=' ')
for next_node in graph[start] - visited:
dfs(graph, next_node, visited)
return visited
graph = {
'A' : set(['B', 'C']),
'B' : set(['A', 'D', 'E']),
'C' : set(['A', 'F']),
'D' : set(['B']),
'E' : set(['B', 'F']),
'F' : set(['C', 'E'])
}
dfs(graph, 'A')
广度优先遍历是一种图形搜索算法,从图的某一顶点出发,首先访问它的相邻节点,然后对这些相邻节点进行同样的操作,直到所有节点都被访问过。BFS使用队列数据结构来实现遍历。
from collections import deque
def bfs(graph, start):
visited = set()
queue = deque([start])
visited.add(start)
while queue:
vertex = queue.popleft()
print(vertex, end=' ')
for neighbour in graph[vertex]:
if neighbour not in visited:
visited.add(neighbour)
queue.append(neighbour)
graph = {
'A' : set(['B', 'C']),
'B' : set(['A', 'D', 'E']),
'C' : set(['A', 'F']),
'D' : set(['B']),
'E' : set(['B', 'F']),
'F' : set(['C', 'E'])
}
bfs(graph, 'A')
原因:递归深度过大时,系统栈空间不足。 解决方法:使用非递归的DFS实现,或者增加系统的栈大小。
原因:BFS需要存储同一层的所有节点。 解决方法:使用双向BFS减少内存消耗,或者优化数据结构的使用。
原因:图中存在环路,且未正确标记已访问节点。 解决方法:确保每个节点在访问后被标记为已访问,避免重复访问。
通过理解这两种算法的基本原理和应用场景,可以根据具体问题选择合适的遍历策略。
领取专属 10元无门槛券
手把手带您无忧上云