【发布时间】:2018-01-02 08:20:57
【问题描述】:
这个想法是在无向图中构造一个按度数排序的节点列表。 图表以 {node: (set of its neighbours) for node in the graph}
的形式给出代码在“graph[neighbor].remove(node)”行引发 KeyError 异常。该节点似乎已从集合中删除,但我看不到在哪里。
谁能指出错误?
编辑:此节点列表用于按图中节点值的顺序模拟目标攻击。因此,在对度数最大的节点进行攻击后,将其从该节点中移除,并据此重新计算剩余节点的度数。
def fast_targeted_order(graph):
"""returns an orderedv list of the nodes in the graph in decreasing
order of their degrees"""
number_of_nodes = len(graph)
# initialise a list of sets of every possible degree
degree_sets = [set() for dummy_ind in range(number_of_nodes)]
#group nodes in sets according to their degrees
for node in graph:
degree = len(graph[node])
degree_sets[degree] |= {node}
ordered_nodes = []
#starting from the set of nodes with the maximal degree
for degree in range(number_of_nodes - 1, -1, -1):
#copy the set to avoid raising the exception "set size changed
during the execution
copied_degree_set = degree_sets[degree].copy()
while degree_sets[degree]:
for node in copied_degree_set:
degree_sets[degree] -= {node}
for neighbor in graph[node]:
neighbor_degree = len(graph[neighbor])
degree_sets[neighbor_degree] -= {neighbor}
degree_sets[neighbor_degree - 1] |= {neighbor}
graph[neighbor].remove(node)
ordered_nodes.append(node)
graph.pop(node)
return ordered_nodes
【问题讨论】:
-
如果只想按度数对节点进行排序,为什么要在找到节点度数后修改图形?
-
因为我想在目标攻击的模拟中按照节点值的顺序使用这个节点列表。因此,在对度数最大的节点进行攻击后,将其从该节点中移除,并据此重新计算剩余节点的度数。感谢您的评论,我会修改问题。
-
使用
|=和-=添加或删除集合中的一个元素比使用add和remove/discard的可读性更低且速度更慢。 -
另外我猜
ordered_nodes.append(node)和graph.pop(node)应该缩进到for node in copied_degree_set:循环内? -
度数为零时可以再次访问访问过的节点。我建议你对这个图 {1: {2}, 2: {1}} 进行一步一步的跟踪,这是一个有两个节点的图,有一条边连接它们。
标签: algorithm python-2.7