【问题标题】:find number of non-overlaping pairs of arrays查找不重叠的数组对的数量
【发布时间】:2025-11-25 22:50:01
【问题描述】:

问题是从给定的数组集合中计算非重叠数组对的数量(计算所有数组对,使其没有任何共同元素)。

例如给定,

a = [1,2,3]
b = [2,3,4]
c = [6,7,8]
d = [7,10,20]

以下对不重叠 (a,c), (a,d), (b,c), (b,d) 因为它们没有任何共同的元素,所以这个问题实例的答案是 4

我有一个 n^2 解决方案,它计算每个数组与每个其他数组的交集,如果交集为空集,则增加计数。

有没有有效的方法来解决这个问题? (优于n^2)

【问题讨论】:

  • 只需要计算它们,而不是输出它们。 @trincot
  • @Richard 是的,你是对的。更新了描述
  • 什么是n? (工作量取决于数组的数量和长度。)
  • 如果数组最多有一个共同元素,我可以在 O(n) 中做到这一点,但是有多个可能的交叉点我看不到在不明确检查每一对的情况下避免重复计算的方法(其中总是最坏的情况 O(n^2))。
  • 也许我们可以期待一堆alike questions

标签: algorithm


【解决方案1】:

我能想到的最好的是O(n * k)时间和O(n + k)空间,其中n是所有数组中元素的总数,k是数组的总数。在某种程度上我们可以并行执行一些检查(例如,如果数组引用的任意选择可以合理地表示为一个位集,例如,k O(n) 的时间。

只需维护一个哈希映射,其中看到的每个值都指向我们迄今为止遍历的数组的位集。对于每个遍历的数组,保留一个表示它与哪些数组相交的位集。对于当前遍历数组中的每个元素,OR 哈希映射中该值的位集与数组的交点位集记录。在横向结束时,不相交的数量增加了k - pop_count(array_intersection_record)

【讨论】: