Python 在图遍历中不理解基于DFS的返回顺序

Python 在图遍历中不理解基于DFS的返回顺序,python,algorithm,Python,Algorithm,我目前正在以图表的形式回顾DFS和BFS,并得出结论 下面是作为“正确”解决方案给出的代码 根据DFS的定义,解决方案的顺序如何为#{E',D',F',A',C',B'}?如果我从图A开始遍历,解决方案不是先尽可能深入,然后向上遍历吗 这是DFS的实际实现,还是只是一种“搜索算法”,而不是DFS?这是一种有效的DFS算法。但是,由于visited是一个集合,因此返回的visited节点的顺序不一定是插入它们的顺序。如果要查看插入顺序,则以下内容更合适: graph = {'A': set(['B

我目前正在以图表的形式回顾DFS和BFS,并得出结论

下面是作为“正确”解决方案给出的代码

根据DFS的定义,解决方案的顺序如何为#{E',D',F',A',C',B'}?如果我从图A开始遍历,解决方案不是先尽可能深入,然后向上遍历吗


这是DFS的实际实现,还是只是一种“搜索算法”,而不是DFS?

这是一种有效的DFS算法。但是,由于visited是一个集合,因此返回的
visited
节点的顺序不一定是插入它们的顺序。如果要查看插入顺序,则以下内容更合适:

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 = [], [start]
    while stack:
        vertex = stack.pop()
        if vertex not in visited:
            visited.append(vertex)
            stack.extend(graph[vertex] - set(visited))
    return visited

print dfs(graph, 'A') # ['A', 'B', 'D', 'E', 'F', 'C']
另外,请注意代码的原始作者使用集合的原因:


当您执行未访问的
顶点时
使用集合的平均摊销成本为O(1),而使用列表的平均摊销成本为O(n)(请参阅)。与
设置(已访问)
调用相关的成本也可能很大(尽管我不知道有多大)。不管怎样,这都不是一个高度优化的示例(不管怎么说,它是用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 = [], [start]
    while stack:
        vertex = stack.pop()
        if vertex not in visited:
            visited.append(vertex)
            stack.extend(graph[vertex] - set(visited))
    return visited

print dfs(graph, 'A') # ['A', 'B', 'D', 'E', 'F', 'C']