查找非重叠数组对的数量

时间:2018-12-15 17:45:30

标签: algorithm

问题是要从给定的数组集中计算非重叠数组对的数量(对所有数组对进行计数,以便它们没有任何公共元素)。

例如,

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)

1 个答案:

答案 0 :(得分:4)

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

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