[英]Java: Binary Search Implementation not working using Deferred detection of equality
我正在尝试实现Binary Search Java版本。 从Wikipedia http://en.wikipedia.org/wiki/Binary_search_algorithm#Deferred_detection_of_equality,我注意到推迟了对相等版本的检测。 它正在使用该算法。 但是,当我尝试像这样更改if条件表达式时:
public int bsearch1(int[] numbers, int key, int start){
int L = start, R = numbers.length - 1;
while(L < R){
//find the mid point value
int mid = (L + R) / 2;
if (numbers[mid] >key){
//move to left
R = mid - 1;
} else{
// move to right, here numbers[mid] <= key
L = mid;
}
}
return (L == R && numbers[L] == key) ? L : -1;
}
它无法正常工作,进入无限循环。 你们对此有什么想法吗? 非常感谢。
您已经错过了链接到的Wiki中assert
的影响。
它指出:
代码必须确保间隔在每次迭代时都减小
如果您的mid
> = R
则必须退出。
添加
Wiki实际上有点误导,因为它表明仅确保mid < r
是足够的-事实并非如此。 您还必须注意mid == min
(例如,您有4
条目数组,并且l = 2
和r = 3
, mid
会变成2
并坚持在那里,因为在整数数学中2 + 3 = 5
和5/2 5 / 2 = 2
)。
该解决方案是后围捕 / 2
,其可以很容易地实现:
int mid = (l + r + 1) / 2;
最终的校正和整理代码如下所示:
public int binarySearch(int[] numbers, int key, int start) {
int l = start, r = numbers.length - 1;
while (l < r) {
//find the mid point value
int mid = (l + r + 1) / 2;
if (numbers[mid] > key) {
//move to left
r = mid - 1;
} else {
// move to right, here numbers[mid] <= key
l = mid;
}
}
return (l == r && numbers[l] == key) ? l : -1;
}
public void test() {
int[] numbers = new int[]{1, 2, 5, 6};
for (int i = 0; i < 9; i++) {
System.out.println("Searching for " + i);
System.out.println("Found at " + binarySearch(numbers, i, 0));
}
}
有一个平凡类似的算法在这里它代表着在正确的做法看上去更像是:
public int binarySearch(int[] numbers, int key) {
int low = 0, high = numbers.length;
while (low < high) {
int mid = (low + high) / 2;
if (numbers[mid] < key) {
low = mid + 1;
} else {
high = mid;
}
}
return low < numbers.length && numbers[low] == key ? low : -1;
}
对于high = max + 1
的边界条件,这采取了略有不同的方法,并且效果也很好。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.