algorithm - 两个网络图的并集

标签 algorithm nodes graph-theory topology

任何人都可以指出正确的数据结构/算法来完成以下任务吗?

我想合并(合并?)以下两组节点以获得第三组节点。

谢谢!

enter image description here

最佳答案

简答

  1. 联合节点集。
  2. 合并边集。

长答案

我假设您使用的是图形数据结构,其中有 Node实例,其中每个 Node有一个 string Name和一个 list<Node> Next .

让我们称您的两个图表为 GH ,其中图形是 list<Node> .

GNamesHNames是每个图中的节点名称集。让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) , 然后对于每个名字 nameNextNames , 添加 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

关于algorithm - 两个网络图的并集,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22207688/

相关文章:

两个数相乘的算法

c++ - 具有某些特征的伪随机函数算法

python - 如何处理networkx图形中的重叠节点

c# - 如何检查图中的简单连通性?

c#-4.0 - 在 umbraco 中创建文件夹 - Umbraco 7

theory - 有向加权图游走

python - 如何根据python中的第一行字母将多维列表按字母顺序排序

python - 删除 igraph for Python 中的多条边

python - 我有兴趣反驳 python 中的一些图论猜想,最有效的库/服务器设置是什么?

algorithm - 如何在在线绘图应用程序中为随机用户客户端唯一分配颜色/线条图案?