【问题标题】:Binary Search gives Index Out of Bound Exception in Java二进制搜索在 Java 中给出索引越界异常
【发布时间】:2015-06-02 01:10:03
【问题描述】:

我正在尝试使用 java 编程语言实现二进制搜索。 很明显,应该对数组进行排序以使用二进制搜索,因为它使用分而治之的概念。当元素在数组中和不在数组中时,代码在这两种情况下都可以正常工作。但是,当我输入的数字大于数组中的最大数字时,程序会崩溃并给出 Index Out Of Bound Exception。

public class Binary {

public static void search(int arr[]) {
    Scanner in = new Scanner(System.in);
    int upper = arr.length;
    int lower = 0;
    int middle = 0;
    int flag = 0;
    int key;

    /*
     * flag = 0 ---> not found yet.
     * flag = 1 ---> element is found.
     * flag = 2 ---> no such element.
     */

    System.out.println("Enter the number that you want to find... ");
    key = in.nextInt();

    while (flag == 0) {
        middle = (int) (lower + upper) / 2;

        if (key == arr[middle]) {
            flag = 1;
        }

        if (key < arr[middle]) {
            upper = middle - 1;
        } else if (key > arr[middle]) {
            lower = middle + 1;
        }
        if (lower > upper) {
            flag = 2;
        }
    }
    if (flag == 1) {
        System.out.println(arr[middle] + " has been found, its index is: "
                + middle);
    } else
        System.out.println("Error, no such element.");
}

public static void main(String[] args) {

    int arr[] = { 2, 4, 6, 8, 11, 34, 56 };
    search(arr);
}

}

【问题讨论】:

    标签: java arrays algorithm search binary


    【解决方案1】:

    这应该可以解决您的问题

    int upper = arr.length-1;
    

    如果您正在寻找一个大于最大值的数字,那么您肯定会查看数组的最后一个元素。 但是在您的代码中,upper 的初始值比最后一个元素的索引大 1。

    【讨论】:

      【解决方案2】:

      您可以采用 MisterDev 的解决方案并更正上限。通常,在 Java 数组中,下限包含在内,上限不包含在内,我喜欢 lowerupper 遵循这种模式的想法。

      那么lower &lt; upper表示范围不为空,中间点将成为前半段继续搜索时新的排他上界:

      public static int search(int arr[], int key)
      {
          int upper = arr.length;
          int lower = 0;
      
          while (lower < upper) {
              int middle = (lower + upper) / 2;
      
              if (key == arr[middle]) return middle;
      
              if (key < arr[middle]) {
                  upper = middle;
              } else if (key > arr[middle]) {
                  lower = middle + 1;
              }
          }
      
          return -1;
      }
      

      我已经让函数将键作为参数并返回索引,如果未找到键则返回 -1。在我看来,接受用户输入和flag 在您的代码中没有任何业务;您应该为此编写一个包装器,以便 Binary.search 真正进行搜索。

      【讨论】:

      • 这很棒。这样您就可以使其灵活并在其他一些程序中使用它。
      猜你喜欢
      • 1970-01-01
      • 2011-04-30
      • 2018-11-19
      • 2013-03-30
      • 1970-01-01
      • 1970-01-01
      • 2013-03-05
      • 2016-01-04
      相关资源
      最近更新 更多