使用分而治之找到一个数字到矩阵排序

Posted

技术标签:

【中文标题】使用分而治之找到一个数字到矩阵排序【英文标题】:Use Divide and Conquer for find a number into matrix sorted 【发布时间】:2018-04-03 06:59:25 【问题描述】:

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

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
;

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

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

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));
    

我的问题是:是否有其他方法可以遵循分而治之原则,或者我应该更改代码以使其顺利运行? 提前谢谢你。

【问题讨论】:

What is a ***Error?的可能重复 不,我“理解”这个错误,但我不知道这个程序如何正确分而治之。 迭代地使用二分搜索。不需要递归。 @SachinAggarwal 我需要为这个程序使用分而治之,这是一个要求。 您正在递归地使用二进制搜索。但是无论您是递归还是迭代地实现它,二进制搜索都不是分而治之的算法。参考这里-***.com/questions/8850447/… 【参考方案1】:

我认为以下链接分析了您尝试对代码示例和复杂性分析进行的操作:

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

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

【讨论】:

以上是关于使用分而治之找到一个数字到矩阵排序的主要内容,如果未能解决你的问题,请参考以下文章

分而治之——返回数组

使用“分而治之”在 Java 中进行排序

C++ 八大排序之一-----快速排序

使用分而治之的矩阵乘法,时间复杂度

使用分治算法在未排序的数组中查找最大和

矩阵乘法 - 分而治与斯特拉森,分而治之更快?