简体   繁体   English

二进制搜索2D数组 - Java

[英]Binary Search 2D array - Java

I am stuck on the following question: 我坚持以下问题:

Given a int two-dimensional matrix mat of size n 2 where n = 2 k , search for an integer k. 给定大小为n 2的int二维矩阵mat ,其中n = 2 k ,搜索整数k。

The matrix's rows and columns are sorted. 矩阵的行和列已排序。

If we split the matrix in quarters, each quarter is also sorted. 如果我们将矩阵分成四分之一,则每个季度也会进行排序。 For example, given this matrix: 例如,给定此矩阵:

-4 -2 5  9
 2  5 12 13
13 20 25 25
22 24 49 57  

If we split it into quarters, we can see that all of the numbers in the first quarter are equal or less than numbers in the second quarter. 如果我们把它分成几个季度,我们可以看到第一季度的所有数字都等于或小于第二季度的数字。

In order to obtain an efficient algorithm, I thought of making a recursive binary search in on the two dimensions but it fails to search for 2 on the previous matrix. 为了获得一个有效的算法,我想在二维上进行递归二进制搜索,但是它无法在前一个矩阵上搜索2

Here's the code: 这是代码:

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

Please advise. 请指教。

Your mistake is at here in your code. 你的错误就在你的代码中。

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

Here in first two functions, You are removing middle column from your search space. 在前两个函数中,您正在从搜索空间中删除middle column You need to include it as element can be present at the middle column . 您需要包含它,因为元素可以出现在middle column Another mistake is in the last call find2(mat,x,midrow+1,hirow,midcol+1,hicol) . 另一个错误是在最后一次调用find2(mat,x,midrow+1,hirow,midcol+1,hicol)

If your search element is smaller than the middle element, You should choose top-left quadrant of the middle element and ignore the bottom-right quadrant. 如果搜索元素小于中间元素,则应选择中间元素top-left象限,并忽略bottom-right象限。 You have mistakenly considered here bottom-right quadrant over top-left quadrant. 您错误地认为这里bottom-right象限过top-left象限。

After making changes accordingly the return function in else looks like: 相应地进行更改之后,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);

This solved the problem and it returns true for -2 . 这解决了问题,它返回-2true

Updated Code: 更新的代码:

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

If your matrix row and column are sorted you can use below code. 如果您的矩阵行和列已排序,您可以使用下面的代码。

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

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM