이것은 오래된 스레드이지만 여기에 나와있는 해결책이 있습니다.
def edges_cross(graph, nodes1, nodes2):
"""
Finds edges between two sets of disjoint nodes.
Running time is O(len(nodes1) * len(nodes2))
Args:
graph (nx.Graph): an undirected graph
nodes1 (set): set of nodes disjoint from nodes2
nodes2 (set): set of nodes disjoint from nodes1.
"""
return {(u, v) for u in nodes1
for v in nodes2.intersection(graph.adj[u])}
n=len(nodes1)
및 m=len(nodes2)
경우 외부 루프의 n 개의 반복이 있기 때문에 다음이 알고리즘은 O(nm)
에서 실행됩니다. 각 내부 루프는 을 호출하며 graph.adj[u]
이 집합 인 한 O(m)
시간에 실행됩니다 (실제로는 dict이지만 이것은 세트와 같은 돌팔매질하는 키에서 작동합니다). 교차로 실행 시간 설정에 대한 자세한 내용은 python docs을 참조하십시오.
비슷한 인수로 O(n^2)
에서 실행되는 노드 집합 내부의 가장자리에 대한 함수도 있지만 상수 요소를 줄이기위한 몇 가지 트릭이 포함되어 있습니다.
def edges_inside(graph, nodes):
"""
Finds edges within a set of nodes
Running time is O(len(nodes) ** 2)
Args:
graph (nx.Graph): an undirected graph
nodes1 (set): a set of nodes
"""
result = set([])
upper = nodes.copy()
graph_adj = graph.adj
for u in nodes:
for v in upper.intersection(graph_adj[u]):
result.add((u, v))
upper.remove(u)
return result
'A'와 'B'의 모든 것이 'g'의 노드라고 보장 할 수 있습니까? – Joel
보장한다고 가정합시다. – xiaohan2012