二进制搜索2D数组-Java

二进制搜索2D数组-Java,java,binary-search,Java,Binary Search,我被以下问题困住了: 给定一个大小为n2的整数二维矩阵mat,其中n=2k,搜索整数k 矩阵的行和列被排序 如果我们将矩阵拆分为四分之一,则每个季度也会被排序。例如,给定此矩阵: -4-259 2 5 12 13 13 20 25 25 22 24 49 57 如果我们把它分成四分之一,我们可以看到第一季度的所有数字都等于或小于第二季度的数字 为了得到一个有效的算法,我曾想过在二维上进行递归二进制搜索,但它无法在上一个矩阵上搜索2 代码如下: public static boolean

我被以下问题困住了:

给定一个大小为n2的整数二维矩阵
mat
,其中n=2k,搜索整数k

矩阵的行和列被排序

如果我们将矩阵拆分为四分之一,则每个季度也会被排序。例如,给定此矩阵:

-4-259
2  5 12 13
13 20 25 25
22 24 49 57  
如果我们把它分成四分之一,我们可以看到第一季度的所有数字都等于或小于第二季度的数字

为了得到一个有效的算法,我曾想过在二维上进行递归二进制搜索,但它无法在上一个矩阵上搜索
2

代码如下:

public static boolean find(int[][] mat, int x){
    return find2(mat, x, 0, mat.length-1,0, mat.length-1);
}

private static boolean find2(int[][] mat, int x, int lorow, int hirow,int locol,int hicol){
    if(mat.length==0) return false;
    if(lorow>hirow || locol>hicol) return false;
    int midrow=(lorow+hirow)/2;
    int midcol=(locol+hicol)/2;
    if(mat[midrow][midcol] == x ) return true;
    else if(mat[midrow][midcol] < x) 
        return find2(mat,x,lorow,midrow,midcol+1,hicol) || find2(mat,x,midrow+1,hirow,locol,midcol) || find2(mat,x,midrow+1,hirow,midcol+1,hicol);
    else 
        return find2(mat,x,lorow,midrow,locol,midcol-1) || find2(mat,x,midrow,hirow,locol,midcol-1) || find2(mat,x,midrow+1,hirow,midcol+1,hicol);
}
公共静态布尔查找(int[][]mat,int x){
返回find2(mat,x,0,mat.length-1,0,mat.length-1);
}
私有静态布尔find2(int[][]mat、int x、int lorow、int hirow、int locol、int hicol){
if(mat.length==0)返回false;
如果(lorow>hirow|locol>hicol)返回false;
中行整数=(lorow+hirow)/2;
int midcol=(locol+hicol)/2;
如果(mat[midrow][midcol]==x)返回true;
否则如果(垫[中行][中列]

请告知。

如果您的矩阵行和列已排序,您可以使用以下代码

public int search(int mat[][], int n, int x) {
        int i = 0, j = n - 1;
        while (i < n && j >= 0) {
            if (mat[i][j] == x) {
                System.out.println("Found at" + i + j);
                return 1;
            }
            if (mat[i][j] > x)
                j--;
            else // if mat[i][j] < x
                i++;
        }

        System.out.println("not Found at");
        return 0;
    }
public int search(int mat[][],int n,int x){
int i=0,j=n-1;
而(i=0){
if(mat[i][j]==x){
System.out.println(“位于”+i+j);
返回1;
}
if(mat[i][j]>x)
j--;
else//if mat[i][j]
您的错误就在代码中

else 
    return find2(mat,x,lorow,midrow,locol,midcol-1) || find2(mat,x,midrow,hirow,locol,midcol-1) || find2(mat,x,midrow+1,hirow,midcol+1,hicol);
在前两个函数中,您将从搜索空间中删除
中间列
。您需要将其包括在内,因为元素可以出现在
中间的列中。另一个错误是在最后一次调用中
find2(mat,x,midrow+1,hirow,midcol+1,hicol)

如果搜索元素小于中间元素,则应选择中间元素的左上方
象限,忽略右下方
象限。您在这里错误地将
右下
象限置于
左上
象限之上

进行相应更改后,else中的返回函数如下所示:

return find2(mat,x,lorow,midrow,locol,midcol) || find2(mat,x,lorow,midrow,midcol+1,hicol) ||find2(mat,x,midrow+1,hirow,locol,midcol);
这就解决了问题,并返回
-2
true

更新代码:

private static boolean find2(int[][] mat, int x, int lorow, int hirow,int locol,int hicol){
    if(mat.length==0) return false;
    if(lorow>hirow || locol>hicol) return false;

    if(lorow==hirow && locol==hicol && mat[lorow][locol]!=x)
        return false;

    int midrow=(lorow+hirow)/2;
    int midcol=(locol+hicol)/2;

    if(mat[midrow][midcol] == x ) return true;
    else if(mat[midrow][midcol] < x) 
        return find2(mat,x,lorow,midrow,midcol+1,hicol) || find2(mat,x,midrow+1,hirow,locol,midcol) || find2(mat,x,midrow+1,hirow,midcol+1,hicol);
    else 
        return find2(mat,x,lorow,midrow,locol,midcol) || find2(mat,x,lorow,midrow,midcol+1,hicol) ||find2(mat,x,midrow+1,hirow,locol,midcol);
}
private静态布尔find2(int[][]mat,int x,int loow,int hirow,int locol,int hicol){
if(mat.length==0)返回false;
如果(lorow>hirow|locol>hicol)返回false;
如果(lorow==hirow&&locol==hicol&&mat[lorow][locol]!=x)
返回false;
中行整数=(lorow+hirow)/2;
int midcol=(locol+hicol)/2;
如果(mat[midrow][midcol]==x)返回true;
否则如果(垫[中行][中列]
谢谢您的评论,但您的回答与我的问题无关。你的代码的复杂度是O(n^2)的顺序,这不是很好,我认为它是O(n),对于mn矩阵,它将是O(m+n)。你能解释一下为什么会是O(nn)吗?是的,我很抱歉它是O(n),但我试图在这里得到的答案是O(log(n))@gati sahu你的代码有bug int[]数据={{10,20,30,40},{15,25,35,45},{27,29,37,48},{32,33,39,50} };它将无法找到2,3 Many Thank pal中存在的33,但代码中有一个错误。例如,如果您插入输入,如0或小于矩阵中第一个数字的数字,如-6,则会出现堆栈溢出错误。@Meni,是的,该条件留待检查。您可以添加它以终止递归调用。Related问题(无“按象限排序”约束):