簡體   English   中英

為什么這個程序占用太多內存?

[英]Why does this program take too much memory?

我正在解決高中編程比賽中的一項任務。 這是一個簡短的描述:

我們有一個高度為 h 和寬度為 w 的網格。 網格填充有字符“#”和“.”。 Octothorps代表土地,圓點代表水。 保證網格的第一行和最后一行都是點。 連接起來的章魚形成可以有湖泊的島嶼,每個湖泊也可以有島嶼,這些島嶼可以有湖泊等等......每個島嶼都有一個度數,該度數定義為到達它必須穿過的湖泊數量如果從網格邊緣的水開始(此水被視為大海,不包括在到達島嶼所需的湖泊數量之外)。 找出島嶼之間的最大度數。

我在學校服務器上運行我的程序,但我收到了超出內存限制的錯誤,因為據稱該程序占用了超過 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, y, 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 y, int d)
{
    visited[x][y] = true;
    
    if(degree[x][y] == -1)
        searchSame(x,y,d);

    if(x + 1 < h && a[x + 1][y] == a[x][y] && !visited[x + 1][y])
        search(x + 1, y, d);
    else if(x + 1 < h && !visited[x + 1][y])
        search(x + 1, y, degree[x][y] + 1);

    if(x - 1 >= 0 && a[x - 1][y] == a[x][y] && !visited[x - 1][y])
        search(x - 1, y, d);
    else if(x - 1 >= 0 && !visited[x - 1][y])
        search(x - 1, y, degree[x][y] + 1);

    if(y + 1 < w && a[x][y + 1] == a[x][y] && !visited[x][y + 1])
        search(x, y + 1, d);
    else if(y + 1 < w && !visited[x][y + 1])
        search(x, y + 1, degree[x][y] + 1);

    if(y - 1 >= 0 && a[x][y - 1] == a[x][y] && !visited[x][y - 1])
        search(x, y - 1, d);
    else if(y - 1 >= 0 && !visited[x][y - 1])
        search(x, y - 1, 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,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
為另外兩個添加空間,您就會明白為什么程序需要那么多空間。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM