为什么igraph的cliques()方法比justCliques慢几个数量级?

时间:2014-09-03 15:26:24

标签: algorithm graph igraph clique clique-problem

我想找到中等大小的所有派系,但密集连接的图表,有369个节点和22,724个边缘。首先,我通过python接口简单地调用了igraph的Graph.cliques()方法:

cliques = graph.cliques()

它仍在运行,并且在i7-4600U核心上消耗了超过3小时的净CPU时间。因此,我开始关注其他可能性,并且我记得几年前我已经使用过的一个很好的代码。它被称为justTheCliques,可在此处获取:https://github.com/aaronmcdaid/MaximalCliques。描述说:

  

在边缘列表上运行Bron-Kerbosch算法

运行此算法会在几秒钟内在同一图表上显示结果:

justTheCliques edge-list > cliques

我爱igraph,我只是想知道,这背后的根本原因是什么? Igraph使用不同的算法?结果应该是一样的吗?

2 个答案:

答案 0 :(得分:2)

igraph似乎正在使用像apriori这样的算法来实现.cliques()。 1-cliques是单顶点。 k-cliques是两个(k-1)-cliques的联合,它们共享除了两个顶点之外的所有顶点,它们之间具有边缘。我想这个算法在你的图上明显不如Bron - Kerbosch。如果您只需要最大派系,看起来好像.maximal_cliques()正在使用类似B-K的算法。

答案 1 :(得分:1)

大卫是对的,如果你想要最大的派系,那么你应该使用maximal.cliques()。我做了一个快速的比较,似乎igraph实际上比你使用的C ++库快4-5,虽然这可能取决于你的图:

library(igraph)
g <- erdos.renyi.game(369, 22724, type="gnm")
system.time(xx <- maximal.cliques(g))
#   user  system elapsed 
#  1.432   0.012   1.448 
write.graph(g, format = "edgelist", file = "graph.txt")

vagrant@logus:~/cli/MaximalCliques$ time ./justTheCliques graph.txt  > cliques.txt
Network loaded after 0.15 seconds. 369 nodes and 22724 edges. Max degree is 149
processing node: 100 ...
processing node: 200 ...
processing node: 300 ...
388111 cliques found
0   #3
10367   #4
209815  #5
151633  #6
15896   #7
396     #8
4       #9

real    0m6.419s
user    0m5.324s
sys     0m1.036s