我想k
在无向图中找到所有大小的集团。这个问题描述了一个类似的问题;与链接问题中的 OP 不同,我对查找所有派系不感兴趣,只对 size 的派系感兴趣k
。
到目前为止,我发现了两种方法。首先是按规模递增的顺序处理所有派系。第二个是计算所有最大派系,获取大小子集n
并删除重复项。
每种方法都有缺点并且在某些情况下是不切实际的。有没有更好的方法来找到给定大小的所有派系?
方法 1:按大小递增的顺序遍历列表。
import networkx as nx
from itertools import combinations
# iterate over all cliques in order of increasing size
def find_all_cliques_of_size_k1(g, k):
for c in nx.algorithms.clique.enumerate_all_cliques(g):
if len(c) == k:
yield c
if len(c) > k:
break
bad_case_1 = (nx.complete_graph(100), 98)
# find_all_cliques_of_size_k1(*bad_case_1) has to iterate over around 2^100 cliques
方法 2:生成最大派系并找到大小的唯一子集k
。
# find all maximal cliques, take subsets and size k and remove duplicates
def find_all_cliques_of_size_k2(g, k):
cliques = set()
for c in nx.algorithms.clique.find_cliques(g):
cliques.update(map(frozenset, combinations(c, k)))
return [list(c) for c in cliques]
bad_case_2 = (nx.random_graphs.erdos_renyi_graph(100, 0.9), 2)
# find_all_cliques_of_size_k2(*bad_case_2) considers a huge number of maximal cliques