在搜索过程中,为了避免重复遍历同一个节点,通常需要使用visited列表记录节点是否已被访问过。BFS和DFS都需要使用visited列表,但它们的实现方式略有不同。
BFS的visited列表一般使用一个集合(set)或哈希表(hash table)实现,每次访问节点时将其加入集合或哈希表中。此后再遇到该节点,就能快速地从集合或哈希表中查找,以判断该节点是否已被访问过。以下是一个使用哈希表记录visited的示例:
from collections import deque
def bfs(start, end, graph):
queue = deque([start])
visited = {start} # 使用哈希表记录visited
while queue:
node = queue.popleft()
if node == end:
return True # 找到目标节点
for neighbor in graph[node]:
if neighbor not in visited:
visited.add(neighbor)
queue.append(neighbor)
return False # 未找到目标节点
DFS的visited列表一般使用一个列表(list)或数组(array)实现,每次访问节点时将其在visited中对应的位置标记为已访问。列表或数组的下标通常对应节点的编号或哈希值,从而能够在O(1)时间内访问和修改visited。以下是一个使用列表记录visited的示例:
def dfs(node, end, graph, visited):
if node == end:
return True # 找到目标节点
visited[node] = True # 标记节点已访问
for neighbor in graph[node]:
if not visited[neighbor]:
if dfs(neighbor, end, graph, visited):
return True
return False # 未找到目标节点
# 在主函数中使用visited列表
visited = [False] * n
dfs(start, end, graph, visited)
需要注意的是,如果节点编号或哈希值非常大,使用列表可能会导致内存不足或访问速度过慢。此时可以使用Python的内置哈希表dict或第三方库的hashtable来实现visited。
上一篇:BFS和DFS的缺点
下一篇:BFS和DFS目标检查