DFS 访问内部的地图元素.时间复杂度

DFS with accessing a map element inside. Time complexity

本文关键字:元素 时间复杂度 地图 访问 内部 DFS      更新时间:2023-10-16

我有一个有向图,由C++写的地图表示。

Node{
 vector<int> adjacency_list;
};
Graph{
 map<Node,Node> map;
};

我有递归的DFS,比如(伪代码(:

dfs(node):
   for adjacent_node in node.adjacency_list:
       if(map[adjacent_node].valid):
          dfs(map[adjacent_node])

C++映射 [] 运算符的复杂性为:

大小对数。

我知道(邻接列表(有向图中的DFS是O(V + E(,但我不确定这个函数给我带来了这个map[]运算符的复杂性。

首先,从伪代码中不清楚 map::operator[] 在哪里调用,因为遍历映射通常是在没有它的情况下完成的(线性时间(。

其次,根据图的结构(即它是一棵树吗?(,你的算法可能会多次访问相同的节点,从而导致潜在的指数级时间复杂度。如果它包含有向循环,则永远不会终止。

使用以下C++代码,您确实会得到 O(V+E( 时间复杂度。

void dfs(Node& node) {
    if(node.visited) return;
    node.visited = true;
    for(Node& adj : node.adjacency_list) dfs(adj);
}

编辑:请注意,您实际上会得到O(E(时间复杂度,但如果E<V-1,您将不会访问所有节点。>