我有一个大图(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的集团。
由于
答案 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 的代码中的循环)。