我正在阅读Cormen的算法简介中的DFS
。以下是文字
片段。
与BFS不同,BFS的前身子图形成了一个树,即前身 DFS生成的subgrpah可能由几棵树组成,因为 可以从多个来源重复搜索。
除上述说明外,还提到了以下内容。
BFS仅限于一个来源似乎是随意的 DFS可以从多个来源搜索。虽然从概念上讲,BFS 可以从多个来源进行,DFS可以限制为一个 来源,我们的方法反映了这些搜索的结果 通常使用。
我的问题是
答案 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,因此您只有一个源。我认为将源作为父节点会更清楚。