如果在BFS实现中将队列更改为堆栈,是否会获得DFS?


35

这是广度优先搜索的标准伪​​代码:

{ seen(x) is false for all x at this point }
push(q, x0)
seen(x0) := true
while (!empty(q))
  x := pop(q)
  visit(x)
  for each y reachable from x by one edge
    if not seen(y)
      push(q, y)
      seen(y) := true

此处pushpop被假定为队列操作。但是,如果它们是堆栈操作呢?生成的算法是否按深度优先顺序访问顶点?


如果您对“这很琐碎”的评论投了赞成票,请您解释一下为什么这很琐碎。我觉得这个问题很棘手。


5
我见过学生为此而苦苦挣扎,所以我认为这绝对不是太简单。但是,答案中除了“是”或“否”之外,还应包含什么?问题中尚不清楚所需的粒度。
拉斐尔

2
“是”将带有令人信服的论点;“否”将带有反例。但是,一旦您了解发生了什么,总比有/没有更好的答案……
rgrig

2
@Joe,Dave:请参阅随后的meta讨论
别再成为邪恶了'

3
可以编写伪代码,以便仅通过更改pop堆栈或队列操作就可以得到dfs或bfs。编写伪代码的初衷似乎很容易,但事实并非如此。 ics.uci.edu//~eppstein/161/960215.html 是相关参考。
2012年

Answers:


23

不,这与DFS不同。

考虑图

在此处输入图片说明

如果按从右到左的顺序推动节点,则该算法将为您提供遍历:

一种ËCd

而DFS希望它会

一种ËdC

ΘV+ËØV

我同意,这个问题并非微不足道。


5
这假定邻接表具有一些固定的特定顺序。至少在数学中,一个人将它们视为一组,并且一个图形具有多个深度顺序遍历,具体取决于您如何迭代子级。(想象一下为孩子使用哈希)。从这个意义上讲,ABECD仍然是深度优先的。发问者想知道即使在这种情况下是否也存在反例。(实际上,这是开始变得棘手的地方。)
rgrig

3
dËd

1
@Arybhata:哦,对不起,我不知道为什么我要假设您要使边缘指向下方。它们是无方向性的,所以您是对的:即使我在评论中说的,这也是一个反例。(这很奇怪:我不得不拼错您的句柄,所以它不会被SE删除。)
rgrig
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.