【发布时间】:2020-09-19 02:00:30
【问题描述】:
问题描述:
目的是提取某个顶点所属的组件,以计算其大小。
代码步骤:
- 使用igraph方法clusters()获取图中所有连通分量(c.c)的列表。
- 然后,遍历 c.c 列表,同时每次检查某个节点是否属于它。
- 找到后,我计算它的大小。
代码如下:
def sizeofcomponent(clusters, vertex):
for i in range(len(clusters)):
if str(vertex) in clusters.subgraphs()[i].vs["name"]:
return(len(clusters.subgraphs()[i].vs["name"]))
问题是这段代码将用于非常大图,这种处理方式大大降低了我的代码速度。有什么办法可以改善吗?
EDIT 01:算法工作原理的解释
-
假设下图是主图:
-
计算Maximal Independent Set (MIS),我们得到以下图表,我称之为components:
-
从主图随机添加一个节点,该节点属于主图但不属于组件 (不是 MIS 的一部分)。 示例: 将节点 10 添加到组件。
计算它形成的组件的大小。
对所有节点(不属于组件 (MIS) 的节点)重复该过程。
最后,形成最小组件(最小尺寸)的节点是永久添加到组件的节点。
您的解决方案:
- 执行以下代码时(i 为顶点):
cls = components.clusters()
c = cls.membership[i]
示例:节点 (2) 属于组件 1(id 为 1)。
为什么它对我不起作用:
以下代码行不会给我正确的结果:
cls = components.clusters()
c = cls.membership[i]
因为列表 c 中节点的 id 与节点的 name 不匹配。示例:cls.membership[i] 会给出异常错误:列表超出范围。而不是正确的结果是:4.
此外,根据您的代码,在您的情况下,大小是按以下方式计算的:
c = components.membership[i]
s = components.membership.count(c)
【问题讨论】:
标签: python python-3.x igraph connected-components