【发布时间】:2021-12-20 00:29:24
【问题描述】:
我遇到了约束必须为 10e9 的问题,但每次我运行代码时,它总是导致内存限制,是否有办法克服这个问题?
这是我的代码
#include <stdio.h>
int main(){
int arr = 10e9;
int data[arr];
int a;
int n,t;
scanf("%d", &n);
for(int i = 0; i < n; i++){
int max = 0;
for(int j = 0; j < arr; j++){
data[j] = 0;
}
scanf("%d",&t);
for(int j = 0; j < t; j++){
scanf("%d", &a);
data[a]++;
if(max < data[a]){
max = data[a];
}
}
int min = arr;
for(int k = 0; k < arr; k++){
if(min > k && data[k] == max){
min = k;
}
}
printf("Case #%d: %d\n%d\n", i+1, max,min);
}
return 0;
}
【问题讨论】:
-
10e9 是一百亿。
int的大小通常为 4 个字节。所以你试图创建一个 400 亿字节的数组。除非您有一台内存为 64GB 的机器,否则这将无法正常工作。如果您确实有 64GB,那么您应该使用malloc(10e9 * sizeof(int))为数组分配内存。 -
...除非您有一台具有 64GB 虚拟内存的机器。假设交换空间可用,64 位操作系统应该可以处理。
-
重新考虑你的算法。显然,您应该跟踪数字序列的最小值和最大值。你确定你需要一个数组吗? (提示:你没有。)大概是为了让你为循环计数器选择合适的数据类型。
-
@user3386109:进程的虚拟内存可能超过计算机的物理内存。虚拟内存不必同时映射到物理内存。它可以根据需要换入和换出。
标签: arrays c memory-limit