【问题标题】:question on find value in array关于在数组中查找值的问题
【发布时间】:2010-06-15 08:33:09
【问题描述】:

我前几天看到过这样的问题

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.lengtharray2.length); 我很感兴趣第一种方法的复杂性也一样吗? 因为我们应该先排序数组然后使用搜索方法 二分查找算法的复杂度是 log_2(n) 所以这意味着总时间将是 array.lengthlog_2(n) 和关于排序? 请解释一下哪个更好

【问题讨论】:

    标签: algorithm


    【解决方案1】:

    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
    

    【讨论】:

    • 这并不完全正确。首先,您不必对两个数组进行排序,其次,两个数组的长度不必相等。
    • @IVlad:好的,进行了调整。
    【解决方案2】:

    第一种方法更好。如果对array1进行排序,第一种方法的复杂度是O(array1.length*log(array1.length) + array2.length*log(array1.length)),因为首先对第一个数组(在O(array1.length*log(array1.length))中)进行排序,然后对第二个数组中的每个元素,在第一个数组中进行二分查找(在O(array2.length*log(array1.length))。

    【讨论】:

      【解决方案3】:

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

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

      【讨论】:

        【解决方案4】:

        如果您可以选择使用额外的数据结构,那么使用散列会帮助您:将第一个数组的所有元素推入散列。遍历第二个数组并检查每个元素的存在。如果它存在于散列中 --> 这对两个数组都是通用的。

        【讨论】:

          猜你喜欢
          • 2014-12-27
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2020-08-04
          • 1970-01-01
          • 2019-12-20
          • 1970-01-01
          • 2021-02-12
          相关资源
          最近更新 更多