图中心性计算:高效节点分组技术的实现优化问询
高效分组邻居集相同的图节点方案求助
我正在优化涉及频繁访问图节点中心性相关值的代码。由于邻居集相同的节点在计算中会得到相同的中心性值,我希望将这类节点分组,通过每组仅计算一次来减少计算量。但当前实现采用双重循环,时间复杂度为O(n²),在大图上效率低下,特此寻求高效实现方案。
原实现代码
def group_similar_nodes(G): node_groups = [] lonely_node = [] nbNodes = 0 neighbors = {} for node in G.nodes(): neighbors[node] = set(G.neighbors(node)) lonely_node.append(node) nbNodes+=1 for node in range(nbNodes): if node in lonely_node: group = [node] lonely_node.remove(node) for node2 in range(node+1,nbNodes): if(node !=node2) and (node2 in lonely_node): diff = neighbors[node] ^ neighbors[node2] diff.discard(node) diff.discard(node2) if(not diff): group.append(node2) lonely_node.remove(node2) node_groups.append(group) return node_groups
可复现示例
import networkx as nx def group_similar_nodes(G): node_groups = [] lonely_node = [] nbNodes = 0 neighbors = {} for node in G.nodes(): neighbors[node] = set(G.neighbors(node)) lonely_node.append(node) nbNodes+=1 for node in range(nbNodes): if node in lonely_node: group = [node] lonely_node.remove(node) for node2 in range(node+1,nbNodes): if(node !=node2) and (node2 in lonely_node): diff = neighbors[node] ^ neighbors[node2] diff.discard(node) diff.discard(node2) if(not diff): group.append(node2) lonely_node.remove(node2) node_groups.append(group) return node_groups i = 4 # 社区数量 n = 5 # 每个社区的节点数 p_in = 1 # 社区内部节点间连边概率 p_out = 0.1 # 社区间节点连边概率 G = nx.planted_partition_graph(i, n, p_in, p_out, seed=42) print(group_similar_nodes(G)) # 预期输出 # [[0, 1], [2], [3], [4], [5], [6], [7], [8], [9], [10], [11], [12], [13, 14], [15], [16], [17], [18], [19]]
内容的提问来源于stack exchange,提问作者Osamodas
相关产品推荐
相关产品推荐

