【问题标题】:Is there an "official", or even any correct, implementation of DFS?是否有“官方”,甚至任何正确的 DFS 实施?
【发布时间】:2018-09-03 14:46:56
【问题描述】:

在此question 中提供了 DFS 的伪代码:

DFS(source):
  s <- new stack
  visited <- {} // empty set
  s.push(source)
  while (s is not empty):
    current <- s.pop()
    if (current is in visited):
        continue
    visited.add(current)
    // do something with current
    for each node v such that (current,v) is an edge:
        s.push(v)

然而,它有一个非常明显的细节——同一个节点可以——而且经常会——被推入堆栈两次!!!!!!

               1
               | \
               |  2
               | /
               3

按 1

流行音乐 1

添加1到访问

按 2、3

流行音乐 2

添加 2 到访问

再次按 1 堆叠

...

...

当然,这不可能吧??

【问题讨论】:

  • @Marco13 你是对的。您应该发表您的评论作为答案。
  • 请使用正确标签。 DFS 是 Windows 使用的分布式文件系统

标签: data-structures graph depth-first-search


【解决方案1】:

你说得对,节点1 将再次被压入堆栈。不过这没关系:在下一遍基本会被忽略,因为已经被标记为“visited”了:

if (current is in visited):
    continue

或者,您只能将尚未访问的节点添加到堆栈中:

for each node v such that (current,v) is an edge:
    if (v is NOT in visited) s.push(v)

您不太可能在实际实现中添加此检查。但是代码是伪代码,并且通常以非常通用的形式编写,只要算法是正确的,为了紧凑和通用而省略了这种“优化”或“改进”。在这里,差异不会影响正确性:在这两种情况下,那部分都说

// do something with current

只会对每个节点执行一次

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-10-04
    • 1970-01-01
    • 2021-09-25
    • 1970-01-01
    • 1970-01-01
    • 2020-03-31
    • 2017-12-02
    • 2020-03-09
    相关资源
    最近更新 更多