前几天我见过这样的问题
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)和排序? 请解释一下哪个更好
答案 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;这两个阵列都很常见。