广度优先搜索
广度优先搜索是一种常用的图形算法,用于从一幅图中找到一条从起点到终点的最短路径。其实现方式是从起点开始,逐层地向外扩展,直到找到终点为止。具体操作是先将起点放入队列,然后依次将起点的相邻节点加入队列,同时标记这些节点已经访问过,然后从队列中取出下一个节点,重复上述步骤,直到找到了终点或者队列为空为止。如果找到了终点,可以通过回溯来还原出从起点到终点的最短路径。
广度优先搜索的时间复杂度为O(V+E),其中V是图的节点数,E是图的边数。它适用于非加权图以及具有相同边权重的加权图。在实际应用中,广度优先搜索可以用来寻找最短路径、连通性检测、拓扑排序等问题。
广度优先搜索的伪代码:
BFS(Graph G, Node start_node, Node target_node):
Queue q // 用于存储待访问的节点
Set visited // 用于存储已经访问过的节点
q.enqueue(start_node) // 将起点放入队列
visited.add(start_node) // 标记起点已经访问过
while q is not empty: // 队列不为空时
curr_node = q.dequeue() // 取出队列中的下一个节点
if curr_node == target_node: // 如果找到了终点,则返回路径
return path
for neighbor in G.adjacent(curr_node): // 遍历当前节点的相邻节点
if neighbor not in visited: // 如果该节点没有被访问过
visited.add(neighbor) // 标记为已访问
neighbor.parent = curr_node // 记录路径
q.enqueue(neighbor) // 将该节点加入队列
return None // 如果遍历完整张图都没有找到终点,则返回空
广度优先遍历算法与深度优先遍历算法具有一定相通的性质,例如广度优先遍历算法也可以解决走迷宫问题。但如果使用广度优先遍历思想的走迷宫,因为其搜索的条件发生了改变,搜索的宗旨就不在于最快地有逻辑地走出迷宫,而在于寻遍迷宫的每一个角落。
深度优先搜索
广度优先搜索走迷宫
1每条路都走
2、继续走
3、直到有路
小结
广度优先搜索和深度优先搜索都是常用的图形遍历算法,它们的具体特点和适用场景如下:
广度优先搜索
广度优先搜索的主要特点是层次遍历图的节点。在遍历时,经常使用队列的数据结构进行实现。查找到目标节点时,就可以确定该路径为最短路径。广度优先搜索的适用场景包括:
- 找到两个节点之间的最短路径问题;
- 检测一个图是否为一棵树;
- 查找一个连通图中的所有连通分量,或者检测有多少个连通分量;
- 拓扑排序问题等。
广度优先搜索的时间复杂度为O(V+E),其中V是图的节点数,E是图的边数。
深度优先搜索
深度优先搜索的主要特点是访问尽可能远的节点,递归实现较为方便。当找到目标节点时,由于它可能不是当前深度最大的节点,所以不能够保证找到的路径是最短的。深度优先搜索的适用场景包括:
- 找到任意一条路径或所有路径问题,例如,迷宫问题;
- 检测一个图是否联通;
- 解决数组组合问题等。
深度优先搜索的时间复杂度为O(V+E),例如,邻接表表示的图的遍历时每个边都只会遍历一次。
需要注意的是,由于深度优先搜索使用递归实现,因此在遇到深度较大的树或图时可能会出现栈溢出的问题,需要采取一些措施避免这种情况的发生。