lo,hi中的递归二进制搜索中的索引

时间:2013-08-26 05:33:46

标签: java algorithm binary-search

对于java字符串数组(比如String[] a)的经典binarySearch,这是调用搜索方法的正确方法吗?是吗

binarySearch(a,key,0,a.length)

binarySearch(a,key,0,a.length-1)

我为以下实现尝试了两种方法,两者似乎都有用..是否有一个用例,其中任何一个调用都可能失败?

class BS{
    public static int binarySearch(String[] a,String key){
        return binarySearch(a,key,0,a.length);
        //return binarySearch(a,key,0,a.length-1);
    }
    public static int binarySearch(String[] a,String key,int lo,int hi)   {
        if(lo > hi){
            return -1;
        }
        int mid = lo + (hi - lo)/2;
        if(less(key,a[mid])){
            return binarySearch(a,key,lo,mid-1);
        }
        else if(less(a[mid],key)){
            return binarySearch(a,key,mid+1,hi);
        }
        else{
            return mid;
        }

    }
    private static boolean less(String x,String y){
        return x.compareTo(y) < 0;
    }
     public static void main(String[] args) {
        String[] a = {"D","E","F","M","K","I"};
        Arrays.sort(a);
        System.out.println(Arrays.toString(a));
        int x =  binarySearch(a,"M");
        System.out.println("found at :"+x);

     }
}

2 个答案:

答案 0 :(得分:1)

我认为第二种方法是安全的。

考虑这种情况 - 你有一个包含9个元素的数组,并且键位于最后一个索引(第8个元素)。如果你遵循第一种方法,那么你可能会有这样的方法调用 -

binarySearch(a, key, 9, 9);

现在,在该方法执行中,以下行中的整数除法将导致9 -

int mid = 9 + (9 - 9)/2;

您将在下一行中使用9索引数组 -

if( less(key,a[mid]) ) { // You'll face ArrayIndexOutOfBoundException
    ....
}

这将无效并导致ArrayIndexOutOfBoundException

然而,第二种方法会很好。

答案 1 :(得分:1)

考虑

的情况

a = [“foo”]

并使用binarySearch(a,key,0,a.length);

搜索关键字“zoo”

代码将在区间[0,1]中搜索它,看它应该是正确的, 下一个递归搜索区间[1,1],导致在行

处索引[1]
if(less(key,a[mid])){

导致数组超出界限错误。

第二种解决方案可以正常使用。