关于在数组中查找值的问题

时间:2010-06-15 08:33:09

标签: algorithm

前几天我见过这样的问题

there is given two array find      elements which are common   of these array

其中一个解决方案是排序大数组然后使用二进制搜索算法
还有另一种算法 - 强力算法

 for (int i=0;i<array1.length;i++){
  for (int j=0;j<array2.length;j++){
 if (array1[i]==array2[j]){
//code here
}
}

它的复杂性是O(array1.length array2.length);   我感兴趣的第一种方法的复杂性也是一样的吗? 因为我们应该首先排序数组然后使用搜索方法 二进制搜索算法的复杂度是log_2(n),因此它意味着总时间将是 array.length log_2(n)和排序? 请解释一下哪个更好

4 个答案:

答案 0 :(得分:2)

O(M log N)解决方案

arr1的长度为O(M)arr2的长度为O(N)。排序/二进制搜索算法为O(M log N)

伪代码如下:

SORT(arr2)   # N log N

FOR EACH element x OF arr1             # M
   IF binarySearch(x, arr2) is FOUND   # log N
       DECLARE DUP x

O(M log N) O(MN)好。


线性时间解决方案

还有第三种方式O(M+N),使用具有O(1)插入和测试的集合。基于散列的集合符合这种期望。

伪代码如下:

INIT arr1set AS emptySet

FOR EACH element x OF arr1    # M
   INSERT x INTO arr1set      # 1

FOR EACH element x OF arr2    # N
   IF arr1set CONTAINS x      # 1
      DECLARE DUP x

答案 1 :(得分:0)

第一种方法更好。如果你排序array1,第一种方法的复杂性是O(array1.length*log(array1.length) + array2.length*log(array1.length)),因为首先你排序第一个数组(在O(array1.length*log(array1.length))中),然后对于第二个数组中的每个元素,你是二进制的在第一个数组(O(array2.length*log(array1.length))中搜索它。

答案 2 :(得分:0)

第一个解决方案的复杂性将是:

sort_complexity(longer_array) + smaller_array.length*log_2(longer_array.length)

答案 3 :(得分:0)

如果您可以选择使用其他数据结构,那么使用散列会帮助您这样做:将第一个数组的所有元素推送到散列中。迭代第二个数组并检查每个元素的存在。如果它存在于哈希中 - &gt;这两个阵列都很常见。