【发布时间】:2015-07-15 10:33:33
【问题描述】:
问题是: 你得到一个大小为 N 的数组。还给出 q=查询次数;在查询中,您将得到 l= 下限,u= 上限和 num= 您必须将频率计入的数量l~u。
我在 C++ 中实现了如下代码:
#include <iostream>
#include <map>
using namespace std;
map<int,int>m;
void mapnumbers(int arr[], int l, int u)
{
for(int i=l; i<u; i++)
{
int num=arr[i];
m[num]++;
}
}
int main()
{
int n; //Size of array
cin>>n;
int arr[n];
for(int i=0; i<n; i++)
cin>>arr[i];
int q; //Number of queries
cin>>q;
while(q--)
{
int l,u,num; //l=lower range, u=upper range, num=the number of which we will count frequency
cin>>l>>u>>num;
mapnumbers(arr,l,u);
cout<<m[num]<<endl;
}
return 0;
}
但我的代码有一个问题,在每个查询中它不会使地图 m 为空。这就是为什么如果我两次/三次查询相同的数字,它会将频率计数与之前存储的计数相加。
我该如何解决这个问题? 对于 10^5 的大范围查询,它会是一个糟糕的程序吗? 什么是解决这个问题的有效方法?
【问题讨论】:
-
不使用全局变量?
-
是的,对于大量查询,它的性能会很差,因为 atm 您正在为每个查询遍历数组,而在极端情况下,只遍历数组一次就足够了。
-
如何通过只遍历数组一次来解决这个问题? @tobi303
-
有可能,但不太实用。您可以创建一个
[maxElement][size][size]大小的结构,在其中为每个数字(第一个索引)存储下限(第二个索引)和上限(最后一个索引)之间的出现次数。这会浪费大量内存并且构建这个结构需要一些时间,但是一旦你有了它,它只是访问元素的问题。这只是交易内存与计算的极端情况。最佳算法将介于这和你的之间。很大程度上取决于细节、数组的大小、查询的数量等 -
有没有什么方法可以通过只遍历数组一次来计算频率,并使用诸如累积和之类的任何方法计算每个查询?
标签: c++ arrays frequency cumulative-frequency