C ++:最快的方法来查找另一个数组中一个数组的元素数

时间:2016-12-03 08:50:37

标签: c++ arrays search

我有两个数组,一个是排序数组int b[],另一个是未排序数组int a[n] having n elements。排序数组由未排序数组的部分或全部元素组成。现在有M个查询。对于每个查询,给出 l r 的值。在每个查询中,我需要找到a[n]中存在的b[]元素的数量。

例如 -

N=5 ,M=2
a= [2 5 1 2 3]
b=[3 2 1]
for each m:
l=1 r=5 ->a[1]=1, a[5]=5 -> answer should be 3 as all elements of b i.e 1,2,3 are present in a
l=2 r=4 ->a[2]=5 , a[4]=2 ->answer should be 2 as only 1 and 2 are there in b for given value of l and r for array.

如何找到不超过 O(M * LOGN)时间复杂度的答案?

注意: 数组不是必需的。如果它有助于减少时间复杂度或更容易实现代码,也可以使用Vector。

1 个答案:

答案 0 :(得分:0)

我认为你可以做这样的事情

std::map<int,int> c;
for(int i = 0;i<b.length.i++){
   c[b[i]] = 0;
}
for(int i = l; i<=r; i++){
   int number = a[i];
   c[number]++;
}
//Iterate through c with b index and get all number which different than 0. The left is for you

这样做的目的是创建一个B的地图保持索引。然后在迭代A时你可以增加c值。因此,之后您可以检查C中的每个元素是否具有不同于零的值意味着A具有B的数量。 如果C从零开始并且增加1以获得更好的性能,则可以使用数组而不是映射。如果使用数组,请务必检查[i]是否可以抛出超出范围。