有人能指出正确的数据结构/算法来完成以下任务吗?
我想结合(Union?)以下两组节点来获得第三组节点。
谢谢!
答案 0 :(得分:4)
通常,图表可以表示为邻接矩阵或邻接列表。要么将它们结合起来并不难。
从邻接列表的角度来看,你有
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
答案 1 :(得分:4)
我假设您正在使用图形数据结构,其中有Node
个实例,其中每个Node
都有string Name
和list<Node> Next
。
让我们调用您的两个图表G
和H
,其中图表为list<Node>
。
让GNames
和HNames
成为每个图表中的节点名称集。让MNames
成为GNames
和HNames
的结合。
创建一个新图表list<Node> M
,其中Node
中的每个名称都有一个新MNames
。
为每个map<string, Node> GLookup, HLookup, MLookup
构建Node
作为从节点名称到list<Node> G, H, M
的映射。
对于此新图Node u
中的每个M
,将NextNames
计算为GLookup[u.Name].Next.Select(v => v.Name)
和HLookup[u.Name].Next.Select(v => v.Name)
的联合,然后为每个名称name
在NextNames
中,将MLookup[name]
添加到u.Next
。
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