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

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

最佳答案

一个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

关于algorithm - 关于在数组中查找值的问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3043633/

相关文章:

c# - 给定两个指定方向的 3D 旋转

algorithm - 查找BST中任意key后的后继节点

javascript - 如何在过滤元素期间随机化数组(不过滤数组然后随机化元素)?

algorithm - 如何检查无向图是否具有奇数长度的循环

algorithm - 利润最大化的寻路算法

c# - 如何在C#中实现维特比算法来拆分连体词?

组织矩阵以使邻居最接近的算法

algorithm - 它如何获得相同的前缀和后缀?

algorithm - 算法分析中如何判断一个函数是否属于特定的渐近类型?

确定文章质量的算法