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