我的程序的记忆应该是< 4-16 MB。我该如何优化它?我将简要解释一下我的程序的作用:
我在向量a中输入n,k和n数字。然后我在向量b中存储在向量a中找到的所有相等数的计数。因此,例如,如果向量a包含1,2,2,3,则向量B将存储如下计数:
1 -> 1
2 -> 2
3 -> 1
然后我检查这些计数是否可被k整除,如果没有,我输出该数字并打破循环。我知道有些东西可以优化,但我该如何处理内存问题?这是下面的代码:
#include<iostream>
#include<vector>
using namespace std;
vector<int> a,b[1000001];
int main()
{
int n,k;
cin>>n>>k;
for(int i=0; i<n; i++)
{
int k;
cin>>k;
a.push_back(k);
b[a[i]].push_back(1);
}
for(int i=n-1; i>=0; i--)
{
if(b[a[i]].size() % k != 0)
{
cout<<a[i]<<"\n";
break;
}
}
return 0;
}
答案 0 :(得分:2)
不要使用b
的向量,请使用std::map
。你根本不需要a
,只需阅读输入,找到b
中的相应项并增加它
编辑:
首先,您不需要a
,因为您可以在阅读时“动态”分析输入数字。
因此,任务归结为计算数字和存储结果。您需要存储一组对,其中一对是数字i
以及它在输入中出现的次数。
您使用了一个数组。数组的问题在于它具有预定义的大小。你为什么用1000001
?尝试输入大于1000001
的数字,看看会发生什么?此外,1000001
向量数组使用了大量内存,而大部分内容都被浪费,因为1,2,2,3
的测试输入只会使用1000001个项目中的3个。
map
在这里要好得多,因为它允许您将您的号码与其计数(发生的次数)相关联。所以map
只包含3项测试输入项。 map
看起来像是:
[key1, value1]
[key2, value2]
...
在您的情况下,key
将是数字,value
- 他们的数量。
要计算数字,您不需要为向量中的每个匹配项存储1
,因为它的内存效率非常低(很多1
s)。您应该将它们计为c = c + 1
或++c
。
答案 1 :(得分:0)
此行vector<int> a, b[1000001]
相当于:
vector<int> a
vector<int> b[1000001];
b
的第二个数组vector<int>
正在使用大量内存。
此行[{1}},您继续将b[a[i]].push_back(1)
追加到向量b,这会不断增加它的大小。
您需要的是:
1
您阅读了有关矢量和地图的更多信息