Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/algorithm/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
java算法的二进制搜索实现_Java_Algorithm_Search_Binary - Fatal编程技术网

java算法的二进制搜索实现

java算法的二进制搜索实现,java,algorithm,search,binary,Java,Algorithm,Search,Binary,我需要帮助实现二进制搜索算法,有人能告诉我我的代码有什么问题吗: public int bsearch(Item idToSearch) { int lowerBoundary = 0; int upperBoundary = myStore.size() - 1; int mid = -1; while(upperBoundary >= lowerBoundary) { mid = (lowerBoundary + upperBound

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

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
public int b搜索(项目idToSearch){
int-lowerBoundary=0;
int upperbound=myStore.size()-1;
int mid=-1;
while(上边界>=下边界){
中间=(下边界+上边界)/2;
//若中间的元素小于要搜索的项,则将新的下边界设置为中间
if(myStore.get(mid.compareTo)(idToSearch)<0){
下限=中间-1;
}否则{
上边界=中间+1;
}
}//在循环结束时结束
if(myStore.get(mid.equals)(idToSearch)){
中途返回;
}否则{
return-1;//未找到项
}
}//结束方法

我认为您在更新
下边界
上边界
时犯了一个错误

它可能是:

    if(myStore.get(mid).compareTo(idToSearch) < 0){
        lowerBoundary = mid + 1;
    } else {
        upperBoundary = mid - 1;
    }
if(myStore.get(mid.compareTo)(idToSearch)<0){
下限=中间+1;
}否则{
上边界=中间-1;
}

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

我认为你在更新
下边界和
上边界时犯了一个错误

它可能是:

    if(myStore.get(mid).compareTo(idToSearch) < 0){
        lowerBoundary = mid + 1;
    } else {
        upperBoundary = mid - 1;
    }
if(myStore.get(mid.compareTo)(idToSearch)<0){
下限=中间+1;
}否则{
上边界=中间-1;
}
如果你在
mid
找到元素,为什么不打破循环呢

  • 当下限和上限相同时停止
  • 找到匹配项时停止
  • 使用
    mid=(hi+lo)>>1以避免溢出导致错误
  • 阅读JDK中的代码,JDK在正常工作时已经完成了这项工作
    • 我会的

      • 当下限和上限相同时停止
      • 找到匹配项时停止
      • 使用
        mid=(hi+lo)>>1以避免溢出导致错误
      • 阅读JDK中的代码,JDK在正常工作时已经完成了这项工作

        • 第一个问题是边界问题,如果他发现了值,你也应该停止,但他没有发现,这可能导致忽略

          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;
                  }
          }
          
          while(上边界>=下边界)
          {
          中间=(下边界+上边界)/2;
          if(myStore.get(mid).equals(idToSearch))break;//目标
          if(myStore.get(mid.compareTo)(idToSearch)<0)
          {
          下限=中间+1;
          }
          其他的
          {
          上边界=中间-1;
          }
          }
          
          第一个问题是边界,如果他发现了值,你也应该停止,但他没有发现,这可能导致忽略

          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;
                  }
          }
          
          while(上边界>=下边界)
          {
          中间=(下边界+上边界)/2;
          if(myStore.get(mid).equals(idToSearch))break;//目标
          if(myStore.get(mid.compareTo)(idToSearch)<0)
          {
          下限=中间+1;
          }
          其他的
          {
          上边界=中间-1;
          }
          }
          
          调试器肯定能告诉你什么是错误的。一个非常不正确的算法…调试器肯定能告诉你什么是错误的。一个非常不正确的算法。。。