我有一个无向加权图并根据现有节点组推导出一个新图:每个组成为新图中的一个节点,根据原始节点之间边缘的总权重连接到其他节点。
在当前数据结构中,每个节点都有一个邻居和权重的列表,算法将每个组/每个节点分组/节点中的每个边缘,并对权重进行求和,以确定边缘。新图。
这个算法运行正常,但速度很慢 - 有没有办法避免3级迭代?
保留单个边缘列表是一个选项,但是当构建新图形时,必须在每个步骤扫描新的边缘列表以查看该边缘是否已存在(并增加其权重)。 / p>
答案 0 :(得分:0)
如果O(E + Ngroups^2)
是一个选项,其中E
是给定图表中的边数,Ngroups
是组数,则可以按照以下步骤进行操作。
您可以为结果图创建邻接矩阵。然后循环遍历给定图形中的所有边缘,如
for each edge u in Graph
for v such that edge u->v exists
let w be the weight of u->v
A[group(u)][group(v)] := A[group(u)][group(v)] + w;
如果愿意,您可以从邻接矩阵重建新图形。
一种可能的优化是使用平衡树来保持从特定节点组开始的边缘而不是整个邻接矩阵,这将导致O(E*log(Ngroups))
时间复杂度。