用于找出诱导子图是否完整的快速算法

时间:2010-07-31 23:41:59

标签: algorithm optimization graph

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

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

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 | 2 )(如果子集S包含完整图的所有顶点)。

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

3 个答案:

答案 0 :(得分:4)

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

答案 1 :(得分:2)

我不相信你会得到一个非O(| E | ^ 2)算法来执行这项检查。逻辑上,必须寻求每个V1-V2边缘以证明完整性。分成两个循环,第一个检查边缘计数,第二个检查顶点连接,这可能会加速算法。也许另一种表示图形的方法(有边而不是顶点)会有帮助吗?

答案 2 :(得分:2)

您的hasEdgeTo表现如何?如果使用基于树的集来存储边,则该函数不仅仅是O(1)。

通过对边缘使用位向量,可以使用O(| S | * min(| E |,| V |,| S |))。