【问题标题】:Optimizing this code to find connected components?优化此代码以查找连接的组件?
【发布时间】:2016-03-28 16:33:41
【问题描述】:

我有无向图,我需要找出图中连通分量的数量。我将图形表示为Map<Integer, ArrayList<Integer>> map(节点:连接节点列表)。然后我浏览该地图并计算连接的组件

int countComponents() {
    for (Integer u : map.keySet()) { //all nodes
        if (visited[u] == false) {
            visited[u] = true;
            components++;
            dfs(u);
        }
    }
    return components;
}

void dfs(int u) {
    for (Integer v : map.get(u)) { //v is node connected to u
        if (visited[v] == false) {
            visited[v] = true;
            dfs(v);
        }
    }
}

但我需要更高效的算法。也许使用另一种图表示更好,或者有另一种方法来查找连接组件的数量?

【问题讨论】:

    标签: java algorithm performance graph


    【解决方案1】:

    如果您对图的连接组件没有任何先验知识,那么您在这里获得的算法几乎是最快的。 (DFS 以线性时间运行。)如果你想加快速度,你可能只能通过一个常数因子来做到这一点,除非你有一些关于图形结构的其他信息。

    我建议研究不相交集森林数据结构,这是一种用于维护连接组件的非常快速的数据结构。它比 DFS 渐进地慢,但常数因子非常低,在实践中您可能会发现它比您这里的要快。

    【讨论】:

      【解决方案2】:

      我不知道有什么算法会比您的解决方案渐进地快,该解决方案在线性时间内运行。但是,您可以执行以下操作来减少常量:

      1. 使用 bfs 而不是 dfs:您需要为每个函数调用支付开销!
      2. 使用int[][]而不是Map<Integer, ListArray<Integer>>(可能Map<Integer, int[]>就足够了):首先int[]的访问速度比ListArray的访问速度快,其次你不必做拳击/将int 拆箱Integer

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2017-05-23
        • 2016-07-30
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多