如何解决为什么该程序占用太多内存?
我正在解决高中编程竞赛中的一项任务。这是简短说明:
我们有一个高度为h且宽度为w的网格。网格中填充了字符“#”和“。”。章鱼代表陆地,点代表水。保证网格的第一行和最后一行都是一整点。相连的八足兽形成了可以有湖泊的岛屿,每个湖泊也可以都有岛屿,而这些岛屿也可以有湖泊,依此类推...每个岛屿的程度都定义为到达湖泊必须穿越的湖泊数量如果是从网格边缘的水开始的(这种水被视为海洋,不包括在您要穿过的到达湖泊的湖泊中)。找到岛屿之间的最大程度。
我正在学校服务器上运行程序,并且遇到内存限制超出错误的消息,因为据称该程序占用了300 MiB以上的内存。这是程序:
#include <stdio.h>
char a[3010][3010];
int degree[3010][3010];
bool visited[3010][3010];
int h,w;
void searchSame(int x,int y,int d)
{
degree[x][y] = d;
if(x + 1 < h && a[x + 1][y] == a[x][y] && degree[x + 1][y] == -1)
searchSame(x + 1,y,d);
if(x - 1 >= 0 && a[x - 1][y] == a[x][y] && degree[x - 1][y] == -1)
searchSame(x - 1,d);
if(y + 1 < w && a[x][y + 1] == a[x][y] && degree[x][y + 1] == -1)
searchSame(x,y + 1,d);
if(y - 1 >= 0 && a[x][y - 1] == a[x][y] && degree[x][y - 1] == -1)
searchSame(x,y - 1,d);
}
void search(int x,int d)
{
visited[x][y] = true;
if(degree[x][y] == -1)
searchSame(x,d);
if(x + 1 < h && a[x + 1][y] == a[x][y] && !visited[x + 1][y])
search(x + 1,d);
else if(x + 1 < h && !visited[x + 1][y])
search(x + 1,degree[x][y] + 1);
if(x - 1 >= 0 && a[x - 1][y] == a[x][y] && !visited[x - 1][y])
search(x - 1,d);
else if(x - 1 >= 0 && !visited[x - 1][y])
search(x - 1,degree[x][y] + 1);
if(y + 1 < w && a[x][y + 1] == a[x][y] && !visited[x][y + 1])
search(x,d);
else if(y + 1 < w && !visited[x][y + 1])
search(x,degree[x][y] + 1);
if(y - 1 >= 0 && a[x][y - 1] == a[x][y] && !visited[x][y - 1])
search(x,d);
else if(y - 1 >= 0 && !visited[x][y - 1])
search(x,degree[x][y] + 1);
}
int main()
{
int mx = 0;
scanf("%d %d",&h,&w);
for(int i = 0; i < h; i++)
scanf("%s",a[i]);
for(int i = 0; i < h; i++)
{
for(int j = 0; j < w ; j++)
degree[i][j] = -1;
}
search(0,1);
for(int i = 0; i < h; i++)
{
for(int j = 0; j < w ; j++)
{
if(degree[i][j] > mx)
mx = degree[i][j];
}
}
printf("%d",mx/2 - 1);
}
h和w的值在3到3000之间。为什么此程序占用这么多内存?它可能与递归函数有关吗?如何改善内存管理?
解决方法
int degree[3010][3010];
保留3010 * 3010 int
s的空间,即超过900万。如果您使用的是32位系统,则仅此阵列就需要906万次乘以4字节= 36.2 MB。在64位系统(今天为标准)上,它需要 72.5 MB 。
添加另外两个的空间,您将看到为什么程序需要那么多空间。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。