【问题标题】:DFS with accessing a map element inside. Time complexity访问内部地图元素的 DFS。时间复杂度
【发布时间】:2019-02-05 18:05:15
【问题描述】:

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

【问题讨论】:

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


    【解决方案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 p>

    【讨论】:

    • 哦,真的很抱歉。我不知道怎么会发生这样的错误。里面应该叫map[]。我进行了更改。
    • 因为每次通过边时都调用对数函数,所以它是 O(E*log(V))。不过,您仍然必须确保在已经访问过的节点处停下来!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-01-28
    • 2023-03-04
    • 2019-08-26
    • 1970-01-01
    相关资源
    最近更新 更多