如果在JAVA中的二进制搜索中找不到数字,那么如何返回数字应该去的索引

时间:2015-03-26 16:58:52

标签: java arrays binary-search

所以我有一个二进制搜索代码,可以找到一个数字应放在哪里以维护排序顺序。到目前为止,我已经花了一个半小时的时间试图解决这个问题,所以我可以使用推进器。

如果在数组中找不到值,但是找到它应该放置的位置,我会在方法结束时返回什么值?基本上是一个值,该值表示该数字所属的索引在中间值的+/- 1之内。

这是二元搜索,我不打算改变它,而只是寻找变量返回_____的位置。

private static int bsearch( int[] arr, int count, int key )
{
    if (count==0) return -1;
    int lo = 0, hi = count - 1, mid;
    while(hi >= lo)
    {
          mid = (lo + hi) / 2;
          if(arr[mid] == key) return mid;
          if ( key < arr[mid] ) hi = mid-1;
          else lo = mid+1;
    }
    return _____;        
}   

3 个答案:

答案 0 :(得分:4)

大多数方法返回索引的位置否定,放置元素的位置,因此~idx

二元搜索假设lo之前的所有元素都小于keyhi的类似物。

如果hi < lo,则表示hi设置为mid-1mid等于lo(因为hi和{ {1}}最多只有一个)或类似于lo。因此,必须放置元素的位置为lo。因此返回:

lo

因此,算法的优化版本是:

return ~lo;

作为测试用例:

private static int bsearch( int[] arr, int count, int key) {
    if (count==0) return -1;
    int lo = 0, hi = count - 1, mid = hi>>1;
    while(hi >= lo) {
          mid = (lo + hi) >> 1;
          if ( key < arr[mid] ) hi = mid-1;
          else if ( key > arr[mid] ) lo = mid+1;
          else return mid;
    }
    return ~lo;
}

给出:

for(int i = 0; i <= 22; i++) {
    int r = bsearch(new int[] {2,3,7,9,11,15,21},7,i);
    System.out.println(""+i+" -> "+r+" "+(~r));
}

0 -> -1 0 1 -> -1 0 2 -> 0 -1 3 -> 1 -2 4 -> -3 2 5 -> -3 2 6 -> -3 2 7 -> 2 -3 8 -> -4 3 9 -> 3 -4 10 -> -5 4 11 -> 4 -5 12 -> -6 5 13 -> -6 5 14 -> -6 5 15 -> 5 -6 16 -> -7 6 17 -> -7 6 18 -> -7 6 19 -> -7 6 20 -> -7 6 21 -> 6 -7 22 -> -8 7 x -> i j结果,i按位为负数(在j的情况下用作插入索引为负数)。

online JDoodle demo

答案 1 :(得分:1)

请参阅Arrays.binarySearch

return -low - 1;

负数,最多-1。由于mid(插入点)的范围为0。

  

<强>返回

     

搜索键的索引,如果它包含在数组中;除此以外,   ( - (插入点) - 1)。插入点定义为点   密钥将插入到数组中:索引   第一个元素大于键,或者a.length如果所有元素都在   array小于指定的键。请注意,这可以保证   当且仅当找到密钥时,返回值将> = 0。

答案 2 :(得分:-1)

实际代码为return -1。但我很困惑你的描述。什么是“如果在数组中找不到值,但找到它应放置的位置?”含义? 可以在数组中找到该值。在while之前找不到它,这意味着它不在数组中,所以你应该return -1