[英]Counting all connected nodes in graph
我有一个> 10k的(无序)数字对列表。 我想将它们直接或间接地分类为连接对的集合。 我认为这对应于无向图。 我使用python,并试图像这样来表示这种结构。
为了知道与i
所有数字,我可以检查列表中除i
之外的所有j
是否有从i
到j
的路径。 但是,使用此实现,对于我正在处理的列表大小而言,计算时间变得太长。 有没有更有效的方法可以做到这一点? (或者是否已经建立了python库?)
听起来好像您对计算图形的连接组件感兴趣。 我建议研究一下networkx软件包及其用于计算组件的工具 。
例如,假设我们的数据是数字对的列表,每对数字代表图形中的一条边:
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}
任何一对节点之间也都有一条路径{6, 7, 8, 9, 10}
。 但是,例如从5
到7
,是没有路径的。 也就是说,图中有两个连接的组件。
为了发现这些组件,我们首先导入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
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.