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

介绍

图形是存储某些类型的数据的便捷方法。该概念是从数学移植而来的,适合于计算机科学的需求。

由于许多事物可以用图形表示,因此图形遍历已成为一项常见的任务,尤其是在数据科学和机器学习中。

广度优先搜索

广度优先搜索(BFS)会“逐层”访问。这意味着在一个Graph中(如下图所示),它首先访问起始节点的所有子节点。这些孩子被视为“第二层”。

与 深度优先搜索(DFS)不同,BFS不会主动经过一个分支直到到达末端,而是当我们从一个节点开始搜索时,它会先访问该节点的所有未访问邻居,然后再继续访问所有未访问邻居。另一个节点:



实作

我们将使用通过邻接表实现的图,就像用于DFS一样。另外,我们需要visitedvisit()univisit()方法旁边添加属性到我们的Node类中:

现在,让我们定义一个Graph

现在,让我们添加方法addEdge()。我们将使用两种方法,辅助方法和实际方法。

在辅助方法中,我们还将检查可能的重复边缘。在A和之间添加边之前B,我们先将其删除,然后再添加。如果存在(我们要添加重复的边),则将其删除,然后再次添加,只有一个。

但是,如果它不存在,那么删除不存在的边将导致,NullPointerException因此我们引入了列表的临时副本:

最后,我们将有printEdges()hasEdge()resetNodesVisited()辅助方法,这是非常简单的:

让我们在以下无向图上检查BFS算法:

我们可以选择任何节点作为起点,所以从1开始。我们重复从队列中添加和删除节点的过程,直到队列为空。


队列是FIFO(先进先出)数据结构。它的工作方式就像现实中的队列一样,因此,按添加顺序逐个处理条目(从队列中删除)。

对于BFS来说,这是一种非常方便的数据结构,因为我们希望按照访问它们的顺序来处理节点,并确保首先处理与起始节点“更近”的节点。

由于将它们添加到队列中,然后再将离起始节点“更远”的任何节点添加到队列中,因此我们知道将首先处理较近的节点。

  1. 我们从一个仅包含节点1的队列开始



  1. 从队列中删除第一个元素,在本例中为1,将其标记为已访问
  2. 将所有1的未访问邻居添加到队列(仅0)



订阅我们的新闻
在收件箱中获取临时教程,指南和作业。从来没有垃圾邮件。随时退订。

订阅电子报
订阅

  1. 从队列中删除第一个元素,在这种情况下为0,将其标记为已访问
  2. 将所有0的未访问邻居添加到队列(节点32,1已被标记为已访问)



  1. 从队列中删除第一个元素,在本例中为3,将其标记为已访问
  2. 将所有3个未访问的邻居添加到队列中(不存在)



  1. 从队列中删除第一个元素,在本例中为2,将其标记为已访问
  2. 将所有2个未访问的邻居添加到队列中(同样,没有一个)
  3. 队列现在为空,BFS已完成

我们的节点按1-0-3-2顺序访问。显然,步骤2-3、4-5、6-7和8-9的设置相同,并且步骤10是我们的循环终止条件。这样看来,为我们的breadthFirstSearch(Node node)方法编写代码应该很容易。

QueueJava有几种类型的实现,但是我们将使用aLinkedList代替,因为它提供了所有必需的方法。

我们在类中添加以下方法Graph

现在,我们在代码中创建示例图,并检查我们的方法是否按预期工作:

输出:

如果您阅读了DFS文章,那么您可能还记得我们曾经遇到过这样的情况:在未连接的图中,并非所有节点都将被打印出来,因为该算法将遍历所有可能的节点,然后停止。

BFS也会发生同样的事情,并且在定向图时也会发生这种情况,有时我们无法到达所有节点。有时,这我们要寻找的行为,但有时,我们希望访问所有节点。

我们将执行与DFS中相同的操作,即,只要有任何未访问的节点,我们就将继续调用BFS。我们将创建一个新breadthFirstSearchModified(Node node)方法为我们完成此任务:


输出:

还有一种叫做“双向” BFS搜索的东西。当我们想要找到两个顶点(节点)之间的最短路径时,这很有用。
这是通过同时(在不同线程中)从起始节点和目标节点运行BFS来实现的。从理论上讲,这可以找到两个节点之间的最短路径,而这仅仅是从起始节点运行BFS的两倍。

