如何在C中找到最大数为1的区域?

时间:2015-05-05 08:14:18

标签: c arrays matrix 2d traversal

我有一个500x500的二维矩阵,其中包含0或1的值。是否有任何方法可以找出包含值1的高度集中的区域,或者说最大值为1的区域#s尝试遍历整个区域2D矩阵具有较小的(50x50大小的阵列),但需要很长时间。是否有其他方法更有效,并且执行时间更短。我必须在C编程中执行此操作。

2 个答案:

答案 0 :(得分:0)

为了提高效率,您可以使用并行技术。您可以使用它,例如CUDA。

使用特定的邻居算法并计算最密集的空间也是个好主意。

答案 1 :(得分:0)

在评论中,您声明您确实想要找到具有大多数子阵列的50×50子阵列。一个简单的实现可能是迭代数组,然后遍历每个子数组以找到最大总和:

void subarray(char array[500][500], int *x, int *y, int *pmax)
{
    int i, j, k, l;
    int max = -1;

    for (i = 0; i < 450; i++) {
        for (j = 0; j < 450; j++) {
            int n = 0;

            for (k = 0; k < 50; k++) {
                for (l = 0; l < 50; l++) {
                    n += array[i + k][j + l];
                }
            }

            if (n > max) {
                max = n;
                *x = i;
                *y = j;
                *pmax = max;
            }
        }
    }
}

这需要很长时间,因为你有四个嵌套循环。更好的方法可能是引入一个辅助数组,该数组存储数组中每个条目的当前点数,包括当前数。这些信息可以从相邻元素中逐步收集。

如果您想计算左上角为(x0, y0)且右下角为(x1, y1)的矩形中的数量,您会得到:

n = count[y1][yy1] + count[y0][x0] - count[y0][x1] - count[y1][x0]

所以:

void subarraye(char array[500][500], int *x, int *y, int *pmax)
{
    int count[500][500];
    int i, j;
    int max = -1;

    count[0][0] = array[0][0];

    for (i = 1; i < 450; i++) {
        count[i][0] = count[i - 1][0] + array[i][0];
    }

    for (i = 1; i < 450; i++) {
        count[0][i] = count[0][i - 1] + array[0][i];
    }

    for (i = 1; i < 500; i++) {
        for (j = 1; j < 500; j++) {
            count[i][j] = count[i - 1][j] + count[i][j - 1]
                        - count[i - 1][j - 1] + array[i][j];
        }
    }       

    for (i = 0; i < 450; i++) {
        for (j = 0; j < 450; j++) {
            int n = count[i + 50][j + 50] + count[i][j]
                  - count[i][j + 50] - count[i + 50][j];

            if (n > max) {
                max = n;
                *x = i + 1;
                *y = j + 1;
                *pmax = n;
            }
        }
    }
}

索引偏离1,因为直到独占边界(x, y)的1的数量存储在(x - 1, y - 1)中,并且省略了零区域矩形的左上角和左行。