什么是广度优先搜索?
广度优先搜索和深度优先搜索是处理图时使用的两种常见算法。在这里,我们将看一下其中的第一种,即广度优先搜索。
CORE -
Mar. 11, 22 - 大数据区 -分析
喜欢 (4)
评论
保存
鸣叫
4.16K浏览次数
加入DZone社区,获得完整的会员体验。
为什么我应该关心?
很多算法都是作为你选择的语言的一部分为你实现的。这意味着,它们是有趣的学习,但你很少会自己写它们。
图的遍历算法则不同。我们一直在使用图,从连接电子商务应用中的相关产品到映射社交网络中人们之间的关系。
搜索图不仅在理论上有用,而且你几乎肯定也需要在实践中进行搜索。
在5分钟或更短时间内。
这里有一个图的数据结构。
图中的 "节点"(A-F)被称为 "顶点"。每个顶点都用 "边 "连接到一个或多个其他顶点,"边 "是节点之间的线。然而,只有当我们能用它做什么时,图才是有用的。我们可能想知道某个元素是否存储在我们的图中,或者两个元素之间需要多少 "跳"。
这类问题被称为 "图的遍历",广度优先搜索(或称BFS)是实现这一目的的一种算法。让我们来看看。
广度优先搜索如何工作
在上一期,我们看了 "队列 "数据结构。
你会记得,这是一个 "先进先出 "的数据结构:第一个被添加的元素是第一个被处理的元素(或 "排队")。如果你是队列中的最后一个,你将被最后处理。
我们将使用队列来实现广度优先搜索(BFS)。
这就是BFS算法。
- 从队列中拉出下一个 "顶点"。
- 对于每个与之相连的顶点(我们还没有访问过的),将其标记为 "已访问 "并将其添加到队列中。
- 重复这个过程,直到队列为空。
通过这样做,**我们从起点向外辐射,**首先访问与起点直接相连的所有节点。然后,访问与这些节点相连的所有节点,等等。
随着我们工作的深入,这将变得更有意义。
实现BFS
我们从选择一个地方开始,我们将选择A 。
因此,第一步是将A 添加到队列中并将其标记为 "已访问"。
你会记得,BFS算法要求我们重复以下步骤,直到队列为空。
- 从队列中拉出下一个 "顶点"。
- 对于每个与之相连的顶点(我们还没有访问过的),将其标记为 "已访问",并将其添加到队列中。
A 是队列中的第一个(也是唯一的)元素。
A 与 和 都相连。我们还没有访问过这两个,所以我们将它们添加到队列中,并标记为已访问。B C
现在,我们再次重复同样的事情。
B 是队列中的下一个。
B 与 , , 和 相连。我们已经访问了 和 ,所以我们只排队访问 和 (并把它们标记为已访问)。A C D E A C D E
你也许能看出这是在干什么。
接下来,我们取消对C 的排队。它与A 、B 和F 相连。唯一一个我们还没有访问过的是F ,所以我们把它添加到队列中并标记为 "已访问"。
现在队列中还剩下F,E 和D 。我们将依次对它们进行排队,寻找任何我们尚未访问过的连接顶点,但我们不会找到任何顶点。
在我们检查完每一个后,队列是空的,我们就完成了。我们已经访问了每个节点。
BFS的应用
这一切都很好,但我们会用它来做什么呢?
假设我们正在建立一个像LinkedIn这样的社交网络。在这种情况下,"图 "是人与人之间所有联系的地图。如果我们想知道Bob是否通过一个或多个共同的朋友认识Jennie,BFS将是一个很好的选择。
我们从鲍勃开始,向外辐射,直到我们找到詹妮(或者直到我们离鲍勃足够远而放弃);或者,图可以是一张地铁地图,而鲍勃和詹妮之间有多少共同朋友的问题可以改为:"在两个车站之间需要多少变化?
一旦你了解了图和广度优先搜索等算法,很多问题就开始变得像这样了。
想知道更多吗?
请看这些链接。
主题。
计算机科学, 算法, 算法和数据结构, 广度优先搜索, 大数据算法, 大数据, BFS
经Dave Saunders许可发表于DZone。点击这里查看原文。
DZone贡献者所表达的观点属于他们自己。
DZone上的热门文章
评论