给定图 G =(V,E),属于V的子集 S ,以及包含每个的子集 S' G 的顶点不属于 S ,我想计算 S 和 S'节点之间的边缘总数/强>
一种能够以比O(n ^ 2)更好的复杂度解决这个问题的算法。
答案 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的非常数因子。