广度优先算法
从算法的思想,算法步骤,代码实现与分析,最后"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
目录
算法思想🐼
- 广度优先搜索类似于一个分层搜索的过程,广度优先搜索需要调用一个队列以保持访问过节点的顺序,以便这个顺序来访问这些节点和邻接节点
算法步骤🐼
- 访问初始节点v,并标记该节点为已访问
- 将节点v放入队列
- 当队列为非空时,继续执行,否则算法结束
- 出队列,取得队列头结点为u
- 查找节点u的第一个邻接节点w
- 若u的邻接节点不存在,则继续执行步骤3,否则循环执行下面三个操作
- 节点若未被访问,访问该节点并标记为已读
- 节点w加入队列
- 查找节点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);
}
}
}
代码分析:🐨
- 创建一个双向链表集合,从而模拟队列,并指定泛型为Integer
- 访问当前节点,并将当前节点标记为已读
- 将当前节点加入到队列中
- 注意:这里一定要调用addLast()方法,因为要模拟队列,必须遵守先进先出后进后出的原则,如排队一般,最新进来的人排到最后
- 当队列不为空的时候循环执行以下代码(即:调用集合的isEmpty()方法)
- 取出队列的头节点,为u
- 注意:一定要调用removeFirst()方法,该方法返回被删除的元素,因为队列的先进先出,所以,我们要取最开始进入的元素
- 调用getFirstVertex()方法,找到他的第一个邻接节点
- 若该邻接节点存在
- 先判断该邻接节点是否被访问,即!isVisited[w],如果没有被访问,则进入访问该节点并标记为已读,并将该节点加入队列
- 无论是否被访问,都要找到该下一个邻接节点,否则无法体现出BFS
- 注意:这里一定要记住赋值操作
- 取出队列的头节点,为u
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与图解🐼
![](https://i-blog.csdnimg.cn/blog_migrate/9013b067eae97159eeb9f31a63f839b7.png)
![](https://i-blog.csdnimg.cn/blog_migrate/d11b2574f50510d1e90a0a62ddcd2863.png)
重复上述的操作,直到
结论:
广度优先算法就这样结束了,相比较于深度优先算法,广度优先的难度大致一样,我来总结以下几点
1.广度优先算法的算法步骤
2.广度优先算法与深度优先算法的区别
3.广度优先算法的算法实现
🚇下一站:B,B+,B*的介绍与图的创建