广度优先搜索

广度优先搜索

广度优先搜索是一种常用的图形算法,用于从一幅图中找到一条从起点到终点的最短路径。其实现方式是从起点开始,逐层地向外扩展,直到找到终点为止。具体操作是先将起点放入队列,然后依次将起点的相邻节点加入队列,同时标记这些节点已经访问过,然后从队列中取出下一个节点,重复上述步骤,直到找到了终点或者队列为空为止。如果找到了终点,可以通过回溯来还原出从起点到终点的最短路径。

广度优先搜索的时间复杂度为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),例如,邻接表表示的图的遍历时每个边都只会遍历一次。

需要注意的是,由于深度优先搜索使用递归实现,因此在遇到深度较大的树或图时可能会出现栈溢出的问题,需要采取一些措施避免这种情况的发生。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值