使用Divide and Conquer查找数字到矩阵排序

时间:2017-10-22 17:48:04

标签: java algorithm divide-and-conquer

我需要实现一个方法/函数来确定矩阵中是否存在数字。给定矩阵按行和列的降序排序。 这里有三个定义矩阵的例子:

private static int[][] matrix1= {

    {69, 57, 43, 28, 14},
    {68, 56, 35, 25, 13},
    {66, 55, 34, 22, 8},
    {64, 52, 32, 21, 7},
    {62, 47, 31, 17, 5}
};

private static int[][] matrix2 = {
    {62, 47, 31, 17, 5}
};

private static int[][] matrix3 = {
    {14},
    {13},
    {9},
    {7},
    {5}
};

该功能应遵循“分而治之”原则。 我的想法是寻找一个作为枢轴的矩阵元素,并从中划分矩阵。如果我们要查找的数字大于数据透视表,我们将保留数据库左侧的列和它自己的列,但是使用数据库的前一行。如果枢轴较大,则相反(下一列和下一列的自身)。另外,为了优化代码,首先我需要在pivot的列中搜索数字,然后继续查看其余列(但我不知道如何实现这个在我的代码中)。

我的代码如下,但是在运行时,这个错误不断弹出java.lang.StackOverflowError.I明白我正在使缓冲区的内存饱和,但我不需要修改它来使函数工作。我想避免它,除非它是唯一的解决方案。

public boolean contains(int[][] matrix, int num) {
    int rowMin = 0;
    int rowMax = matrix.length-1;
    int colMin = 0;
    int colMax = matrix[0].length-1; 
    return containsAux(matrix, rowMin, colMin, rowMax, colMax, num);

}
private boolean containsAux(int[][]matrix, int rowMin, int colMin, int rowMax, int colMax, int num) {
    boolean resul=false;
    int col= (colMax+colMin)/2;
    int row=(rowMax+rowMin)/2;
    int pivote= matrix[row][col];

    if(pivote==num) {
        resul=true;
    }else if(pivote<num && rowMin>=0 && colMin>=0) {
        containsAux(matrix,row-1,col,rowMin,col,num);
        containsAux(matrix,row-1,col-1,rowMin,col-1,num);
        fila-=1;
        containsAux(matrix,row+1,col-1,rowMax,col-1,num);
    }else if (pivote> num && rowMax<matrix.length && rowMax<matrix[0].length) {
        containsAux(matrix,row+1,col,rowMax,col,num);
        rowMin-=1;
        containsAux(matrix,rowMin+1,col+1,row,col+1,num);
        containsAux(matrix,row+1,col+1,rowMax,col+1,num);
    }

    return resul;
}

我的测试代码是:

public class Prueba {

    private static int[][] matrix = {
        {69, 57, 43, 28, 14},
        {68, 56, 35, 25, 13},
        {66, 55, 34, 22, 8},
        {64, 52, 32, 21, 7},
        {62, 47, 31, 17, 5}
    };

    public static void main(String[] args) {
        CartonBingo cb= new CartonBingo();

        System.out.println(cb.contains(matrix, 35));
    }
}

我的问题是:是否有其他方法可以按照“分而治之”原则执行此操作,还是应该更改代码以顺利运行? 提前谢谢。

1 个答案:

答案 0 :(得分:0)

我认为以下链接分析了您尝试使用代码示例和复杂性分析的内容:

http://www.geeksforgeeks.org/divide-conquer-set-6-search-row-wise-column-wise-sorted-2d-array/

无论如何,我认为你的代码中有一些错误,在递归调用中更新参数或类似的东西。程序继续对函数执行相同的调用,直到发生堆栈溢出。