从矩阵中找到所有局部最大值

时间:2011-08-22 07:31:55

标签: java arrays algorithm multidimensional-array

请用Java编写一个方法,它将接收矩阵(int [] []矩阵)作为输入,并且应该从矩阵中找到所有局部最大值。局部最大值是矩阵中的这个数字,它大于其所有直接邻居。该方法应返回找到的所有本地最大数字的位置列表。

我试过这个代码来做这个但不知道这个想法是否正确代码

private static List<Integer> findLocal(int[][] matrix) 
{

    List<Integer> locals = new ArrayList<Integer>();

    for (int i = 0; i < matrix.length; i++) {
        for (int j = 0; j < matrix[0].length; j++) {

            if (i < matrix.length - 1 && j < matrix[0].length - 1) {
                if (matrix[i][j] < matrix[i + 1][j] && matrix[i][j] < matrix[i][j + 1] && matrix[i][j] < matrix[i + 1][j + 1]) {
                    locals.add(i + j);
                } else {

                }

            }
        }

    }

    return locals;
}

4 个答案:

答案 0 :(得分:2)

好的,现在看来你已经有了一个想法,这基本上是一个有用的想法。

它只有一个缺陷:你所看到的neigborhood是错误的:对于一个点(i,j),(von Neumann)邻居是(i + 1,j),(i,j + 1),( i-1,j)和(i,j-1)。

所以,当你检查这一点时,它应该在一般工作,但是:你必须特别注意边界。由于你没有第-1列,没有第n + 1列/行,当你在那里时,不考虑那个邻居点。你如何处理它,取决于你想如何对待它:如果邻域环绕,边界是否有一个常数值,它应该被视为-infty吗?

答案 1 :(得分:2)

你写

if (matrix[i][j] < matrix[i + 1][j] 
    && matrix[i][j] < matrix[i][j + 1] 
    && matrix[i][j] < matrix[i + 1][j + 1]) {

检查元素是否小于其三个邻居。其他五个邻居怎么样?我们也检查一下:

if (matrix[i][j] < matrix[i + 1][j] 
    && matrix[i][j] < matrix[i+1][j-1] 
    && matrix[i][j] < matrix[i+1][j+1] 
    && matrix[i][j] < matrix[i][j + 1] 
    && matrix[i][j] < matrix[i][j - 1] 
    && matrix[i][j] < matrix[i-1][j-1]) 
    && matrix[i][j] < matrix[i-1][j]) 
    && matrix[i][j] < matrix[i-1][j+1]) {

这假设您要检查元素的8个直接邻居,即直线和对角线。如果这不是您想要的,请调整。

还要求找到局部最大值。这标识了本地最小值。将<更改为>

另一件事是locals.add(i + j)没有做你认为它做的事情。如果元素(i = 3,j = 4)是局部最大值,那么你就说locals.add(7),这显然不是你想要的。

答案 2 :(得分:1)

  

我认为不需要对每个矩阵进行8​​次比较   元件。你应该采取两个额外的阵列:

  1. MATRIX[n+2][n+2]:它将包含一个额外的输入矩阵 所有INT_MIN的层(因此,每个矩阵元素都有8个 邻居)。

  2. Mark[n+2][n+2] = {0}(您只需要访问中的元素 未标记的输入矩阵)如果是矩阵元素 声明为局部最小值,你应该标记它的所有邻居 Mark [] [] vector。

  3.   

    通过这样做,复杂性将保持为O(n ^ 2)但不是。比较会   最小化。

答案 3 :(得分:0)

您必须分别存储i和j才能正确记住元素的位置。因此,

List<Integer> locals = new ArrayList<Integer>();

不起作用。 你可以用

 List<Integer[]> locals = new ArrayList<Integer[]>();

代替。要添加新找到的本地最大值的位置,请使用

 Integer[] localMax = {i, j};
 locals.add(localMax);