簡體   English   中英

如何對二維數組使用二進制搜索?

[英]How to use a binary search with a two-dimensional array?

我目前正在學習二進制搜索。 我一直在遵循一本書中的代碼示例,但是它沒有顯示如何對二維數組(僅對一維數組)使用二進制搜索。 我想學習兩種方法以擴大我對該主題的了解。

這是本書中寫的代碼(其中一些):

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錯誤。

盡管我從書中非常了解二進制搜索的流程,但是我仍然無法弄清楚使用二維數組的算法。

(首先,我認為您選擇了一個相當“有趣”的問題來解決。)

那么如何從一維到二維(或nD)一概而論呢? 這里有一些想法。

1)假設我們有一個類型為int[][]的二維矩形數組。 將這個數組(心理上)映射到一維坐標系很簡單。 例如

  • [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)2維數組實際上是1維數組的1維數組。 因此,解決方案的第二種方法是首先執行一維二進制搜索以找到包含您要查找的編號的數組,然后在找到的數組中執行第二次一維搜索。 請注意,您可以通過僅查看每個一維子數組的第一個元素來進行初始一維搜索。

任何計算機科學問題的很大一部分就是能夠將整個問題分解為您知道如何解決的較小部分。 對於這個問題,您正在詢問如何在二維數組上執行二進制搜索,但是您只知道如何在一維數組上執行二進制搜索。 因此,您應該分兩個步驟考慮這個問題:找到一種方法將二維數組轉換為一維數組,然后對轉換后的數組進行二進制搜索。

您提到了知道如何在一維數組上執行二進制搜索的步驟,所以我將跳過這一步。 讓我們來看一種轉換方法:

看起來您正在使用Java,而看到Java具有為您完成所有操作的內置函數,我不會感到驚訝。 可以說不是。 我們知道您的number [] []數組是3 X 2的矩陣。 這意味着矩陣中有6個元素。 因此,我們的一維數組將包含6個項目。

int[] new_array = new int[6];

然后,我們可以遍歷所有初始數組的項目,並使用它們填充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++;
   }
}

現在您有了一個一維數組。 從此處進行二進制搜索以獲取最終答案。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM