通过访问内部的map元素的DFS。时间复杂度

时间:2019-02-05 18:05:16

标签: c++ graph big-o complexity-theory

我有一个用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 ++ map []运算符的复杂度为:

  

对数大小。

我知道(邻接表)有向图中的DFS是O(V + E),但我不确定此map []运算符会给我带来什么复杂性。

1 个答案:

答案 0 :(得分:1)

首先,您的伪代码尚不清楚调用 map :: operator [] 的位置,因为通过 map 进行迭代通常不需要它(在线性时间)。

第二,根据图形的结构(即它是一棵树?),您的算法可能会多次访问相同的节点,从而导致潜在的指数时间复杂性。如果包含定向循环,它将永远不会终止。

使用以下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