find_cliques#
- find_cliques(G, nodes=None)[源]#
返回无向图中的所有极大团。
对于每个节点 n,*包含 n 的极大团* 是包含 *n* 的最大完全子图。最大的极大团有时称为 *最大团*。
此函数返回一个团的迭代器,每个团都是一个节点列表。它是一个迭代实现,因此不会遇到递归深度问题。
此函数接受一个节点列表
nodes
,并且仅返回包含所有这些节点的极大团。如果需要查找特定的团,这可以显著加快运行时间。- 参数:
- GNetworkX 图
一个无向图。
- nodes列表,可选 (默认为 None)
如果提供,则只返回包含
nodes
中所有节点的*极大团*。如果nodes
本身不是一个团,则会引发 ValueError。
- 返回:
- 迭代器
一个极大团的迭代器,每个团都是
G
中节点列表。如果提供了nodes
,则只返回包含nodes
中所有节点的极大团。团的顺序是任意的。
- 引发:
- ValueError
如果
nodes
不是一个团。
另请参阅
find_cliques_recursive
同一算法的递归版本。
注意
要获取所有极大团的列表,请使用
list(find_cliques(G))
。但是,请注意,在最坏情况下,此列表的长度可能随图中节点数量呈指数增长。此函数通过在搜索过程中仅将当前候选节点列表保存在内存中,避免了将所有团存储在内存中。此实现基于 Bron 和 Kerbosch (1973) 发表的算法 [1],并由 Tomita, Tanaka 和 Takahashi (2006) [2] 进行了改进,在 Cazals 和 Karande (2008) [3] 中进行了讨论。它基本上展开了参考文献中使用的递归,以避免递归栈深度问题(有关递归实现,请参阅
find_cliques_recursive()
)。此算法忽略自环和并行边,因为团通常不包含此类边。
参考文献
[1]Bron, C. 和 Kerbosch, J. “算法 457:查找无向图的所有团”。ACM 通讯 16, 9 (1973 年 9 月),575–577 页。 <http://portal.acm.org/citation.cfm?doid=362342.362367>
[2]Etsuji Tomita, Akira Tanaka, Haruhisa Takahashi, “生成所有极大团的最坏情况时间复杂度及计算实验”,理论计算机科学,第 363 卷,第 1 期,计算与组合学,第 10 届国际计算与组合学年会 (COCOON 2004),2006 年 10 月 25 日,第 28–42 页 <https://doi.org/10.1016/j.tcs.2006.06.015>
[3]F. Cazals, C. Karande, “关于报告极大团问题的一个注记”,理论计算机科学,第 407 卷,第 1-3 期,2008 年 11 月 6 日,第 564–568 页,<https://doi.org/10.1016/j.tcs.2008.05.010>
示例
>>> from pprint import pprint # For nice dict formatting >>> G = nx.karate_club_graph() >>> sum(1 for c in nx.find_cliques(G)) # The number of maximal cliques in G 36 >>> max(nx.find_cliques(G), key=len) # The largest maximal clique in G [0, 1, 2, 3, 13]
最大极大团的大小称为图的*团数*,可以直接通过以下方式找到:
>>> max(len(c) for c in nx.find_cliques(G)) 5
还可以计算
G
中包含给定节点的极大团数量。以下代码生成一个以节点为键、以G
中包含该节点的极大团数量为值的字典:>>> pprint({n: sum(1 for c in nx.find_cliques(G) if n in c) for n in G}) {0: 13, 1: 6, 2: 7, 3: 3, 4: 2, 5: 3, 6: 3, 7: 1, 8: 3, 9: 2, 10: 2, 11: 1, 12: 1, 13: 2, 14: 1, 15: 1, 16: 1, 17: 1, 18: 1, 19: 2, 20: 1, 21: 1, 22: 1, 23: 3, 24: 2, 25: 2, 26: 1, 27: 3, 28: 2, 29: 2, 30: 2, 31: 4, 32: 9, 33: 14}
或者,类似地,计算
G
中包含给定节点的极大团。例如,包含节点 31 的 4 个极大团:>>> [c for c in nx.find_cliques(G) if 31 in c] [[0, 31], [33, 32, 31], [33, 28, 31], [24, 25, 31]]