给出两个数组,大小分别为(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)。
我该怎么做才能改善算法?
答案 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 布尔值的数组或位向量,则不必初始化该数组使用之前:
如果您当时无法创建该数组,那么也许可以使用@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
= 1
到max
= 14
和Array A = :11001000000001
和Array B = :01100000000001
— *(Array A) &= *(Array B) = :01000000000001
是2
和14
。