Разработка алгоритма: найдите CC, содержащие определенные узлы, из большого списка ребер

Дано: Большой список ребер, около 90-100 миллионов ребер, 2 миллиона узлов. Эти ребра составляют гигантский граф с тысячами компонент связности.

У меня также есть список интересных узлов. Я хочу извлечь края только CC, содержащих эти узлы.

Например, вот крошечный пример: рассмотрим небольшой график с 3 CC внутри него.

      edge_list = [(1,2), (3,2), (1,1), (4,5), (5,6), (4,6), (7,8), (8,9), (9,7)] #three CCs
## Below commands for visualization sake
G = nx.Graph() 
G.add_edges_from(edges)
nx.draw(G, with_labels=True)

И у меня есть интересные узлы: NOI = [1,5]

Мне нужна функция, которая делает следующее:

      CC_list = find_ccs(edge_list, NOI)
print(CC_list)
#output: [[(1,2), (3,2), (1,1)],
#          [(4,5), (5,6), (4,6)]]

Обратите внимание, что возвращаются только края двух CC, содержащих NOI. Я хочу делать это в массовом порядке.

Я открыт для любого решения, использующего Networkx, StellarGraph или, что наиболее предпочтительно, PySpark. Я могу читать список краев с помощью pyspark, и как только у меня есть отфильтрованный список краев, я могу преобразовать его в CC, используя любую библиотеку.

1 ответ

Выберите интересующий узел. Запустите BFS из него, чтобы найти связанный компонент, который его содержит. Каждый раз, когда вы добавляете узел в CC, проверяйте, является ли он интересующим вас узлом, и удаляйте его из набора, чтобы проверить, есть ли он. Повторяйте, пока не найдете все CC, содержащие интересующие узлы.

Время выполнения - O(V+E), где V и E - это узлы и ребра CC, которые содержат интересующие узлы, а не более крупный граф.

Другие вопросы по тегам