BFS和DFS之间的区别

时间:2011-10-25 04:34:22

标签: algorithm depth-first-search breadth-first-search

我正在阅读Cormen的算法简介中的DFS。以下是文字 片段。

  

与BFS不同,BFS的前身子图形成了一个树,即前身   DFS生成的subgrpah可能由几棵树组成,因为   可以从多个来源重复搜索。

除上述说明外,还提到了以下内容。

  

BFS仅限于一个来源似乎是随意的   DFS可以从多个来源搜索。虽然从概念上讲,BFS   可以从多个来源进行,DFS可以限制为一个   来源,我们的方法反映了这些搜索的结果   通常使用。

我的问题是

  1. 任何人都可以举例说明BFS如何与多个来源一起使用 DFS与单一来源一起使用?

2 个答案:

答案 0 :(得分:6)

当它说多个来源时,它指的是搜索的起始节点。您会注意到算法的参数是BFS(G, s)DFS(G)。这应该已经暗示BFS是单源而DFS不是,因为DFS不会将任何初始节点作为参数。

正如作者所指出的,这两者之间的主要区别在于BFS的结果总是树,而DFS可以是森林(树木的集合)。这意味着,如果BFS是从节点s运行的,那么它将只构造从s可到达的节点的树,但如果图中有其他节点,则不会触及它们。但是,DFS将继续搜索整个图,并构建所有这些连接组件的林。正如他们所解释的那样,这是大多数用例中每种算法的理想结果。

正如作者所提到的那样,没有什么能阻止微小修改来制作DFS单一来源。事实上,这种变化很容易。我们只接受另一个参数s,并在例程DFS(不是DFS_VISIT)而不是第5-7行迭代图中的所有节点,我们只需执行DFS_VISIT(s)

同样,更改BFS可以使其与多个源一起运行。我在网上找到了一个实现:http://algs4.cs.princeton.edu/41undirected/BreadthFirstPaths.java.html虽然这与另一个可能的实现略有不同,后者会自动创建单独的树。这意味着,该算法看起来像BFS(G, S)(其中S是节点的集合),而您可以实现BFS(G)并自动生成单独的树。这是对排队的一个小修改,我将把它留作练习。

正如作者所指出的那样,没有做到这一点的原因是每种算法的主要用途都使它们有用。虽然考虑到这一点做得很好,但这是一个应该被理解的重点。

答案 1 :(得分:0)

你明白这个定义了吗?你在圣书上看到了一些照片吗?

当它说DFS可能由几棵树组成时,它会更深,直到它到达叶子然后回到轨道。所以基本上想象一棵树,首先搜索左子树,然后搜索右子树。左子树可能包含几个子树。这就是为什么。

当你考虑BFS时,它基于水平。换句话说,第一级搜索。所以你有一个源(节点),而不是你搜索那个级别的所有子节点。

如果只有一个子节点,则使用单一来源的DFS,因此您只有一个源。我认为将源作为父节点会更清楚。