【问题标题】:binary search in java [duplicate]java中的二进制搜索[重复]
【发布时间】:2013-03-02 05:17:42
【问题描述】:

我有这个代码进行二分搜索。

public class BinarySearch {

private static int location;
private static int a = 14;
static int[] numbers = new int[]{3, 6, 7, 11, 14, 16, 20, 45, 68, 79};

public static int B_Search(int[] sortedArray, int key) {
    int lowB = 0;
    int upB = sortedArray.length;
    int mid;
    while (lowB < upB) {
        mid = (lowB + upB) / 2;

        if (key < sortedArray[mid]) {
            upB = mid - 1;
        } else if (key > sortedArray[mid]) {
            lowB = mid + 1;
        } else {
            return mid;
        }
    }
    return -1;
}

public static void main(String[] args) {
    BinarySearch bs = new BinarySearch();
   location= bs.B_Search(numbers, a);
   if(location != -1){
       System.out.println("Find , at index of: "+ location);
   }
   else{
       System.out.println("Not found!");
   }
}
}

// 输出: a=14

没有找到!!

为什么?

【问题讨论】:

  • @rgettman 只有这一次对数组进行排序:D
  • @MarounMaroun 我的数组已排序!
  • @MarounMaroun 你能告诉我我的错误是什么吗?
  • 仍然基本上是原始问题的完全欺骗,因为代码具有与此相同的缺陷。

标签: java binary-search


【解决方案1】:

首先,值得在调试器中单步调试代码,看看您是否能找出问题所在。但是,根据经验,我知道这个特定的错误可能很难诊断。

您需要了解您的上限和下限是包含还是排除。我怀疑上限是exclusive,但你的下限是inclusive(这很正常)。这意味着:

upB = mid - 1;

实际上应该是:

upB = mid;

我们知道正确的索引不是mid,但它可能是较低的那个。您当前的代码不包括该值...而固定代码 only 不包括 mid

正如其他答案所示,您可以以不同的方式初始化和比较upB,并将其设为包容上限。就我个人而言,我更喜欢让它独占,因为很多计算机科学都是这样工作的。但两者都可以。

现在,请确保您真正了解这里发生了什么。 不要只是复制代码并继续前进;弄清楚这一切是如何联系在一起的。

【讨论】:

    【解决方案2】:

    lowB == upB时,在任意返回-1之前需要检查是否sortedArray[lowB] == key

    【讨论】:

    • 仅当您认为上限是包容性的 - 考虑到它的初始化方式和找到中点的方式,这似乎不太可能。
    【解决方案3】:

    你用两个不同的东西初始化 upB。最初它指向结束之后,然后它指向最后一个元素:

    试试这个:

    int upB = sortedArray.length-1;
    int mid;
    while (lowB <= upB) {
    

    【讨论】:

    • 你有没有注意到while语句中的&lt;=。它为我打印 4。
    • 或者您可以始终将upB 保留为独占上限 - 只需更改重新分配它的一个语句。鉴于在整个计算机科学中普遍存在排他性上限,我更喜欢这样做。
    猜你喜欢
    • 1970-01-01
    • 2012-01-04
    • 1970-01-01
    • 1970-01-01
    • 2020-11-16
    • 1970-01-01
    • 1970-01-01
    • 2016-10-20
    相关资源
    最近更新 更多