编辑
底部的答案相对干净。然而,以下方法似乎更快:
def is_subclique(G,nodelist):
H = G.subgraph(nodelist)
n = len(nodelist)
return H.size() == n*(n-1)/2
我必须承认,我并不完全理解。但显然创建子图比检查每个边是否存在要快。
比我预期的更慢的替代方案:
我们将检查所有边是否存在。我们将使用combinations
生成我们要检查的对。请注意,如果combinations
返回(1,2)
,则它不会返回(2,1)
。
from itertools import combinations
import networkx as nx
def is_subclique(G, nodelist):
r'''For each pair of nodes in nodelist whether there is an edge
if any edge is missing, we know that it's not a subclique.
if all edges are there, it is a subclique
'''
for (u,v) in combinations(nodelist,2):
if not G.has_edge(u,v):
return False
return True
G = nx.Graph()
G.add_edges_from([(1,2), (2,3), (3,1), (4,1)])
is_subclique(G, [1,2,3])
> True
is_subclique(G, [1,4])
> True
is_subclique(G, [2,3,4])
> False
/
进行整数除法,而是使用//
。如果使用/
,Python 3 会将整数转换为浮点数,而//
在 Python 2 和 3 中都可以使用,对于整数操作数产生整数结果。 - Tom KarzesG.has_clique(t)
这样的东西就很好。 - bubsy_revelations//
将会向下取整并可能掩盖问题。 - bubsy_revelations/
运算符,Python 2也不会给您提供浮点结果,除非您显式地先将其中一个操作数转换为浮点数。 - Tom Karzes