java学习笔记之图的遍历(广度优先搜索BFS)

图的遍历-----深度优先遍历(dfs),广度优先遍历(bfs)【java详解】 图的遍历是指,从给定图中任意指定的顶点(称为初始点)出发,按照某种搜索方法沿着图的边访问图中的所有顶点,使每个顶点仅被访问一次,这个过程称为图的遍历。遍历过程中得到的顶点序列称为图遍历序列。深度优先搜索(DFS,Depth First Search)广度优先搜索(BFS,Breadth First Search) 阅读详情

不知道有没小伙伴们跟我一样,在刚开始通过网络资源学习编程时,拿到大牛们的代码,总是希望拿到的是可以打印出结果的代码,但不解的是,大神似乎都不喜欢出示完整代码(这或许就是英雄所见略同吧偷笑)。我呢,是名编程菜鸟,最近想通过大牛们的经典算法代码重温算法和数据结构。本文代码是来自alibaba的Leo-Yang,网搜了一段时间的BFS\DFS算法理解,个人最喜欢他的图解解读,太赞啦!这是他的原文http://www.cnblogs.com/developerY/p/3323264.html,而我呢,在他通熟易懂的图解帮助下,终于理解BFS啦,同时也在他代码中注释了自己对各个函数的理解,并且在stone的帮助下,补充完成了main函数的代码,这样就成为看到打印的出结果的完整代码啦,还望网友们帮忙指正错误哈~



package example;


import java.util.HashMap;
import java.util.LinkedList;
import java.util.Queue;
/*广度遍历是遍历到某个顶点,然后访问其连接点a,b;接着访问a的连接表,
很自然的,这种数据结构就是HashMap,以顶点为key,保存每个顶点的连接表
*/
public class BFSbak {
public static void main(String args[])
{
BFSbak bb = new BFSbak();
// s顶点的邻接表
LinkedList<Character> list_s = new LinkedList<Character>();
list_s.add('w');
list_s.add('r');
LinkedList<Character> list_w = new LinkedList<Character>();
list_w.add('s');
list_w.add('i');
list_w.add('x');
LinkedList<Character> list_r = new LinkedList<Character>();
list_r.add('s');
list_r.add('v');
LinkedList<Character> list_x = new LinkedList<Character>();
list_x.add('w');
list_x.add('i');
list_x.add('u');
list_x.add('y');
LinkedList<Character> list_v = new LinkedList<Character>();
list_v.add('r');
LinkedList<Character> list_i = new LinkedList<Character>();
list_i.add('u');
list_i.add('x');
list_i.add('w');
LinkedList<Character> list_u = new LinkedList<Character>();
list_u.add('i');
list_u.add('x');
list_u.add('y');
LinkedList<Character> list_y = new LinkedList<Character>();
list_y.add('u');
list_y.add('x');
HashMap<Character, LinkedList<Character>> graph = new HashMap<Character, LinkedList<Character>>();
graph.put('s', list_s);
graph.put('w', list_w);
graph.put('r', list_r);
graph.put('x', list_x);
graph.put('v', list_v);
graph.put('i', list_i);
graph.put('y', list_y);
graph.put('u', list_u);
HashMap<Character, Integer> dist = new HashMap<Character, Integer>();
char start = 's';
bb.bfs(graph, dist, start);


}
/*HashMap<Character,LinkedList<Character>> graph 
* 这个HashMap是用于存放图中每个node的邻接表
* 表示此映射所维护的键的类型为Character,此映射值的类型为LinkedList<Character>
* graph 表示将映射关系存放在graph此映射中
* 
* LinkedList<Character> 表示在此Collection中保持元素类型为Character
* 
* HashMap<Character,Integer> dist 
* 这个HashMap 是用于存放每个node与距离顶点s的距离的映射关系
* 表示此映射所维护的键的类型为Character
* 此映射所维护的值的类型为Integer,dist表示将映射关系存放到dist此映射中
*/


private void bfs(HashMap<Character, LinkedList<Character>> graph,HashMap<Character, Integer> dist,char start)
{
//Queue<Character> 表示在此Collection中所保存的元素的类型为Character
Queue<Character> q=new LinkedList<Character>();
q.add(start);//将指定元素s插入队列,成功时返回true,如果没有可用空间,则返回illegalStateException


/*put(start,0) start为指定值将要关联的键,0为指定值将要关联的值,
如果start与0的映射关系已存在,则返回并替换旧值0
如果 start与0的映射关系不存在,则返回null 
*/
dist.put(start, 0);


int i=0;
while(!q.isEmpty())//
{
char top=q.poll();//获取并移除队列的头,返回队列的头,如果队列为空,返回null
i++;


//dist.get(top) 返回指定键top所映射的值
System.out.println("The "+i+"th element:"+top+" Distance from s is:"+dist.get(top));
int d=dist.get(top)+1;//得出其周边还未被访问的节点的距离


/*graph.get(top)如果此映射包含一个满足 (key==null ? k==null : key.equals(k)) 
的从 k 键到 v 值的映射关系,则此方法返回 v;否则返回 null。(最多只能有一个这样的映射关系。)
for(元素变量:元素集合),如果元素集合中所有元素都已遍历过,则结束此循环,
否则执行for循环里的程序块
*/
for (Character c : graph.get(top)) 
{


// containskey(key) 如果此映射包含对于指定键key的映射关系,则返回true
if(!dist.containsKey(c))//如果dist中还没有该元素说明还没有被访问
{
/*关联指定键c与指定值d,如果关联关系已存在,则替换旧值d,返回旧值d,
如果无映射关系,则返回null*/
dist.put(c, d);
q.add(c); //将指定元素c插入队列,成功时返回true,如果没有可用空间,则返回illegalStateException
}
}
}
}

}



