繁体   English   中英

广度优先与深度优先搜索的输入/输出

[英]Input/output of breadth-first vs. depth-first search

我的问题不是关于任何一种搜索类型的机制。 我觉得比这要平凡得多-我不理解任何一个的输入和输出。 更具体地说,在CLRS中,BFS将图和源节点作为输入,而DFS仅将图作为输入。 DFS不在乎您从何处搜索吗?

这就是输入的混乱。 输出的混乱在于,在DFS中,完成后,您将拥有一个类似表的结构来记录每个节点的发现和完成时间,对吗? 您如何从中提取解决方案,即从源节点到目标节点的路径?

我希望我有道理。 谢谢!

编辑:这是DFS不带源节点的意思。 这是CLRS的DFS伪代码。 我看不到它将源节点带到任何地方。 我所看到的只是遍历图中的所有节点。

DFS(G)
1 for each vertex u ∈ V[G]
2 do color[u] ← WHITE
3 π[u]← NIL
4 time ← 0
5 for each vertex u ∈ V[G]
6 do if color[u] = WHITE
7 then DFS-VISIT(u)

DFS-VISIT(u)
1 color[u] ← GRAY ✄ White vertex u has just been discovered.
2 time ← time+1
3 d[u] ← time
4 for each v ∈ Adj[u] ✄ Explore edge (u,v).
5 do if color[v] = WHITE
6 then π[v] ← u
7 DFS-VISIT(v)
8 color[u] ← BLACK ✄ Blacken u;it is finished.
9 f [u] ← time ← time+1

输入混乱:

CLRS提供的特定DFS不在乎您从何处搜索。 搜索的确切结果将取决于V[G]节点的顺序。 通常,我会认为DFS是从节点开始的,例如:

DFS-Simple(G, s)
1 for each vertex u ∈ V[G]
2   do color[u] ← WHITE
3 π[u]← NIL
4 time ← 0
5 DFS-VISIT(s)

CLRS的版本产生一个森林(图形的每个组成部分有一棵树),而不是一棵树,这大概更适合其用途。

输出混乱:

路径不是通过时间戳记录的,而是通过父指针π 例如,给定节点v ,您可以像这样打印到其根节点的路径:

Print-Path-To-Root(v)
1 while v ≠ Nil
2   do print v
3      v ← π[v]

BFS和DFS都将源节点作为输入。

使用DFS进行路径查找时,只需在找到节点时停止,然后一直处理堆栈直到原始节点以找到路径。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM