我有一个用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 []运算符会给我带来什么复杂性。
答案 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