特别说明下哈,Leo-Yang源代码里的
Queue<Character> q=new LinkedList<>(); 


不知是否因为我的eclipse是jre1.6缘故,这样写是编译不过的,改成如下就可以啦
Queue<Character> q=new LinkedList<Character>();

算法精讲:广度优先搜索(BFS)——从原理到实战的完整指南 / 记录节点和距离。// 缺少: Set<GraphNode> visited = new HashSet<>();// 应该在这里: visited.add(neighbor);* 时间复杂度: O(M×N), 空间复杂度: O(min(M,N))// g(n):从起点到当前节点的实际代价。// h(n):到目标的估计代价。// 如果是当前层最后一个节点,加入结果。 阅读详情

相关推荐

BFS算法(广度优先搜索)java

BFS介绍 BFS:宽度优先搜索算法(又称广度优先搜索)是最简便的图的搜索算法之一,属于一种盲目搜寻法,目的是系统地展开并检查图中的所有节点,以找寻结果。它并不考虑结果的可能位置,彻底地搜索整张图,直到找到结果为止。 BFS 的核心思想就是把一些问题抽象成图,从一个点开始,向四周开始扩散。一般来说,我们写 BFS 算法都是用「队列」这种数据结构,每次将一个节点周围的所有节点加入队列。 BFS 出现的常见场景,问题的本质就是让你在一幅「图」中找到从起点start到终点target的最近距离。 嘛意思呢,假设你

木竹的博客 4166

BFS算法(Java)

体悟:数组一直越界,搞了很长时间才弄明白(中午也没睡觉,现在十分的困倦),原来是犯了在写DFS的错误,数组的默认值为0,开始写的条件之中写的是不为1,即没有访问过就可以往上下左右四个方向移动,但是地图边界也为0,当访问点在边界上的上下左右的时候就数组越界了,所以解决这个问题也可以用下列种形式。其中1表示空地,可以走通,2表示障碍物。接下来一行包含四个整数startx,starty,endx,endy,分别表示起点坐标和终点坐标。如果可以从给定的起点到终点,输出最短路径长度,否则输出-1。

m0_59519985的博客 1305

BFS 算法框架

BFS 算法框架 文章目录BFS 算法框架一、BFS算法框架二、二叉树的最小高度三、解开密码锁的最少次数四、双向 BFS BFS 的核心思想应该不难理解的,就是把一些问题抽象成图,从一个点开始,向四周开始扩散。一般来说,我们写 BFS 算法都是用「队列」这种数据结构,每次将一个节点周围的所有节点加入队列。 BFS 相对 DFS 的最主要的区别是:BFS 找到的路径一定是最短的,但代价就是空间复杂度...

wolfGuiDao的博客 2458

BFS (Java) 广度优先搜索 简单介绍、模板、案例(一)

深度优先搜索DFS和广度优先搜索BFS是经常使用的搜索算法,在各类题目中都有广泛的应用。 深度优先搜索算法(英语:Depth-First-Search,DFS)是一种用于遍历或搜索树或图的算法。其过程简要来说是对每一个可能的分支路径深入到不能再深入为止,而且每个结点只能访问一次。 广度优先搜索算法(Breadth-First Search,缩写为 BFS),又称为宽度优先搜索,是一种图形搜索算法。简单的说,BFS 是从根结点开始,沿着树的宽度遍历树的结点。如果所有结点均被

