问题是要从给定的数组集中计算非重叠数组对的数量(对所有数组对进行计数,以便它们没有任何公共元素)。
例如,
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)
答案 0 :(得分:4)
我能想到的最好的时间是O(n * k)
和O(n + k)
的空间,其中n
是所有数组中元素的总数,k
是总数数组。在一定程度上,我们可以并行执行一些检查(例如,如果数组引用的任意选择可以合理地表示为一个位集,例如k
<= 64或足够小以合并其中的一些) ,我们可以减少验证O(n)
的时间。
只需维护一个哈希图,其中看到的每个值都指向一个比特集,该比特集到目前为止我们遍历了哪些数组都包括它。对于每个遍历的数组,请保留一个位集,以表示与之相交的数组。对于当前遍历数组中的每个元素,OR
对应于该值的哈希映射中的位集与数组的交集的位集记录。在横向结束时,未相交的数量将增加k - pop_count(array_intersection_record)
。