这是使用python实现的dfs搜索,我从互联网上获取

时间:2016-09-25 05:35:30

标签: python

graph={
       'A':set(['B','C']),
       'B':set(['A','D','E']),
       'C':set(['A','F']),
       'D':set(['B']),
       'E':set(['B','F']),
       'F':set(['C','E'])}

def dfs(graph, start):
      visited, stack = set(), [start]

      while stack:
             vertex = stack.pop()
             if vertex not in visited:
                       visited.add(vertex)
                       stack.extend(graph[vertex] - visited)

     return visited

dfs(graph, 'A')

任何人都可以解释为什么我们使用这些

  1. visited,stack = set(), [start]
  2. graph[vertex] - visited
  3. stack.extend(graph[vertex] - visited)

1 个答案:

答案 0 :(得分:0)

您要问的第一行是初始化visitedstack变量。如果您愿意,可以将它写在两行:

visited = set()
stack = []

我喜欢在单独的行上初始化事情,但这主要是风格问题。我知道很多其他Python程序员喜欢将他们的初始化结合起来,可能是因为它允许他们使用更少的行(如果你的函数增长的时间长于你一次只能在一个屏幕上看到的话,这会变得特别有价值)。两个版本都运行良好。

你要问的第二件事是set减法表达式。在这种情况下,它会从visited中减去graph[vertex]set是包含vertex邻居的graph[vertex]。差异操作会查找visited中不属于set的所有值,并返回包含它们的list.extend

你要问的第三件事是set电话。这会将stack减法中的每个值附加到append(这是一个列表)。您可以编写循环并重复调用extend而不是调用set,但在这种情况下确实没有理由这样做。 stack是可迭代的,但值得注意的是,它们以任意顺序生成它们的项目,因此您无法准确地告诉它们在列表中时项目最终会以哪种顺序结束。幸运的是,顺序与此算法无关。

值得注意的是,如果没有set减法,函数仍然可以工作。它的效率会稍微降低一些,因为更多的值会被添加到visited,只有在它们稍后从堆栈中弹出时才被跳过(因为它们已经是Date)。 / p>