我有一个无向图,我需要找到图中连通分量的个数。我将图形表示为 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);
}
}
}
但我需要更有效的算法。也许最好用另一种图形表示法,或者用另一种方法来求连通元件的个数?
2条答案
按热度按时间ttvkxqim1#
如果你没有任何关于图的连通部分的先验知识,那么你在这里得到的算法是最快的(dfs是在线性时间内运行的。)如果您想加快速度,您可能只能通过一个常数因子来实现,除非您有关于图形结构的其他信息。
我建议研究不相交的集合林数据结构,这是一种维护连接组件的非常快速的数据结构。它的渐近速度比dfs慢,但是常数因子很低,你可能会发现实际上它比这里的要快。
brgchamk2#
我不知道有什么算法会比你的解快,它是线性时间的。但是,您可以执行以下操作来减少常数:
使用bfs而不是dfs:您为每个函数调用支付开销!
使用
int[][]
而不是Map<Integer, ListArray<Integer>>
(可能吧)Map<Integer, int[]>
就够了):首先int[]
就像一个ListArray
第二,你不必对int
至Integer
.