weixin_45532984的博客 4292

基于C#的机器人控制框架:如何将ROS与硬件集成

本文探讨了如何利用C#与ROS(Robot Operating System)集成开发机器人控制系统。通过ROSSharp库和rosbridge中间件,实现了C#与ROS的WebSocket通信,并展示了硬件控制模块的设计方法。文章详细介绍了电机控制的串口通信实现、ROS消息订阅机制,以及性能优化和容错处理策略,最终构建了一个智能小车控制框架的案例。这种C#与ROS的集成方案为机器人开发提供了跨平台支持,同时兼顾了系统的高效性和可靠性。

这里只有干货:从 Modbus 通信到 MES 对接,从 YOLO 训练到工控机部署,带你搞定工业软件开发全流程。 1140

R语言计算植物群落重要值:从基础概念到优势种判定

在植被生态学研究中,重要值是衡量物种在群落中地位的核心指标,它综合了相对多度、相对频度与相对显著度三个维度,能够客观反映物种的数量优势、分布广度与空间占据能力。理解重要值的生态学逻辑,是开展群落分类、优势种判定及多样性分析的基础。而R语言凭借其批量处理、可复现和与后续多元统计无缝衔接的优势,成为生态学研究者处理样方数据的高效工具。从野外记录的宽表到标准化长表,再到分组汇总计算相对指标,R语言能够显著提升数据处理效率与准确性。本文以实测群落数据为例,系统梳理重要值的两种算法口径、基于dplyr和tidyr的完

weixin_42634811的博客 269

java如何写一个BFS

