【问题标题】:How does time complexity for depth first search on a graph come out to be O(V+E) in the following code?在以下代码中,图上深度优先搜索的时间复杂度如何变为 O(V+E)?
【发布时间】:2022-01-21 00:12:46
【问题描述】:

在下面的代码中,深度优先搜索图的时间复杂度是 O(V+E)?

Using a Python dictionary to act as an adjacency list

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

visited = set() # Set to keep track of visited nodes.

def dfs(visited, graph, node):
    if node not in visited:
        print (node)
        visited.add(node)
        for neighbour in graph[node]:
            dfs(visited, graph, neighbour)

# Driver Code
dfs(visited, graph, 'A')

【问题讨论】:

    标签: algorithm tree depth-first-search


    【解决方案1】:
    if node not in visited:
    

    因此,没有一个顶点被访问超过 1 次,而且这个条件不会被检查超过任何顶点的度数,我们知道度数的总和是 O(E),和

    for neighbour in graph[node]:
    

    因此,连接到每个节点的每条边都被视为DFS 的一个可能步骤

    所以 O(V+E) 的时间复杂度(假设在您的集合中插入和删除 O(1))

    【讨论】:

    • 请注意,if node not in visited 代表工作,即使条件为假。
    • @trincot 是的,现在我添加了更多信息。
    【解决方案2】:

    除了dfs 的第一次调用之外,dfs 的所有其他调用都将唯一地对应一个边。由于visited 机制,不可能对nodeneighbor 的相同值进行dfs 的递归调用。

    其实这是这个算法唯一的决定因素,所以是O(E)。

    如果图断开连接,该算法不会访问所有节点。当这是必须处理的情况时,驱动程序代码应如下所示:

    for node in graph:
        dfs(visited, graph, node)
    

    随着这种变化,复杂度变为 O(V+E)。这是因为在断开连接的图中,节点可能比边多得多,因此 O(E) 无法捕捉到复杂性,驱动程序代码中的循环成为决定因素。因此,您会说它是 O(MAX(V, E)),与 O(V+E) 相同。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-01-29
      • 1970-01-01
      • 2016-07-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多