【问题标题】:Python. DFS graph traversal, correct output?Python。 DFS图遍历,输出正确?
【发布时间】:2023-01-14 23:39:18
【问题描述】:

我目前正在掌握 Python 中的图形遍历。

给定下图:

使用这个字典实现:


graph = {'0': set(['1', '2', '3']),
         '1': set(['0','2']),
         '2': set(['0','1','4']),
         '3': set(['0']),
         '4': set(['2'])}

我认为从节点 0 开始的深度优先搜索遍历应该返回 [0,1,2,4,3] 是否正确?

我的 dfs 函数返回 [0,3,1,2,4] 所以我想知道我的实现是否有问题:

def dfs(graph, node,visited=None):
    if visited is None:
        visited=set()
        
    if node not in visited:
        print (node,end=' ')
        visited.add(node)
        
        for neighbour in graph[node]:
            dfs(graph,neighbour,visited=visited)

dfs(graph,'0')

帮助和建议表示赞赏。

【问题讨论】:

    标签: python graph-theory depth-first-search


    【解决方案1】:

    没关系。

    我意识到我的错误是由于我启动图表的方式造成的。我错误地通过了集合。使用以下内容似乎会产生预期的结果:

    graph = {'0': ['1', '2', '3'],
             '1': ['0','2'],
             '2': ['0','1','4'],
             '3': ['0'],
             '4': ['2']}
    
    dfs(graph, '0')
    

    【讨论】:

    • 不,这不是准确的答案。你使用set没有错。事实上,它甚至是更忠实的实现:DFS 没有指定孩子之间的优先顺序,也没有设置。因此,即使是不确定性也是守恒的。这是因为您确实使用了set,所以您最终不会得到订单0,1,2,4,3。但结论不应该是“所以,我不应该使用集合”,而是“所以,我不应该期望顺序正好是0,1,2,4,3”。 0,1,2,4,3 并不是 DFS 唯一可能的遍历顺序。请记住,DFS 和 BFS 是不明确的。它们仅指定部分遍历顺序。
    • 我懂了。谢谢你的清晰!
    【解决方案2】:

    不,你不是。

    你说遍历顺序可以是[0,1,2,4,3]是对的。不是应该的。 关于遍历顺序,你唯一知道的是,在所有可探索的事物中,首先探索最后一个探索节点的后代。 但在这些之中,没有任何东西告诉你任何顺序。

    而且您选择的实现更加清楚,因为 python 中的 set 没有特定的顺序(但即使您选择了列表而不是集合,并编写了一个实现,在最最近探索的节点,探索列表的第一个孩子,确实导致[0,1,2,4,3],这只是你的实现,而不是关于 DFS 的规则。没有说你应该偏爱一个孩子而不是另一个孩子;或者,更准确地说,因为你必须选择一个,所以没有说明顺序。这完全取决于实现)。

    所以从你的图中,从 0 开始,DFS 遍历顺序可以是任何

    0,1,2,4,3
    0,2,1,4,3
    0,2,4,1,3
    0,3,1,2,4
    0,3,2,1,4
    0,3,2,4,1
    

    (加上我可能忘记的那些)

    【讨论】:

    • 感谢您的答复。我意识到我在图形实例化中使用 set 是导致意外结果的原因,但您的解释阐明了原因。谢谢!
    猜你喜欢
    • 1970-01-01
    • 2017-02-12
    • 2017-10-13
    • 1970-01-01
    • 2021-05-06
    • 1970-01-01
    • 1970-01-01
    • 2014-02-24
    • 2014-03-06
    相关资源
    最近更新 更多