BFS (广度优先搜索) 是一种图形搜索算法,主要思想是从图中的某个节点开始,按照宽度优先的顺序遍历图中的所有节点,直到找到目标节点为止。 在 Java 中,可以使用队列来实现 BFS。以下是一个简单的示例代码: import java.util.*; public class BFS { public static void main(String[] args) { ...

weixin_42576186的博客 243

AI Agent + 大数据 + RAG:电商用户行为分析的低成本落地

本文探讨了AIAgent与大数据技术在电商用户行为分析中的应用。通过构建"数据采集-实时分析-智能决策"的全自治链路,解决了传统大数据分析的三大痛点:人工建模周期长、实时性不足和决策闭环断裂。系统采用Flink+Spark处理实时数据,结合基于DeepSeek-V3.1的AIAgent实现智能分析,并通过飞书RAG模块动态获取业务知识。落地效果显示,分析响应时间从2-3天缩短至30秒,推荐转化率提升134%,验证了该方案在提升电商数据决策效率方面的显著价值。

想~ai抽 1624

java实现一个典型的BFS算法

代码中,我们定义了一个BFS类,并在构造函数中传入图的邻接矩阵和节点数。由于邻接矩阵中1表示两个节点之间存在一条边,因此我们可以通过遍历邻接矩阵中指定节点的所有邻居节点来实现BFS算法。在算法实现过程中,我们使用了Java的Queue和ArrayList两个数据结构来分别存储遍历到的所有节点和标记已经访问的节点。最后,我们在测试代码中创建了一个邻接矩阵,并从节点0开始执行BFS算法。运行程序,输出结果为:0 1 2 3 4 5,即按照广度优先顺序遍历了整张图。作为一名02后,最讨厌前面的长篇大论。

m0_56235386的博客 595

跨阻放大器(TIA)的输入输出阻抗的定义、分析和影响因素

跨阻放大器(Transimpedance Amplifier,简称TIA)是一种常用于将电流信号转换为电压信号的放大器。在TIA电路中,输入阻抗是指输入端对电流信号的响应能力,输出阻抗是指输出端对负载电阻的驱动能力。本文将分别介绍TIA的输入和输出阻抗的定义、分析以及影响因素。

weixin_44378594的博客 1万+

[毕设项目-大模型微调]现代文翻译文言文【基于LLaMA3.1-8B微调】

教你基于LLaMA3.1-8B微调如何做到现代文翻译文言文

逐梦苍穹的博客 2297

广度优先搜索(BFS)算法:原理、应用与 Java 实现

广度优先搜索(BFS)是一种重要的图遍历算法,具有广泛的应用场景。通过迭代实现,BFS 可以有效地探索图中的所有节点。

小L的博客 2242

反光柱定位算法中的移动机器人姿态计算原理-经典三边定位最小二乘法计算定位-直接法计算定位

(二)计算姿态方式是我们已经通过最小二乘得到了小车在地图中的位置或者是雷达在地图中的位置,又因为我们知道雷达与小车的安装坐标,所以可以求解出一其中一个坐标的知量,通过小车在地图中坐标与雷达在地图中坐标可以得到一条向量,通过计算向量在地图中的角度就能得到姿态了。与最小二乘三边测量法相比,新算法在动态调整、优化过程和鲁棒性方面优势明显,尤其适合动态环境下的机器人定位,而最小二乘三边测量法在动态复杂环境中精度相对较低。(一)与(二)的区别主要是在计算姿态上的算法不同。经典三边定位最小二乘法 (法一)

苏凯的博客 1141

java数据结构和算法——图的广度优先(BFS)遍历

目录一、图的遍历介绍二、图的广度优先搜索(Broad First Search)三、图的广度优先遍历算法步骤四、图的广度优先遍历示例需求五、图的广度优先遍历代码示例 一、图的遍历介绍 所谓图的遍历,即是对结点的访问。一个图有那么多个结点,如何遍历这些结点,需要特定策略; 一般有两种访问策略: (1)深度优先遍历; (2)广度优先遍历。 二、图的广度优先搜索(Broad First Search) 类似于一个分层搜索的过程,广度优先遍历需要使用一个队列以保持访问过的结点的顺序,以便按这个顺序来访问这些结

小志的博客 1554

Qualcomm 常用NV列表

^ NV ITEM ^ 功能^^ |NV10 |mode prefer,找网模式|新平台使用NV80000| ^NV74 NV74=0关闭自动接听电话^ |NV240 |NV240=FALSE|EVDO出现网络的问题,此项必须设定为FALSE| |NV255 |CDMA规避网络列表(SID/NID号)| |NV256 |

sdrgtywretyeruet的专栏 5771

BLDC控制实验:方波、霍尔、开环、定速、正转

本文记录博主学习BLDC控制软件的过程。 文章目录1 概述2 软件架构及工具链2.1 软件架构2.2 工具链3 底层代码生成3.1 时钟配置3.2 按键输入配置 1 概述 本文是博主第一次做BLDC控制实验,目的仅仅是写代码让BLDC转起来,而暂时不考虑其他复杂的需求。 控制的方法是比较简单的六步换相法。利用电机内部的霍尔传感器,通过参考电机厂家给出的二二导通换相表,生成方波来控制电机。第一次实验为了简化需求,只考虑开环、定速、正转的情况: 开环:不考虑速度反馈,直接给PWM让电机转起来; 定速:不考虑速

u013288925的博客 1万+

图的遍历:广度优先搜索(BFS)

广度优先搜索(BFS)是一种遍历或搜索图的算法,从图的某个起始顶点开始,首先访问距离起始顶点最近的顶点,然后依次访问距离更远的顶点。BFS 使用队列(Queue)数据结构来实现。

捕风捉你 · 星桥API接入与大模型实战 845

怀旧版电脑GBC模拟器

再现原版GBC掌机的界面,电脑运行连游戏界面都一样大小,很怀旧,很真实,(英文版)强烈推荐,很小的文件,很难才找到的。

Java 广度优先搜索(Breadth-First Search,BFS)

我们从顶点 0 开始,BFS 算法首先将其放入 Visited 列表中,并将其所有相邻顶点放入堆栈中。接下来,我们访问队列前面的元素(即 1)并访问其相邻节点。顶点 2 在 4 中有一个未访问的相邻顶点,因此我们将其添加到队列的后面并访问位于队列前面的 3。队列中只剩下 4 个节点,因为 3 的唯一相邻节点(即 0)已经被访问过。BFS算法的时间复杂度用 的形式表示O(V + E),其中V是节点数,E 是边数。将不在访问列表中的添加到队列的后面。取出队列的最前面的项目并将其添加到访问列表中。

csdn_aspnet的专栏,请点击博客主页右上角三个点中的私信联系 2万+

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

lwip-2.0.3

lwip是瑞典计算机科学院(SICS)的Adam Dunkels 开发的一个小型开源的TCP/IP协议栈。实现的重点是在保持TCP协议主要功能的基础上减少对RAM 的占用。

图的广度优先搜索或 BFS

广度优先搜索(BFS)是一种图遍历算法,它从源节点开始逐层探索图结构,先访问所有直接相邻节点,再移动到下一层节点。BFS与深度优先搜索不同,它优先访问距离更近的顶点。该算法时间复杂度为O(V+E),适用于无权图的最短路径查找、环检测等场景。文中提供了C++、Java、Python等多种语言的BFS实现示例,包括连通图和不连通图的遍历方法。BFS是Dijkstra、Prim等算法的基础,在路径规划、网络路由等领域有广泛应用。

long316的专栏 752

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

Java中的图形:广度优先搜索(BFS)

Java中的图形:广度优先搜索(BFS) 通过奥利维拉·波波维奇(OliveraPopović)•0评论 介绍 图形是存储某些类型的数据的便捷方法。该概念是从数学移植而来的,适合于计算机科学的需求。 由于许多事物可以用图形表示,因此图形遍历已成为一项常见的任务,尤其是在数据科学和机器学习中。 Java中的图 用代码表示图 深度优先搜索(DFS) 广度优先搜索(BFS) Dijkstra的算法 广度优先搜索 广度优先搜索(BFS)会“逐层”访问。这意味着在一个G...

allway2的博客 1883

图的遍历(DFS+BFS)

图的遍历是指从图中任意指定顶点(初始点)出发,按照特定搜索策略沿着边访问所有顶点且每个顶点仅访问一次的过程,遍历得到的顶点序列称为遍历序列。全访问、不重复——这是因为图存在环和多对多连接,相比二叉树(无环、一对多),遍历需增加访问标记避免重复访问,是图遍历的关键要点。图的遍历要求访问所有顶点且仅访问一次,因图有环和多对多连接,访问标记是实现的关键,分为DFS和BFS两种策略;DFS基于栈实现,是“深度优先、回溯探索”,适合判断连通性,不保证最短路径,有递归(简洁)和非递归(通用)两种实现;

m0_74148354的博客 1318

数据结构与算法 - 图的BFS遍历:无权图最短路径的求解思路

文章摘要(148字): 本文深入解析广度优先搜索(BFS)在无权图最短路径求解中的应用。BFS通过队列实现逐层遍历,天然保证首次访问节点时的路径即为最短路径。文章对比了BFS与DFS的差异,通过Mermaid图表直观展示遍历过程,并提供了完整的Java代码实现,包括邻接表构建、BFS遍历、距离计算和路径重构。关键点在于BFS按层扩展特性(第n层节点距离起点n步),配合parent数组记录路径,可高效解决社交网络、路由导航等场景下的最短路径问题。

千淘万漉虽辛苦,吹尽狂沙始到金 2万+

章节三:图上涟漪:BFS层层推进解迷宫 - (广度优先搜索 / BFS)

本文介绍了广度优先搜索(BFS)算法的核心概念与应用。通过迷宫探险的生动比喻,阐述了BFS如何利用队列实现层级扩散搜索,确保找到无权图中的最短路径。文章详细解析了BFS的工作原理、时间复杂度(O(V+E))和空间复杂度(O(V)),并通过流程图直观展示搜索过程。最后提供了Java和Python的代码实现示例,展示如何使用邻接表完成BFS遍历。该算法适用于社交网络分析、路径规划等多种场景,是图论中最基础且重要的遍历方法之一。

杨小扩的博客 759

广度优先搜索(BFS)

(BFS)是一种图的遍历算法。它从起点出发,首先访问距离起点最近的所有节点,然后逐层扩展到更远的节点,直到目标节点被找到,或者图中没有更多可访问的节点。与。

2302_81116822的博客 1176

图-深度和广度优先搜索-最短路径算法-java实现

什么是“搜索”算法? 我们知道,算法是作用于具体数据结构之上的,深度优先搜索算法和广度优先搜索算法都是基于“图”这种数据结构的。这是因为,图这种数据结构的表达能力很强,大部分涉及搜索的场景都可以抽象成“图”。 图上的搜索算法,最直接的理解就是,在图中找出从一个顶点出发,到另一个顶点的路径。具体方法有很多,比如今天要讲的两种最简单、最“暴力”的深度优先、广度优先搜索,还有 A*、IDA* 等启发式搜索算法。 广度优先搜索(BFS) 广度优先搜索(Breadth-First-Search),我们平常都简

qq_36448587的博客 1万+

Java数据结构——图的遍历(DFS+BFS)

文章目录一、图例二、深度优先搜索遍历(一)、定义(二)、数据结构(三)、Java代码三、广度优先搜索遍历(一)、定义 一、图例 访问序列: - DFS: v1->v2->v4->v8->v5->v3->v6->v7 - BDS: v1->v2->v3->v4->v5->v6->v7->v8 二、深度优先搜索遍历 (一)、定义 特点: 单向前进,回路回退。 二叉树: 前序遍历,中序遍历,后序遍历。 图的遍历: 从图中某

NoBug 1264
上一篇: java学习笔记之创建二叉树
下一篇: Java学习笔记之二叉树的节点数、深度
samnancy
博客等级 码龄19年 4粉丝 10原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值