【问题标题】:Binary search implementation java algorithm二分查找实现java算法
【发布时间】:2014-05-10 05:57:39
【问题描述】:

我在实现二进制搜索算法方面需要帮助,谁能告诉我我的代码有什么问题:

public int bsearch(Item idToSearch) { 
    int lowerBoundary = 0;
    int upperBoundary = myStore.size() - 1;
    int mid = -1;

    while(upperBoundary >= lowerBoundary) {
        mid = (lowerBoundary + upperBoundary) / 2;

        //if element at middle is less than item to be searched, than set new lower boundary to mid
        if(myStore.get(mid).compareTo(idToSearch) < 0) {
            lowerBoundary = mid - 1;
        } else {
            upperBoundary = mid + 1;
        }
    } //end while loop

    if(myStore.get(mid).equals(idToSearch)) {
        return mid;
    } else {
        return -1; // item not found
    }
} // end method

【问题讨论】:

  • 调试器肯定能告诉你哪里出了问题。
  • 一个完全不正确的算法...

标签: java algorithm search binary


【解决方案1】:

我认为你在更新 lowerBoundaryupperBoundary 时犯了一个错误。

可能是:

    if(myStore.get(mid).compareTo(idToSearch) < 0){
        lowerBoundary = mid + 1;
    } else {
        upperBoundary = mid - 1;
    }

如果你在mid 找到元素,为什么不打破循环?

【讨论】:

    【解决方案2】:

    我愿意

    • 在下限和上限相同时停止。
    • 找到匹配项时停止
    • 使用mid = (hi + lo) &gt;&gt;&gt; 1; 避免溢出导致错误。
    • 阅读 JDK 中的代码,因为它可以正常工作。

    【讨论】:

      【解决方案3】:

      第一个问题是边界,如果他发现了价值,你也应该停下来,但他没有,这导致可能的忽视。

      while(upperBoundary >= lowerBoundary)
      {
              mid = (lowerBoundary + upperBoundary) / 2;
      
              if (myStore.get(mid).equals(idToSearch)) break; // goal
      
              if(myStore.get(mid).compareTo(idToSearch) < 0)
              {
                  lowerBoundary = mid + 1;
              }
              else
              {
                  upperBoundary = mid - 1;
              }
      }
      

      【讨论】:

        猜你喜欢
        • 2023-03-05
        • 2019-12-25
        • 2012-08-31
        • 1970-01-01
        • 2018-04-13
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-01-06
        相关资源
        最近更新 更多