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

Java 如何使用二维数组的二进制搜索?,java,arrays,binary-search,Java,Arrays,Binary Search,我目前正在学习二进制搜索。我一直在遵循一本书中的代码示例,但它没有显示如何对二维数组使用二进制搜索,而只对一维数组使用二进制搜索。我想学习这两种方法来拓宽我在这个话题上的知识面 以下是本书中编写的代码(部分代码): 封装测试; 导入java.util.Scanner; 公共类TestMain{ 公共静态void main(字符串[]args){ int[]数={1,2,3,4,5}; int numInput=getNumInput(); int result=binarySearch(数字,n

我目前正在学习二进制搜索。我一直在遵循一本书中的代码示例,但它没有显示如何对二维数组使用二进制搜索,而只对一维数组使用二进制搜索。我想学习这两种方法来拓宽我在这个话题上的知识面

以下是本书中编写的代码(部分代码):

封装测试;
导入java.util.Scanner;
公共类TestMain{
公共静态void main(字符串[]args){
int[]数={1,2,3,4,5};
int numInput=getNumInput();
int result=binarySearch(数字,numInput);
如果(结果==-1){
System.out.print(“未找到匹配项!”);
}否则{
System.out.print(“找到匹配项!”);
}
}
公共静态int getNumInput(){
扫描仪保持=新扫描仪(System.in);
int-num;
系统输出打印(“输入编号:”);
num=hold.nextInt();
返回num;
}
公共静态int二进制搜索(int[]数字,int numInput){
int first=0;
中间;
int last=numbers.length-1;
int位置=-1;
布尔值=false;
而(!found&&firstnumInput){
最后=中间-1;
}否则{
第一个=中间+1;
}
}
返回位置;
}
}
下面是我尝试使用二维数组的代码:

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;
}
}
包装实践;
导入java.util.Scanner;
公共课实习1主要{
公共静态void main(字符串[]args){
int[][]数={{1,2},{3,4},{5,6};
int numInput=getNumInput(数字);
int result=binarySearch(数字,numInput);
如果(结果==-1){
System.out.print(“未找到匹配项!”);
}否则{
System.out.print(“找到匹配项!”);
}
}
公共静态int getNumInput(int[][]个数字){
扫描仪保持=新扫描仪(System.in);
int-num;
系统输出打印(“输入编号:”);
num=hold.nextInt();
返回num;
}
公共静态int二进制搜索(int[][]数字,int numInput){
int first=0;
中间;
int last=2;
int位置=-1;
布尔值=false;
而(!found&&firstnumInput){
最后=中间-1;
}否则{
第一个=中间+1;
}
}
返回位置;
}
}
输出可以从1搜索到3。但是,当您输入4之后,它将给我一个
ArrayIndexOutOfBoundsException
错误

虽然我对书中的二进制搜索流程非常了解,但我仍然无法理解使用二维数组的算法。

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

那么,如何从一维推广到二维(或n-D)?这里有几个想法

1) 假设我们有一个类型为
int[][]
的二维矩形数组。将这个数组映射到一维坐标系是一件简单的事情;e、 g

  • [0,0]->[0]
  • [0,1]->[1]
  • [0,N-1]->[N-1]
  • [1,0]->[N]
  • [1,1]->[N+1]
  • [M-1,N-1]->[N x M-1]
当然,坐标映射也是另一种方式。所以解决二维二进制搜索的一种方法是根据一维数组计算索引,并将其转换为二维坐标以进行数组查找


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

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

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

看起来您正在使用Java,看到Java有一个内置函数可以为您完成所有工作,我不会感到惊讶。但是,我们可以说,事实并非如此。我们知道您的数字[]阵列是一个3 X 2矩阵。这意味着矩阵中有6个元素。因此,我们的一维数组将有6项

int[] new_array = new int[6];
然后,我们可以对所有初始数组的项执行for循环,并用它们填充新的_数组

int counter = 0;
for(int j = 0; j < 3; j++)
{
   for(int i = 0; i < 2; i++)
   {
      new_array[counter] = numbers[j][i];
      counter++;
   }
}
int计数器=0;
对于(int j=0;j<3;j++)
{
对于(int i=0;i<2;i++)
{
新_数组[计数器]=数字[j][i];
计数器++;
}
}
现在你有了一个一维数组。从这里进行二进制搜索以获得最终答案

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