彻底搞懂图的广度优先算法

本文详细介绍了广度优先搜索(BFS)算法的思想、步骤和代码实现。通过图解和实例展示了BFS如何进行分层搜索,并与深度优先搜索(DFS)进行了对比。此外,还提供了BFS算法的Java代码实现,包括核心算法方法和重载方法,并通过邻接矩阵展示了算法的运行过程。最后,文章总结了BFS的关键点和与DFS的区别。
摘要由CSDN通过智能技术生成

 广度优先算法

算法的思想,算法步骤,代码实现与分析,最后"debug+图解"展示展开

会有一定的图示,以便于更好的理解(博主的自我思考,如有错误,欢迎指正)

需要源码与相关图解请评论区留言

DOC注释在深度优先算法中,若不看,则当前代码无法熟知

博主空间https://blog.csdn.net/JOElib?spm=1010.2135.3001.5343深度优先算法(含Javadoc)https://blog.csdn.net/JOElib/article/details/123978630?spm=1001.2014.3001.5501winRAR系列https://blog.csdn.net/JOElib/article/details/123965081?spm=1001.2014.3001.5501


目录

算法思想🐼

算法步骤🐼 

代码实现与分析🐼 

1.创建BFS(广度优先)核心算法方法🐻

代码分析:🐨

2.创建BFS方法的重载方法🐻

Debug与图解🐼

结论: 


算法思想🐼

  • 广度优先搜索类似于一个分层搜索的过程,广度优先搜索需要调用一个队列以保持访问过节点的顺序,以便这个顺序来访问这些节点和邻接节点

算法步骤🐼 

  1.  访问初始节点v,并标记该节点为已访问
  2.  将节点v放入队列
  3. 当队列为非空时,继续执行,否则算法结束
  4. 出队列,取得队列头结点为u
  5. 查找节点u的第一个邻接节点w
  6. 若u的邻接节点不存在,则继续执行步骤3,否则循环执行下面三个操作
    1. 节点若未被访问,访问该节点并标记为已读
    2. 节点w加入队列
    3. 查找节点u的后继节点后的下一个邻接节点,转到步骤6

代码实现与分析🐼 

1.创建BFS(广度优先)核心算法方法🐻

严格遵守算法步骤 

private void bfs(boolean[] isVisited, int v) {
        var queue = new LinkedList<Integer>();
        System.out.println(getItem(v));
        isVisited[v] = true;
        queue.addLast(v);
        while (!queue.isEmpty()) {
            var u = queue.removeFirst();
            var w = getFirstVertex(u);
            while (w != -1) {
                if (!isVisited[w]) {
                    System.out.println(getItem(w));
                    isVisited[w] = true;
                }
                w = getVertexByLast(u,w);
            }
        }
    }

代码分析:🐨

  1. 创建一个双向链表集合,从而模拟队列,并指定泛型为Integer
  2. 访问当前节点,并将当前节点标记为已读
  3. 将当前节点加入到队列中
    1. 注意:这里一定要调用addLast()方法,因为要模拟队列,必须遵守先进先出后进后出的原则,如排队一般,最新进来的人排到最后
  4. 当队列不为空的时候循环执行以下代码(即:调用集合的isEmpty()方法)
    1. 取出队列的头节点,为u
      1. 注意:一定要调用removeFirst()方法,该方法返回被删除的元素,因为队列的先进先出,所以,我们要取最开始进入的元素
    2. 调用getFirstVertex()方法,找到他的第一个邻接节点
    3. 若该邻接节点存在
      1. 先判断该邻接节点是否被访问,即!isVisited[w],如果没有被访问,则进入访问该节点并标记为已读,并将该节点加入队列
      2. 无论是否被访问,都要找到该下一个邻接节点,否则无法体现出BFS
        1. 注意:这里一定要记住赋值操作

2.创建BFS方法的重载方法🐻

@First("The BFS should be firstly invoked")
public void bfs() {
        for (int i = 0; i < vertexList.size(); i++) {
            if (!isVisited[i]) {
                bfs(isVisited,i);
            }
        }
}

Debug与图解🐼

以该"图"展开分析

对应的邻接矩阵(ABCDE对应的下标分别是01234)

 

 

 

 

 

 重复上述的操作,直到

 


结论: 

        广度优先算法就这样结束了,相比较于深度优先算法,广度优先的难度大致一样,我来总结以下几点

        1.广度优先算法的算法步骤

        2.广度优先算法与深度优先算法的区别

        3.广度优先算法的算法实现 

        🚇下一站:B,B+,B*的介绍与图的创建

  • 34
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 43
    评论
BFS广度优先搜索算法(Breadth-First Search)是一种的搜索算法,也是最简便的搜索算法之一。它的目的是系统地展开并检查中的所有节点,以找寻结果。这个算法不考虑结果的可能位置,而是彻底地搜索整张,直到找到结果为止。广度优先搜索算法通常用于找出两个节点之间的最短路径。它可以帮助我们解决类似于寻找最短路径的问题。 BFS算法的基本思想是从起始节点开始,逐层地向外扩展,先访问离起始节点最近的节点,再逐渐向外层节点扩展,直到达到目标节点。它使用队列来存储待访问的节点,先进先出(FIFO)的特点保证了广度优先。通过不断地将节点加入队列并访问,直到队列为空,我们可以遍历整张并找到最短路径。 BFS广度优先搜索算法的运行时间为O(V+E),其中V为顶点数,E为边数。它可以指出是否存在从起始节点到目标节点的路径,并且可以找到最短路径。当面临需要寻找最短路径的问题时,我们可以使用来建立模型,并使用广度优先搜索算法解决问题。 参考资料: https://www.cnblogs.com/tianqizhi/p/9914539.html 文中引用的参考资料<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* [代码 基于BFS广度优先搜索算法代码](https://download.csdn.net/download/s13166803785/85545057)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] - *2* *3* [广度优先搜索算法(BFS)详解](https://blog.csdn.net/lemonxiaoxiao/article/details/105730735)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]
评论 43
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

爪哇土著、JOElib

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值