java—优化此代码以查找连接的组件?

w46czmvw  于 2021-07-13  发布在  Java
关注(0)|答案(2)|浏览(340)

我有一个无向图,我需要找到图中连通分量的个数。我将图形表示为 Map<Integer, ArrayList<Integer>> map (节点:已连接节点的列表)。然后我浏览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);
        }
    }
}

但我需要更有效的算法。也许最好用另一种图形表示法,或者用另一种方法来求连通元件的个数?

ttvkxqim

ttvkxqim1#

如果你没有任何关于图的连通部分的先验知识,那么你在这里得到的算法是最快的(dfs是在线性时间内运行的。)如果您想加快速度,您可能只能通过一个常数因子来实现,除非您有关于图形结构的其他信息。
我建议研究不相交的集合林数据结构,这是一种维护连接组件的非常快速的数据结构。它的渐近速度比dfs慢,但是常数因子很低,你可能会发现实际上它比这里的要快。

brgchamk

brgchamk2#

我不知道有什么算法会比你的解快,它是线性时间的。但是,您可以执行以下操作来减少常数:
使用bfs而不是dfs:您为每个函数调用支付开销!
使用 int[][] 而不是 Map<Integer, ListArray<Integer>> (可能吧) Map<Integer, int[]> 就够了):首先 int[] 就像一个 ListArray 第二,你不必对 intInteger .

相关问题