【问题标题】:C++ : Fastest Way to find number of elements of one array in another arrayC ++:在另一个数组中查找一个数组的元素数量的最快方法
【发布时间】:2016-12-03 08:50:36
【问题描述】:

我有两个数组,一个排序数组 int b[] 和另一个未排序数组 int a[n] having n elements 。排序数组由未排序数组的部分或全部元素组成。现在有 M 个查询。对于每个查询值 lr 给出。在每个查询中,我需要找到 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)时间复杂度的答案?

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

【问题讨论】:

  • 这听起来很像家庭作业。正确的?不幸的是,SO 不是代码编写服务。到目前为止,您尝试了什么?您的代码面临的实际问题是什么?
  • @skypjack 对不起,但这不是作业。这是使用 DP 解决的问题的一部分。现在要计算最终答案,我需要按照问题中的要求进行计算。好吧,我尝试使用嵌套的 for 循环,但时间限制超过了。
  • 不能从头顶想出太多..但是..数组的元素是唯一的吗?您可以弹出找到的数组成员,避免以后对其进行迭代,并且内部循环应该在排序数组上以利用分支预测?
  • @Swift 未排序数组中的元素不一定是唯一的。

标签: c++ arrays search


【解决方案1】:

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

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 以获得更好的性能,您可以使用数组而不是映射。如果使用数组,请确保检查 a[i] 是否可以抛出越界异常。

【讨论】:

  • 能否请您包含答案循环?而对于 M 个查询,这将给出 O(M N) 的时间复杂度。我需要降低这个时间复杂度。
  • 如果你真的想要那么快。只需创建一个矩阵[x][y],其中 x 等于左,y 等于右。将所有结果解析到矩阵中,然后只需返回矩阵[l][r],您就可以为 M 个查询获得 O(1)。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-05-07
  • 2013-12-26
  • 1970-01-01
  • 1970-01-01
  • 2016-09-23
  • 2011-02-27
相关资源
最近更新 更多