簡體   English   中英

在圖遍歷中不了解基於DFS的退貨順序

[英]not understanding the return order based on DFS in graph traversal

我目前正在查看圖形中的DFS和BFS,並在代碼審查中遇到了這個問題

這是作為“正確”解決方案給出的代碼

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') # {'E', 'D', 'F', 'A', 'C', 'B'}

根據DFS的定義,解決方案如何按照# {'E', 'D', 'F', 'A', 'C', 'B'}的順序排列? 如果我要從圖A遍歷,解決方案是不是先盡可能深入,然后向上遍歷?

這是DFS的實際體現,還是只是“搜索算法”,而不是DFS?

這是有效的DFS算法。 但是,由於拜訪是一個集合,所以返回的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']

另外,請僅注意代碼原始作者使用集合的原因:

當您不vertex not in visited ,使用集合的平均攤銷成本為O(1),而使用列表時的平均攤銷成本為O(n)(請參閱https://wiki.python.org/moin/TimeComplexity )。 set(visited)調用相關的費用也可能很高(盡管我不知道有多重要)。 無論哪種方式,這都不是一個高度優化的示例(無論如何都在python中),對於小型圖,沒人會在意。 如果您希望兩全其美,則可以嘗試維護訪問節點的列表(用於排序)和集合(用於實際操作),盡管這要付出額外的內存使用成本。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM