Algorithm 二分图的两个子集之间的边数

Algorithm 二分图的两个子集之间的边数,algorithm,edges,subgraph,Algorithm,Edges,Subgraph,给定一个图G=(V,E),属于V的子集S,以及包含G不属于S的每个顶点的子集S',我想计算S和S'节点之间的边总数 一种比O(n^2)更复杂的算法可以解决这个问题。假设“低于O(n^2)”的意思是O(| E |),那么可以使用散列结构来实现。将S的所有节点放在一个hashset中,迭代G的所有边,并为每个边检查两个端点是否都在hashset中。构建哈希集是O(n),并且假设一个合理的哈希函数,处理所有边是O(| E |)。如果ω(n^2)中的| E |,你做得再好不过O(n^2) 编辑:两件事:

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

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

假设“低于O(n^2)”的意思是O(| E |),那么可以使用散列结构来实现。将S的所有节点放在一个hashset中,迭代G的所有边,并为每个边检查两个端点是否都在hashset中。构建哈希集是O(n),并且假设一个合理的哈希函数,处理所有边是O(| E |)。如果ω(n^2)中的
| E |
,你做得再好不过O(n^2)

编辑:两件事:

  • 最后一句关于如果ω(n^2)中的
    |E>不能做得更好的陈述是错误的,这取决于您用于图形的表示形式。让
    E'={E={s,v}in E | s in s}
    是与s中至少一条边关联的边集。如果有关联/邻接列表,则可以通过仅迭代与s中的节点关联的边来提高O(| E'|)的复杂性,并且| E'|可能比| E |小一个非常数因子,这取决于s
  • 该方法很容易转换为查找在S和V\S之间运行的边。只需创建两个哈希集,将S中的所有节点放入第一个哈希集中,将V\S中的所有节点放入另一个哈希集中。然后调整条件,使其仅接受一个hashset中的一个端点节点和另一个hashset中的另一个端点节点的边。根据两个诱导子图的大小和密度,只迭代集合中具有较少边的节点的边

“根据G,S的每个节点之间有多少条边”…详细说明@斯潘丹,他说的是由S导出的子图,所以他指的边是{e=(S,S')in e | S in S,S},非常感谢,这会很有帮助。