阶段1:给定两个数组,比如A []和B [],你怎么能知道B的元素是否在A中?
阶段2:A []的大小是10000000000000 ...... B []比这小得多吗?
阶段3:B []的大小也是10000000000 .....?
我的回答如下:
第1阶段:
第二阶段: 使用位集,因为整数是32位....
第3阶段:..
你有什么好主意吗?
答案 0 :(得分:5)
散列A
中的所有元素[迭代数组并将元素插入到散列集],然后迭代B,并检查每个元素是否在B
中。您可以获得O(|A|+|B|)
的平均运行时间。
您不能获得亚线性复杂性,因此该解决方案对于平均情况分析是最佳的,但是,因为散列不 O(1)
最差案例,你可能会遇到糟糕的最坏情况。
修改强>
如果没有足够的空间在B中存储元素的哈希集,您可能希望使用bloom filters来设置概率解决方案。问题:可能存在一些误报[但绝不是假阴性]。当您为布隆过滤器分配更多空间时,正确的准确性会增加。
另一个解决方案如你所说,排序,这将是O(nlogn)
时间,然后对排序数组中B中的所有元素使用二进制搜索。
对于第三阶段,您获得相同的复杂性:O(nlogn)
使用相同的解决方案,它将花费大约两倍于第2阶段,但仍然O(nlogn)
<强> EDIT2:强>
请注意,有时您可以使用trie [对元素类型进行排序],而不是使用常规哈希,例如:对于整数,将数字存储为字符串,每个数字将为像个角色。使用此解决方案,您将获得O(|B|*num_digits+|A|*num_digits)
解决方案,其中num_digits
是您的数字中的位数[如果它们是整数]。假设num_digits
与有限大小有限,则会得到O(|A|+|B|)
最差情况。
答案 1 :(得分:2)
第1阶段:从A
制作哈希集并迭代B
,检查B[i]
中是否存在当前元素A
(相同@amit之前提出的方式)。复杂度(平均值) - O(长度(A)+长度(B))。
阶段2:从B
创建哈希集,然后迭代A
并且B
中是否存在当前元素,将其从B
中删除。如果在迭代B
后至少有1个元素,则B
中不存在所有A
元素;否则A
是B
的完整超集。复杂度(平均值) - O(长度(A)+长度(B))。
阶段3:对两个数组进行就地排序并进行迭代,在i
和{{1}的当前位置j
和A[i]
上搜索相同的数字(这个想法必须明显)。复杂性 - O(n * log n),其中n =长度(A)。