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')
任何人都可以解释为什么我们使用这些
visited,stack = set(), [start]
graph[vertex] - visited
stack.extend(graph[vertex] - visited)
答案 0 :(得分:0)
您要问的第一行是初始化visited
和stack
变量。如果您愿意,可以将它写在两行:
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>