两部分图的两个子集之间的边数

时间:2013-06-14 12:38:22

标签: algorithm edges subgraph

给定图 G =(V,E),属于V的子集 S ,以及包含每个的子集 S' G 的顶点不属于 S ,我想计算 S S'节点之间的边缘总数/强>

一种能够以比O(n ^ 2)更好的复杂度解决这个问题的算法。

1 个答案:

答案 0 :(得分:3)

假设“低于O(n ^ 2)”表示类似O(| E |)的东西,那么你可以通过使用散列结构来做到这一点。将S的所有节点放在哈希集中,迭代G的所有边缘,并检查每个边缘是否都在哈希集中。构建hashset是O(n),并且假设一个合理的散列函数,处理所有边是O(| E |)。如果|E| in Omega(n^2),则不能比O(n ^ 2)做得更好。

编辑:两件事:

  • 最后声明如果|E| in Omega(n^2)错误则无法做得更好,具体取决于您用于图表的表示形式。让E' = {e = {s,v} in E | s in S}成为与S中至少有一条边相交的边集。如果你有入射/邻接列表,那么你可以通过迭代边缘事件来提高O(| E'|)的复杂度。 S中的节点和| E'|可能小于| E |取决于S的非常数因子。
  • 该方法很容易转化为找到在S和V \ S之间运行的边缘。只需创建两个哈希集,将S中的所有节点放入第一个节点,将V \ S中的所有节点放入另一个节点中。然后将条件调整为仅接受一个散列集中的一个末端节点和另一个散列集中的另一个末端节点的边。根据两个诱导子图的大小和密度,只需迭代与集合事件中节点相关的边缘,并且边缘较少。