【问题标题】:Find number of pairs of disjoint sets in a list of sets在集合列表中查找不相交集合对的数量
【发布时间】:2019-05-16 18:40:45
【问题描述】:

问题陈述如下:给定n个集合的列表,每个集合包含k个整数,找出不相交集合对的数量。假设集合的可能元素是正的,并且以 c > n 为界,并且假设 k

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

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

这个问题最有效的解决方案是什么?

【问题讨论】:

标签: algorithm set time-complexity disjoint-sets


【解决方案1】:

作为k

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

现在比较需要 n * (n - 1) 次操作,分别是:

  • 将 s1.Last 与 s2.First 进行比较(应该是大多数情况,如 k
  • 考虑到 s1 和 s2 已排序,或者有效地搜索在 k 中最大的 s1 s2 交集

【讨论】:

  • Re:“比较 s1.Last 和 s2.First(大多数情况下应该是 k n] 中的 k 均匀随机选择的元素组成的集合进行了一些试验,用于各种 k 值和n。我发现在 k = 5 的情况下,无论 n 有多大,两组的范围重叠率超过 99%。 OP 没有指定从这些集合中采样的分布,但我认为你不能假设它会支持这种优化。 (如果不是,那么您的方法等同于 OP。)
  • @ruakh,我同意。不会删除这个答案,但我知道应该有更好的方法来解决这个问题
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-03-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-05-28
  • 2019-04-15
相关资源
最近更新 更多