在集合列表中查找不相交集合的对数

时间:2018-12-15 21:53:09

标签: algorithm set time-complexity disjoint-sets

问题陈述如下:给定n个集合的列表,每个集合包含k个整数,找到不交集的对数。假设集合中可能的元素为正,且在上方被c> n限制,并假设k << n。

我正在尝试提出一种比O(kn ^ 2)更快的有效算法来解决此问题,这是天真的解决方案的运行时间。

我能想到的最好的策略是遍历列表中的每个集合,并对集合的元素进行哈希处理,以使集合中的每个元素映射到包含它的集合的索引集合。然后,对于迭代中的当前集合,将其c个元素用作键,并考虑由哈希表作为值给出的c个索引集的并集。这个结果索引集表示到目前为止遇到的与当前集不脱节的集数,我们可以使用它来查找不相交集的数。在整个迭代过程中求和该值可得出正确答案。但是,由于联合运算为O(n),因此该策略并不比单纯的解决方案更好。

最有效的解决方案是什么?

1 个答案:

答案 0 :(得分:0)

作为k << n,您可以通过以下方法降低复杂度:

  • 对每个集合进行排序,可以是n * k * log(k)
  • 然后按倒数第一个元素n * log(n)排序所有集合

现在比较需要n *(n-1)个操作,这些操作是:

  • 比较s1.Last与s2.First(这在大多数情况下应为k << n)
  • 或者考虑到s1和s2已排序,或者有效地搜索k中最大的s1 s2交点