计算图中所有连接的节点

时间:2016-10-31 19:54:07

标签: python graph

我有一个> 10k(无序)数字对的列表。我想直接或间接地将它们分类为多组连接对。我认为这对应于无向图。我正在使用python,并尝试使用this之类的东西来表示这种结构。

为了知道与i相关的所有号码, 我可以检查列表中除i之外的所有j是否存在从ji的路径。但是,使用此实现,计算时间对于我正在处理的列表的大小来说太长了。有没有更有效的方法来做到这一点? (或者是否已经建立了python库?)

1 个答案:

答案 0 :(得分:4)

听起来好像您有兴趣计算图表的连通组件。我建议您查看networkx包及其tools for computing components

例如,假设我们的数据是一对数字对,每对代表图中的一条边:

pairs = [
    (1, 2),
    (2, 4),
    (3, 5),
    (2, 5),
    (7, 9),
    (9, 10),
    (8, 7)
]

在由这些边表示的图中,集合{1, 2, 3, 4, 5}中的任何节点对之间存在路径,{6, 7, 8, 9, 10}中的任何节点对之间也存在路径。但是,从57没有路径。这就是说图中有两个连通的组件。

要发现这些组件,我们首先导入networkx并创建图表:

>>> import networkx as nx
>>> graph = nx.from_edgelist(pairs)

计算组件就像

一样简单
>>> list(nx.connected_components(graph))
>>> [{1, 2, 3, 4, 5}, {6, 7, 8, 9, 10}]

nx.connected_components是一个生成器,所以我们在这里将结果转换为列表以显示所有连接的组件。

我们还可以找到包含给定节点的连通组件:

>>> nx.node_connected_component(graph, 3)
{1, 2, 3, 4, 5}

我们还可以快速计算连接组件的数量:

>>> nx.number_connected_components(graph)
2