使用二进制搜索在已排序的多维数组中查找数字

时间:2013-12-19 16:19:17

标签: java algorithm binary-search

我们得到了一个增加排序的多维数组,例如:

int[][] mat = {{1,2,3,4},
{5,6,7,8},
{9,10,11,12},
{13,14,15,16}};

如何使用二进制搜索查找特定号码?让我说我正在寻找3。

10 个答案:

答案 0 :(得分:5)

您可以通过将一维索引转换为二维索引来实现此目的。例如,索引0映射到0, 0,但索引4将映射到1, 0,索引15将映射到3, 3。< / p>

通过这种方式,您可以使用标准的二进制搜索算法,当您需要在该特定索引处查找值时,您所要做的就是调用转换函数。

将一维索引转换为二维对应的公式为:

row = floor(index / columns);
column = index % columns;

这假定每个数组都已排序,并且在展平时,结果数组也会被排序。

答案 1 :(得分:2)

如果对多维数组进行排序,则可以将二进制搜索算法分为两部分。首先,您将执行二进制搜索以查找包含您要查找的数字的多维搜索中的数组。然后,在该阵列中执行搜索。

希望有所帮助。

答案 2 :(得分:1)

您可以对每个子阵列使用Arrays.binarySearch()

private static int[] binarySearch2d(int[][] arr, int toFind) {
    int[] index2d = new int[] { -1, -1 };

    // find the row
    int row = -1;
    for (int i = 0; i < arr.length; i++) {
        if (arr[i][0] > toFind) {
            break;
        }
        row = i;
    }

    if (row > -1) {
        int indexInSecond = Arrays.binarySearch(arr[row], toFind);
        if (indexInSecond > -1) {
            index2d[0] = row;
            index2d[1] = indexInSecond;
        }
    }
    return index2d;
}

private static void test() {
    int[][] mat = { { 1, 2, 3, 4 }, { 5, 6, 7, 8 }, { 9, 10, 11, 12 },
            { 13, 14, 15, 16 } };

    int[] found = binarySearch2d(mat, 12);
    int element = mat[found[0]][found[1]];
    System.out.println("Found: " + element + " at mat[" + found[0] + "]["
            + found[1] + "]");
}

将输出

Found: 12 at mat[2][3]

答案 3 :(得分:1)

2-d数组可以按照以下方式用作1-d数组,使用以下索引公式: -

假设您需要在1-d数组中找到第k个索引,然后它是i= k/nj = k%n的元素,其中n是2-d数组中矩阵的顺序。使用二进制搜索,如1-d数组,结尾索引为n * n-1。

替代方法: -

1&GT;对arr[i][0]

的每个1-D数组的第一个元素进行二进制搜索

2&GT;然后使用上面的方法获取包含元素的1-D数组,然后在arr[k]上进行二元搜索。

答案 4 :(得分:0)

您可以创建一维array并使用binary搜索。

    int[] arr = new int[]{1, 5, 6};// your converted array
    int index = Arrays.binarySearch(arr, 1);
    if (index >= 0) {
        System.out.println("found ");
    } else {
        System.out.println("not found");
    }

答案 5 :(得分:0)

您可以使用每个数组(或最后一个)的第一个数字来查找您的数字可能存在的元素,然后对该元素使用二进制搜索来查找它是否实际存在。

答案 6 :(得分:0)

public boolean Find(int[][] array, int number) { 
    int find = -1;
    for(int i = 0; i < N; i++) {
        find = binarySearch(array[i], number, 0, N);
        if(find != -1) { 
           return true; //the element is exist
        }
     }
     return false;//the element is not exist
}

或者您可以修改this question它会对您有所帮助

答案 7 :(得分:0)

你可以只使用每个内部数组的第一个元素进行二进制搜索,找到它所在的行。然后在该行内进行二进制搜索以找到该列。

如果您的矩阵支持重复,则可能需要更多逻辑。

答案 8 :(得分:0)

使用java.util.Arrays。在展平矩阵上使用Arrays.binarySearch()函数:

int[][] mat = {{1,2,3,4},
{5,6,7,8},
{9,10,11,12},
{13,14,15,16}};


int key = 3;
int[] oneDArray = new int[mat[0].length*mat[0].length];

int s = 0;
for(int i = 0; i < mat[0].length; i ++) 
    for(int j = 0; j < mat[0].length; j ++){                           
        oneDArray[s] = mat[i][j];
        s++;
    } 


int found = Arrays.binarySearch(oneDArray, key);
if(found > -1){
     System.out.println(found/ mat[0].length + "," + found % mat[0].length);    
}

演示:https://ideone.com/bFZVMs

答案 9 :(得分:0)

在二维数组中定义'order'有不同的方法。对于示例中的顺序,在每行的第一个元素上进行bin搜索,找到该行,然后在该行内再次进行bin搜索。如果行数>> =比列数,您可以优化对角的元素进行二进制搜索,从(0,0)开始,然后对该行的其余部分进行另一次二进制搜索。