我正在使用~200个节点和~3500个边缘的图表。我需要找到这张图的所有派系。使用networkx' enumerate_all_cliques()
适用于最多100个节点的较小图形,但是对于较大的节点而言内存不足。
"然而,希望这种算法不会耗尽内存 因为它只将候选子列表保存在内存中 不断删除耗尽的子列表。" source code for enumerate_all_cliques()
为了节省内存,是否有办法返回长度为k的所有派系的生成器而不是所有派系?
答案 0 :(得分:2)
似乎您的首要任务是节省内存而不是获得所有派系。在这种情况下,使用networkx.find_cliques(G)是一个令人满意的解决方案,因为您将获得所有最大派系(包含给定节点的最大完整子图)而不是所有派系。
我比较了两个函数的列表(子图)的数量:
G = nx.erdos_renyi_graph(300,0.08)
print 'All:',len(list(nx.enumerate_all_cliques(G)))
print 'Maximal',len(list(nx.find_cliques(G)))
全部:6087
最大2522
当图表中边缘数量增加时,结果的差异会变宽。