【问题标题】:Counting all connected nodes in graph计算图中所有连接的节点
【发布时间】:2017-03-13 23:20:00
【问题描述】:

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

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

【问题讨论】:

  • 您是否要查找图的连通分量?
  • @jme 是的,这听起来像是我想要做的。

标签: python graph


【解决方案1】:

听起来您好像对计算图的连通分量感兴趣。我建议查看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

【讨论】:

  • 是的,这就是我们想要的。谢谢详细解答!
  • 连接的组件也可以在 scipy 中使用:docs.scipy.org/doc/scipy/reference/generated/…。我不知道哪个实现更快,但它可以避免在您的项目中产生额外的依赖。
  • 第二个链接坏了
猜你喜欢
  • 1970-01-01
  • 2013-03-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-01-02
  • 1970-01-01
相关资源
最近更新 更多