【发布时间】:2014-04-08 02:20:17
【问题描述】:
谁能指出正确的数据结构/算法来完成以下任务?
我想结合(联合?)以下两组节点得到第三组。
谢谢!
【问题讨论】:
标签: algorithm nodes graph-theory topology
谁能指出正确的数据结构/算法来完成以下任务?
我想结合(联合?)以下两组节点得到第三组。
谢谢!
【问题讨论】:
标签: algorithm nodes graph-theory topology
通常,图可以表示为邻接矩阵或邻接列表。无论哪种方式将它们联合起来都不难。
从邻接表的角度来看,你有
list1 = [[A,[B,K]],[B,[C,D,E]],...]
list2 = [[A,[B]],[B,[C,D,E]],...]
所以您要做的就是将邻接列表中每个节点的子列表合并
list3 = [[A,UNION([B,K],[B])]...]
对于邻接矩阵,它是微不足道的。简单循环遍历矩阵中的每一个aij,如果为0,而另一个矩阵中对应的项为1,则设置为1。
如果图 1 有类似的内容:
A B C
A 1 1 0
B 0 1 0
C 0 1 1
图 2 类似:
A B C
A 1 1 0
B 0 1 1
C 0 0 1
那么图 3 会以
结束 A B C
A 1 1 0
B 0 1 1
C 0 1 1
【讨论】:
我假设您正在使用一个图形数据结构,其中有 Node 实例,其中每个 Node 有一个 string Name 和一个 list<Node> Next。
我们将您的两个图称为G 和H,其中一个图是list<Node>。
让GNames 和HNames 成为每个图中的节点名称集。让MNames 成为GNames 和HNames 的并集。
创建一个新图表list<Node> M,其中MNames 中的每个名称都有一个新的Node。
将map<string, Node> GLookup, HLookup, MLookup 构建为从节点名称到Node 的每个list<Node> G, H, M 的映射。
对于此新图表M 中的每个Node u,将NextNames 计算为GLookup[u.Name].Next.Select(v => v.Name) 和HLookup[u.Name].Next.Select(v => v.Name) 的并集,然后对于NextNames 中的每个名称name,将MLookup[name] 添加到@ 987654347@.
M 现在是您的合并图。
list<Node> merge(list<Node> G, list<Node> H)
GNames = G.Select(u => u.Name)
HNames = H.Select(u => u.Name)
MNames = union(GNames, HNames)
M = MNames.Select(name => new Node(name))
GLookup = G.ToMap(u => u.Name)
HLookup = H.ToMap(u => u.Name)
MLookup = M.ToMap(u => u.Name)
foreach u in M
NextNames = union(
GLookup[u.Name].Next.Select(v => v.Name),
HLookup[u.Name].Next.Select(v => v.Name))
foreach name in NextNames
u.Next.Add(MLookup[name])
return M
【讨论】:
Node 对象,就可以轻松地将其转换为有效的代码。不要尝试重复使用现有的。