如何使用二维数组的二进制搜索?

时间:2015-07-20 13:18:36

标签: java arrays binary-search

我目前正在学习二元搜索。我一直在关注一本书中的代码示例,但它没有展示如何使用二维搜索和二维数组,只有一维数组。我想学习两种方法来拓宽我对这个主题的了解。

以下是本书中的代码(其中一些代码):

package Test;
import java.util.Scanner;
public class TestMain {
public static void main(String[]args){
    int[]numbers = {1,2,3,4,5};
    int numInput = getNumInput();
    int result = binarySearch(numbers,numInput);
    if(result == -1){
        System.out.print("No Match Found!");
    }else{
        System.out.print("Match Found!");
    }
}

public static int getNumInput(){
    Scanner hold = new Scanner(System.in);
    int num;
    System.out.print("Enter number:");
    num = hold.nextInt();
    return num;
}

public static int binarySearch(int[]numbers,int numInput){
    int first = 0;
    int middle;
    int last = numbers.length - 1;
    int position = -1;
    boolean found = false;
    while(!found && first < numbers.length){
        middle = (first + last) / 2;
        if(numbers[middle]==numInput){
            found = true;
            position = middle;
        }else if(numbers[middle]>numInput){
            last = middle - 1;
        }else{
            first = middle + 1;
        }
    }
    return position;
}
}

这是我的代码试图使用二维数组:

package Practice;
import java.util.Scanner;
public class Practice1Main {

public static void main(String[]args){
    int[][]numbers = {{1,2},{3,4},{5,6}};
    int numInput = getNumInput(numbers);
    int result = binarySearch(numbers,numInput);
    if(result == -1){
        System.out.print("No Match Found!");
    }else{
        System.out.print("Match Found!");
    }

}

public static int getNumInput(int[][]numbers){
    Scanner hold = new Scanner(System.in);
    int num;
    System.out.print("Enter number:");
    num = hold.nextInt();
    return num;
}

public static int binarySearch(int[][]numbers,int numInput){
    int first = 0;
    int middle;
    int last = 2;
    int position = -1;
    boolean found = false;

    while(!found && first < numbers.length){
        middle = (first + last) / 2;
        if(numbers[middle][first]==numInput){
            found = true;
            position = middle;
        }else if(numbers[middle][first]>numInput){
            last = middle - 1;
        }else{
            first = middle + 1;
        }
    }
    return position;
}
}

输出能够从1到3进行搜索。但是,当您输入4以后,它会给我ArrayIndexOutOfBoundsException错误。

虽然我很清楚书中的二进制搜索流程,但我仍然无法使用二维数组来计算算法。

2 个答案:

答案 0 :(得分:0)

(首先,我认为你选择了一个相当“无趣”的问题来解决。)

那么如何从1-D推广到2-D(或n-D)呢?以下是一些想法。

1)假设我们有一个int[][]类型的二维矩形数组。 (精神上)将这个数组映射到一维坐标系上是一件简单的事情;例如

  • [0,0] - &gt; [0]
  • [0,1] - &gt; [1]
  • ...
  • [0,N-1] - &gt; [N - 1]
  • [1,0] - &gt; [N]
  • [1,1] - &gt; [N + 1]
  • ...
  • [M-1,N-1] - > [N x M - 1]

当然坐标映射也是另一种方式。因此......解决二维二分搜索的一种方法是根据一维数组计算索引并转换为二维坐标以进行数组查找。

2)2-D阵列实际上是1-D阵列的1-D阵列。因此,解决方案的第二种方法是首先执行1-D二进制搜索以找到包含您要查找的数字的数组,然后在找到的数组中执行第二次1-D搜索。请注意,您只需查看每个1-D子阵列的第一个元素即可进行初始1-D搜索。

答案 1 :(得分:-1)

任何计算机科学问题的一个重要部分是能够将整体问题分解为您知道如何解决的较小部分。对于这个问题,你问的是如何在二维数组上进行二进制搜索,但是你只知道如何在一维数组上进行二进制搜索。因此,您应该分两步考虑这个问题 - 找到一种方法将二维数组转换为一维数组,然后对该转换后的数组进行二进制搜索。

你提到知道如何在一维数组上进行二进制搜索,所以我将跳过这一步。让我们来看一下转换方法:

看起来你正在使用Java,我不会惊讶地发现Java有一个内置函数可以为你完成所有工作。但是,我们可以说它没有。我们知道你的数字[] []数组是一个3×2矩阵。这意味着矩阵中有6个元素。因此,我们的一维数组将有6个项目。

int[] new_array = new int[6];

然后,我们可以对所有初始数组的项进行for循环,并用它们填充new_array。

int counter = 0;
for(int j = 0; j < 3; j++)
{
   for(int i = 0; i < 2; i++)
   {
      new_array[counter] = numbers[j][i];
      counter++;
   }
}

现在你有了一维数组。从这里进行二进制搜索以获得最终答案。