广度优先搜索中的“宽度”是什么意思?


11

我正在学习广度优先搜索,我想到一个问题,为什么要这样称呼BFS。在《CLRS的算法简介》一书中,我读到了以下原因:

广度优先搜索之所以这么称呼是因为它在边界的宽度上均匀地扩展了已发现和未发现顶点之间的边界。

但是,我无法理解此声明的含义。我对这个“边界”一词以及该边界的广度感到困惑。

因此,有人能以一种像我这样的初学者容易理解的方式回答这个问题吗?


4
如果某些读者不熟悉英语单词的含义(作为该技术术语的一部分,在其使用范围之外):merriam-webster.com/dictionary/breadthdictionary.cambridge.org/dictionary/english/breadth。它类似于“宽度”,如果您在谈论物理对象的大小/形状,则其尺寸与“深度”不同。并且在隐喻意义上,例如知识深度(一个主题的专家)与知识广度(很多主题)。
彼得·科德斯

Answers:


22

考虑用于表示搜索的数据结构。在BFS中,您使用队列。如果遇到看不见的节点,请将其添加到队列中。

“边界”是搜索数据结构中所有节点的集合。队列将依次遍历边界上的所有节点,从而遍历边界的宽度。DFS将始终从堆栈中弹出最近发现的状态,从而始终在边界的最深层进行迭代。

考虑下图。请注意,DFS如何直接进入树的最深部分,而BFS如何遍历每个级别的广度。

dfs bfs

图片在这里


2
我认为“ 边界 ”一词可能是指发现的节点的边缘。当您只发现a边界时a。当你发现abc,边疆是bc。当你发现abcdefg,边疆是defg。换句话说,已经发现并且尚未搜索的节点。
Theodoros Chatzigiannakis

我认为这是一个公平的观点,但是我认为可以用多种方式解释“边界”,而上面的一般解释仍然有效。
Throckmorton

2

您提供的报价是“已发现和未发现顶点之间的边界”。这就是作者在谈论的领域:发现和未发现的顶点之间的领域。您有一些顶点,您还没有看到任何东西。您还具有一些顶点,这些顶点已经为您看到了一切。然后,您将在两个顶点之间。这些是您已经查看过的顶点,但是尚未加载所有的孩子。这是前沿。

对此进行了进一步讨论:

为了跟踪进度,BFS将每个顶点的颜色分别设置为白色,灰色或黑色。所有顶点均以白色开始,然后可能变为灰色,然后变为黑色。在搜索过程中首次遇到该顶点时会发现该顶点,然后该顶点变为非白色。因此,已经发现了灰色和黑色顶点,但是BFS区分了它们,以确保搜索以BF方式进行。
...
每个顶点最初都是白色的,在搜索中被发现时是灰色的,而在完成时(即,它的邻接列表已被完整检查后)是黑色的。

因此,所有顶点都以白色开始(未发现)。发现节点后,它的颜色为灰色(边界)。发现它指向的所有内容时,它会变成黑色(完全发现)。边界是已发现但尚未发现子项的点集。

假设您正在网站上寻找东西。您首先进入主页。假设标记为“动物”。当前的边界是{“动物”}。您浏览主页,看不到您要查找的内容。但是您会注意到它具有指向另外两个页面的链接,即“四足动物”和“蠕虫”。因此,您单击“四足动物”的链接。现在的边界是{“动物”,“四足动物”}。您浏览“四足动物”,却找不到您要的东西。下一步你要怎么做?您可以在“四足动物”上查找链接并关注它们,或者返回“动物”并单击“蠕虫”链接。第一个是深度优先搜索,第二个是宽度优先搜索。

“深度”是指从根节点到一个节点需要多少个链接,而“宽度”是指相同深度的节点。在上面的示例中,BFS从“动物”开始,首先查看深度为1的所有节点,因此首先查看“四足动物”和“蠕虫”。在查看了所有的depth-1节点之后,它将边界扩展到所有这些节点上。也就是说,它先查看所有depth-1节点的子级,然后再查看任何depth-2节点的子级。因此,例如,如果“四元组”页面上的链接之一是“灵长类”,则它会先查看“蠕虫”页面上的所有链接,然后再查看“灵长类”页面上的任何链接。


1

假设从顶点开始执行BFS算法。想像一下,从发送出一个波(像水波或海啸)。一个时间步后,波可能已经到达的所有邻居。经过两年时间的步骤,波浪会达到(或“访问”),所有这些都在距离最多顶点从。等等。 aaa2a

在任何给定时间,wave的边界恰好是存储在队列数据结构中的顶点(这些顶点已被访问,但尚未进一步探究)。

因此,波最初到达与相距1的所有顶点的整个“宽度” 。在经过一些时间步长之后,该波将覆盖整个宽度,直到距起点一定距离。 aa

kaka(k0)0{a}aa

aaa

因此,DFS和BFS访问顶点的顺序不同。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.