如何通过检查局部最大值是否通过检查周围的所有数字是否小于它来遍历2D数组? [关闭]

问题描述 投票:-1回答:2

如何通过检查局部最大值是否通过检查周围的所有数字是否小于它来遍历2D数组?我真的很困惑我将如何在代码中执行此操作。我需要得到这个位置,我只需要局部最大值,而不是绝对最大值。

void reportMaxima(int rows, int cols, int grid[ rows ][ cols ])
{

}
c multidimensional-array
2个回答
2
投票

这应该工作:

#include <stdbool.h>
#include <string.h>

void report_maxima(int rows, int cols, int arr_in[rows][cols],
                    bool arr_out[rows][cols])
{
    int i, j;
    int k, l;

    memset(arr_out, 0, rows * cols * sizeof(arr_out[0][0]));
//  memset(arr_out, 0, sizeof(arr_out));  I think this doesn't work :(

    for (i = 0; i < rows; i++) {
        for (j = 0; j < cols; j++) {
            for (k = i - 1; k <= (i + 1); k++) {
                if (k < 0)
                    continue;
                if (k >= rows)
                    break;

                for (l = j - 1; l <= (j + 1); l++) {
                    if (l < 0)
                        continue;
                    if (l >= cols)
                        break;

                    if (arr_in[i][j] < arr_in[k][l])
                        goto not_maxima;
                }
            }

            arr_out[i][j]   = true;
            continue;

not_maxima:
        }
    }
}

首先,您需要一个bool数组,用于存储输出信息:点是否为最大值(true)或不是(false)。

您需要将该数组初始化为0false),然后将其存储到true。最好的方法是使用memset()

然后,您显然需要迭代输入数组。 (ij这样做)

对于输入数组的每个点,检查所有邻居。 (kl这样做)。您需要确保您尝试访问的邻居位于数组边界内(if - continueif - break这样做)。

然后,检查所有这些邻居是否小于您所在的点。您发现的第一个邻居大于您的观点会告诉您,您不在本地最大值,您应该跳到下一个点。如果在检查了所有邻居后你没有找到任何大于你的点的邻居,那么你处于局部最大值。 (或至少在拐点处)。

最后一件事很重要:如果你想确定,你应该添加大量的检查,这会大大减慢算法的速度。这取决于您的需求。

编辑:

修正了使用sizeof()错误输入时的错误。


0
投票

只需使用2 for循环运行抛出数组中的所有单元格

 int i,j;
 for(i = 0; i < rows; i++)   {
  for(j = 0; j < cols; j++)   {
   if(check(i,j,rows,cols,grid))   {
    //do something.
   }
   else  {
    //do something else.
   }
  }
 }

然后在代码中,您可以检查它周围的所有数字。这项任务的关键是不要懒惰,只需检查它周围的每个单元格。确保不要尝试访问不属于阵列的内存。

[i-1] [j-1],[i-1] [j],[i-1] [j + 1]

[i] [j-1],单元格,[i] [j + 1]

[i + 1] [j-1],[i + 1] [j],[i + 1] [j + 1]

因此,您需要验证+ 1是否小于行和列(分别),并且-1更大 - 等于0.之后检查相关单元格是否小于其旁边的特定单元格,如果所以回归假。在函数结束时,如果没有近单元格更大则返回true。

bool check(int i, int j, int rows, int cols,int grid[rows][cols]) {
 if((i - 1 >= 0) && (j - 1 >= 0) && (grid[i-1][j-1]) > (grid[i][j]))
  return false;
 if((i - 1 >= 0) && (grid[i-1][j] > grid[i][j]))
  return false; 
 //etc...
 return true;
}

有更多美学方法可以做到这一点,但是当你开始编写代码时,可读性应该是最重要的。如果你使用辅助函数,记得在使用之前声明它,祝你好运!

© www.soinside.com 2019 - 2024. All rights reserved.