对于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);
}
}
答案 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);
代码将在区间[0,1]中搜索它,看它应该是正确的, 下一个递归搜索区间[1,1],导致在行
处索引[1]if(less(key,a[mid])){
导致数组超出界限错误。
第二种解决方案可以正常使用。