两个未排序整数数组的交集

时间:2019-08-24 21:50:51

标签: arrays data-structures int big-o

给出两个数组,大小分别为(m)的A和B。数组中的数字在[-n,n]范围内。我需要找到一种返回O(m)中A和B的交集的算法。

例如:
假设

A={1,2,14,14,5} 

B={2,2,14,3}

该算法需要返回2和14。

我试图定义两个大小为(n)的数组,一个代表正数,另一个代表负数,并且数组的每个索引代表数字。

我以为我可以扫描A和B的一个数组,并在数组中的每个元素上签名1,然后直接检查另一个数组的元素。 但是事实证明,我只能在初始化数组时使用它们-这需要O(n)。

我该怎么做才能改善算法?

4 个答案:

答案 0 :(得分:1)

这可以通过设置来完成:

A_set = set(A)
print([b for b in B if b in A_set])

集合的构建发生在O(m)中,检查B的每个元素需要O(m)时间,因此总的运行时复杂度为O(m)

您还将需要O(m)空间来存储集合。

答案 1 :(得分:0)

如果您可以在 O(m)时间或更短的时间内创建一个 2n + 1 布尔值的数组或位向量,则不必初始化该数组使用之前:

  1. 创建一个由2n + 1个元素组成的数组 S
  2. 对于 A 中的每个元素 a ,设置 S [a + n] = false
  3. 对于 B 中的每个元素 b ,设置 S [b + n] = true
  4. 返回 A 的元素 a ,其中 S [a + n] == true

如果您当时无法创建该数组,那么也许可以使用@fafl的答案,尽管那只是期望 O(m)的时间,除非集合的实现非常特殊。

答案 2 :(得分:0)

要注意的是两个集合中都有重复项(我知道那不是集合,集合具有唯一的条目,但是问题中所述的示例提示我说它是一个多集合)。期望n <= 10 ^ 6。从-n到n构建​​一个数组,该数组可以用作哈希映射。 “ 0”是“ -n”的索引,然后“ i”是“ i-n”的索引。遍历数组A,然后遇到一个值,例如c,hash [c + n] ++。现在为结果取一个空集。遍历数组B。对于B中的每个值c,如果hash [c + n]> 0,则将其放入结果集中并减少计数。这样就可以在O(m)中找到交点。

答案 3 :(得分:0)

建议manually implement a bit-set解决该问题。

例如: min(Array A, Array B) = 1并且 max(Array A, Array B) = 14- 因此,位集从min = 1max = 14Array A = :11001000000001Array B = :01100000000001*(Array A) &= *(Array B) = :01000000000001214

相关问题