Algorithm 关于在数组中查找值的问题
我几天前见过这样的问题Algorithm 关于在数组中查找值的问题,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 her
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
}
}
for(int i=0;iAnO(M log N)
solution
让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
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
O(M log N)
比O(MN)
好得多
线性时间解
还有第三种方法是O(M+N)
,使用具有O(1)
插入和测试的集合。基于哈希的集合满足这一期望
伪代码如下所示:
SORT(arr2) # N log N
FOR EACH element x OF arr1 # M
IF binarySearch(x, arr2) is FOUND # log N
DECLARE DUP x
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
第一种方法更好。如果排序array1
,第一种方法的复杂性是O(array1.length*log(array1.length)+array2.length*log(array1.length))
,因为首先排序第一个数组(在O(array1.length*log(array1.length))
),然后对第二个数组中的每个元素在第一个数组中进行二进制搜索(在O(array2.length*log(array1.length)
)。第一个解决方案的复杂性为:
sort_complexity(longer_array) + smaller_array.length*log_2(longer_array.length)
如果您可以选择使用其他数据结构,那么使用哈希将有助于您:将第一个数组的所有元素推入哈希。迭代第二个数组并检查每个元素是否存在。如果哈希-->中存在元素,则两个数组都是通用的。这不完全正确。首先,您不必排序两个数组和第二个数组的长度不必相等。@IVlad:好的,进行了调整。