【问题标题】:Union of two network diagrams两个网络图的并集
【发布时间】:2014-04-08 02:20:17
【问题描述】:

谁能指出正确的数据结构/算法来完成以下任务?

我想结合(联合?)以下两组节点得到第三组。

谢谢!

【问题讨论】:

    标签: algorithm nodes graph-theory topology


    【解决方案1】:

    通常,图可以表示为邻接矩阵或邻接列表。无论哪种方式将它们联合起来都不难。

    从邻接表的角度来看,你有

    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
    

    【讨论】:

      【解决方案2】:

      简答

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

      长答案

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

      我们将您的两个图称为GH,其中一个图是list<Node>

      GNamesHNames 成为每个图中的节点名称集。让MNames 成为GNamesHNames 的并集。

      创建一个新图表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
      

      【讨论】:

      • 这绝对是正确的,但这更像是一种数学运算而不是数据结构运算。实际上实现这一点需要一些工作,具体取决于图形的表示方式。
      • @templatetypedef 我扩展了基于节点类的图形表示的情况。
      • 谢谢...起初我不喜欢简短的回答...但后来我想了 30 秒就明白了! :)
      • @BrianRice 对,从概念上讲,这是一个非常简单的操作。只要您小心创建全新的Node 对象,就可以轻松地将其转换为有效的代码。不要尝试重复使用现有的。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2023-03-06
      • 2019-01-19
      • 1970-01-01
      • 1970-01-01
      • 2022-06-27
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多