R:使用igraph有效地找到特殊尺寸的派系

时间:2015-08-29 06:54:43

标签: r igraph clique

我有一个大图(100000个节点),我想找到它的大小为5的派系。 我将此命令用于此目标:

cliques(graph, min=5, max=5) 

计算此操作需要大量时间。它似乎首先试图找到图的所有最大派系,然后选择大小为5的派系;我想这是因为这两个命令之间的运行时间差别很大,而他们两个都做同样的工作:

adjacent.triangles (graph)  # takes about 30s
cliques(graph, min=3, max=3)    # takes more than an hour

我正在寻找像adjacent.triangles这样的命令来有效地找到大小为5的集团。

由于

1 个答案:

答案 0 :(得分:2)

adjacent.triangles()cliques()之间存在巨大差异。 adjacent.triangles()只需计算三角形,而cliques()需要存储所有三角形。如果有很多三角形,这可以很容易地解释时差。 (另一个因素是cliques()中的算法是通用的,不仅限于三角形 - 可能是adjacent.triangles()包含一些优化的情况,因为我们知道我们只对三角形感兴趣。“ p>

为了它的价值,cliques() 找到所有最大的派系;它从2-cliques(即边缘)开始,然后将它们合并为3-cliques,4-cliques等,直到达到您指定的最大大小。但同样,如果你的图表中有很多3-cliques,这很容易成为瓶颈,因为算法中有一点必须存储所有3个派系(即使你对它们不感兴趣),因为我们需要他们找到4个派系。

您可能最好先使用maximal.cliques()来大致了解图表中最大派系的大小。这里的想法是你有一个大小 k 的最大团,然后它的所有5个子集都是5个派系。这意味着它足以搜索最大派系,保留至少大小为5的那些,然后枚举所有大小为5的子集。但是你有一个不同的问题,因为一些派系可能被计算不止一次。

更新:我检查了adjacent.triangles的源代码,基本上它所做的就是它遍历所有顶点,并且对于每个顶点 v 它枚举其邻居的所有(u,w)对,并检查 u w 是否已连接。如果是这样,顶点 v 上有一个三角形。如果你有 n 顶点并且平均度数是 d ,那么这是一个O(nd 2 )操作,但它没有推广到任意大小的顶点(因为你需要硬编码 k -1嵌套在一组大小 k 的代码中的循环)。