Если у вас мало узлов (например, несколько сотен миллионов), вы можете вычислить подключенные компоненты с помощью одного прохода через текстовый файл, используя память disjoint set forest.
Эта структура данных хранит только указатель ранга и родителя для каждого узла, поэтому он должен вписываться в память, если у вас мало узлов.
Для большего количества узлов вы можете попробовать ту же идею, но сохранить структуру данных на диске (и, возможно, улучшить с помощью кеша в памяти для хранения часто используемых элементов).
Вот некоторые Python код, который реализует простую версию в памяти непересекающихся набора лесов:
N=7 # Number of nodes
rank=[0]*N
parent=range(N)
def Find(x):
"""Find representative of connected component"""
if parent[x] != x:
parent[x] = Find(parent[x])
return parent[x]
def Union(x,y):
"""Merge sets containing elements x and y"""
x = Find(x)
y = Find(y)
if x == y:
return
if rank[x]<rank[y]:
parent[x] = y
elif rank[x]>rank[y]:
parent[y] = x
else:
parent[y] = x
rank[x] += 1
with open("disjointset.txt","r") as fd:
for line in fd:
fr,to = map(int,line.split())
Union(fr,to)
for n in range(N):
print n,'is in component',Find(n)
Если применить его к текстовый файл под названием disjointset.txt, содержащий:
1 2
3 4
4 5
0 5
он печатает
0 is in component 3
1 is in component 1
2 is in component 1
3 is in component 3
4 is in component 3
5 is in component 3
6 is in component 6
Вы можете сохранить память, не используя массив рангов, на стоимость потенциально увеличенного времени вычислений.
У вас есть оценка того, сколько узлов, ребер и компонентов могут быть задействованы? Кроме того, вам нужна совершенная точность, или приближение будет приемлемым? –