面试挑战:在两个数组中查找不同的元素

时间:2011-10-13 15:15:33

标签: algorithm

  
      
  • 阶段1:给定两个数组,比如A []和B [],你怎么能知道B的元素是否在A中?

  •   
  • 阶段2:A []的大小是10000000000000 ...... B []比这小得多吗?

  •   
  • 阶段3:B []的大小也是10000000000 .....?

  •   

我的回答如下:

  • 第1阶段:

    1. for for loop - O(N ^ 2);
    2. 排序A [],然后二元搜索 - O(NlgN)
  • 第二阶段: 使用位集,因为整数是32位....

  • 第3阶段:..

你有什么好主意吗?

2 个答案:

答案 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元素;否则AB的完整超集。复杂度(平均值) - O(长度(A)+长度(B))。

阶段3:对两个数组进行就地排序并进行迭代,在i和{{1}的当前位置jA[i]上搜索相同的数字(这个想法必须明显)。复杂性 - O(n * log n),其中n =长度(A)。