我正在学习广度优先搜索,我想到一个问题,为什么要这样称呼BFS。在《CLRS的算法简介》一书中,我读到了以下原因:
广度优先搜索之所以这么称呼是因为它在边界的宽度上均匀地扩展了已发现和未发现顶点之间的边界。
但是,我无法理解此声明的含义。我对这个“边界”一词以及该边界的广度感到困惑。
因此,有人能以一种像我这样的初学者容易理解的方式回答这个问题吗?
我正在学习广度优先搜索,我想到一个问题,为什么要这样称呼BFS。在《CLRS的算法简介》一书中,我读到了以下原因:
广度优先搜索之所以这么称呼是因为它在边界的宽度上均匀地扩展了已发现和未发现顶点之间的边界。
但是,我无法理解此声明的含义。我对这个“边界”一词以及该边界的广度感到困惑。
因此,有人能以一种像我这样的初学者容易理解的方式回答这个问题吗?
Answers:
考虑用于表示搜索的数据结构。在BFS中,您使用队列。如果遇到看不见的节点,请将其添加到队列中。
“边界”是搜索数据结构中所有节点的集合。队列将依次遍历边界上的所有节点,从而遍历边界的宽度。DFS将始终从堆栈中弹出最近发现的状态,从而始终在边界的最深层进行迭代。
考虑下图。请注意,DFS如何直接进入树的最深部分,而BFS如何遍历每个级别的广度。
图片在这里
a
边界时a
。当你发现a
,b
,c
,边疆是b
,c
。当你发现a
,b
,c
,d
,e
,f
,g
,边疆是d
,e
,f
,g
。换句话说,已经发现并且尚未搜索的节点。
您提供的报价是“已发现和未发现顶点之间的边界”。这就是作者在谈论的领域:发现和未发现的顶点之间的领域。您有一些顶点,您还没有看到任何东西。您还具有一些顶点,这些顶点已经为您看到了一切。然后,您将在两个顶点之间。这些是您已经查看过的顶点,但是尚未加载所有的孩子。这是前沿。
对此进行了进一步讨论:
为了跟踪进度,BFS将每个顶点的颜色分别设置为白色,灰色或黑色。所有顶点均以白色开始,然后可能变为灰色,然后变为黑色。在搜索过程中首次遇到该顶点时会发现该顶点,然后该顶点变为非白色。因此,已经发现了灰色和黑色顶点,但是BFS区分了它们,以确保搜索以BF方式进行。
...
每个顶点最初都是白色的,在搜索中被发现时是灰色的,而在完成时(即,它的邻接列表已被完整检查后)是黑色的。
因此,所有顶点都以白色开始(未发现)。发现节点后,它的颜色为灰色(边界)。发现它指向的所有内容时,它会变成黑色(完全发现)。边界是已发现但尚未发现子项的点集。
假设您正在网站上寻找东西。您首先进入主页。假设标记为“动物”。当前的边界是{“动物”}。您浏览主页,看不到您要查找的内容。但是您会注意到它具有指向另外两个页面的链接,即“四足动物”和“蠕虫”。因此,您单击“四足动物”的链接。现在的边界是{“动物”,“四足动物”}。您浏览“四足动物”,却找不到您要的东西。下一步你要怎么做?您可以在“四足动物”上查找链接并关注它们,或者返回“动物”并单击“蠕虫”链接。第一个是深度优先搜索,第二个是宽度优先搜索。
“深度”是指从根节点到一个节点需要多少个链接,而“宽度”是指相同深度的节点。在上面的示例中,BFS从“动物”开始,首先查看深度为1的所有节点,因此首先查看“四足动物”和“蠕虫”。在查看了所有的depth-1节点之后,它将边界扩展到所有这些节点上。也就是说,它先查看所有depth-1节点的子级,然后再查看任何depth-2节点的子级。因此,例如,如果“四元组”页面上的链接之一是“灵长类”,则它会先查看“蠕虫”页面上的所有链接,然后再查看“灵长类”页面上的任何链接。