代码之家  ›  专栏  ›  技术社区  ›  Karel Petranek

判断诱导子图是否完整的快速算法

  •  6
  • Karel Petranek  · 技术社区  · 14 年前

    我有一个无向无权重图G=(V,E)和一个随机选择的顶点子集S。我想检查s中的顶点是否相互相邻(即形成一个完整的子图/a组)。

    我有以下算法(伪代码):

    foreach vertex in S  {
      // Check that the vertex has enough edges
      if (vertex.edges.count < S.size - 1)
        return false;
    
      // Check that there is an edge to each vertex in S
      foreach vertex2 in S  {
        if (!vertex.hasEdgeTo(vertex2))
          return false;
      }
    }
    return true;
    

    问题是这个算法的最坏性能是O(V| )(如果子集S包含完整图形的所有顶点)。

    我的问题是:是否有一个更快的算法,运行时具有更好的大O最坏情况的复杂性?

    3 回复  |  直到 14 年前
        1
  •  4
  •   Bolo    14 年前

    假设可以检查两个顶点是否在 O(1) ,您的算法 O(|V|²) = O(|E|) 最坏情况下的时间复杂性。我不认为你能做得比 O(|E|) ,因为您应该检查子图的所有边缘。

        2
  •  2
  •   Will A    14 年前

    我不相信你会得到一个非O(e_2)算法来执行这个检查。从逻辑上讲,每个v1-v2边缘都必须证明完整性。将其分成两个循环,首先检查边缘计数,然后检查顶点连接,这可能会加快算法的速度。也许另一种表示图形的方法(用边而不是顶点)会有帮助?

        3
  •  2
  •   Albert    14 年前

    你怎么做的? hasEdgeTo 表演?如果使用基于树的集来存储边,那么该函数不仅仅是O(1)。

    通过对边使用位向量,可以使用o(s*min(e,v,s)。