注意:与DFS一样,如果我们要以特定顺序(而不是添加边的顺序)遍历邻居,则可以使用aPriorityQueue代替aLinkedList来邻居列表。

该代码是相同的,我们只需要执行Comparable并添加compareTo()方法给我们的Node类。

结论

图形是存储某些类型的数据的便捷方法。该概念是从数学移植而来的,适合于计算机科学的需求。

由于许多事物可以用图形表示,因此图形遍历已成为一项常见的任务,尤其是在数据科学和机器学习中。

广度优先搜索是为数不多的图形遍历算法之一,并且“逐层”访问节点。与深度优先搜索不同,BFS不会主动到达一个分支,直到到达终点为止,而是当我们从一个节点开始搜索时,它会访问该节点的所有未访问邻居,然后再访问另一个节点的所有未访问邻居。 。

译者:啊强啊

链接: stackabuse.com/graphs-i

来源:Stack Abuse

代开银行存款证明公司清远资金证明模板黄石订做出国留学存款证明襄阳银行存款证明推荐赣州定期存单打印沈阳银行存款证明代办兴安盟银行定期存单办理许昌企业资信证明定做盐城资金证明图片德阳出国留学资金证明代发齐齐哈尔出国留学存款证明图片莆田出国留学资金证明好不好上饶企业资金证明定制黑河定做出国留学资金证明陇南定期存单开具咸宁资信证明价格潍坊企业资信证明怎么打吉安开存款证明襄阳本地定期存单衢州银行存款证明代办福州定做银行定期存单泸州出国留学存款证明作用松原资金证明费用衡水开出国留学资金证明保定出国留学存款证明报价晋城打印资信证明盐城企业资信证明制作吉安定期存单报价日照定制出国留学资金证明普洱企业资信证明哪里有淮北代做存款证明香港通过《维护国家安全条例》两大学生合买彩票中奖一人不认账让美丽中国“从细节出发”19岁小伙救下5人后溺亡 多方发声汪小菲曝离婚始末卫健委通报少年有偿捐血浆16次猝死单亲妈妈陷入热恋 14岁儿子报警雅江山火三名扑火人员牺牲系谣言手机成瘾是影响睡眠质量重要因素男子被猫抓伤后确诊“猫抓病”中国拥有亿元资产的家庭达13.3万户高校汽车撞人致3死16伤 司机系学生315晚会后胖东来又人满为患了男孩8年未见母亲被告知被遗忘张家界的山上“长”满了韩国人?倪萍分享减重40斤方法许家印被限制高消费网友洛杉矶偶遇贾玲何赛飞追着代拍打小米汽车超级工厂正式揭幕男子被流浪猫绊倒 投喂者赔24万沉迷短剧的人就像掉进了杀猪盘特朗普无法缴纳4.54亿美元罚金周杰伦一审败诉网易杨倩无缘巴黎奥运专访95后高颜值猪保姆德国打算提及普京时仅用姓名西双版纳热带植物园回应蜉蝣大爆发七年后宇文玥被薅头发捞上岸房客欠租失踪 房东直发愁“重生之我在北大当嫡校长”校方回应护栏损坏小学生课间坠楼当地回应沈阳致3死车祸车主疑毒驾事业单位女子向同事水杯投不明物质路边卖淀粉肠阿姨主动出示声明书黑马情侣提车了奥巴马现身唐宁街 黑色着装引猜测老人退休金被冒领16年 金额超20万张立群任西安交通大学校长王树国卸任西安交大校长 师生送别西藏招商引资投资者子女可当地高考胖东来员工每周单休无小长假兔狲“狲大娘”因病死亡外国人感慨凌晨的中国很安全恒大被罚41.75亿到底怎么缴考生莫言也上北大硕士复试名单了专家建议不必谈骨泥色变“开封王婆”爆火:促成四五十对测试车高速逃费 小米:已补缴天水麻辣烫把捣辣椒大爷累坏了

代开银行存款证明公司 XML地图 TXT地图 虚拟主机 SEO 网站制作 网站优化