繁体   English   中英

Java:使用相等的延迟检测,二进制搜索实现不起作用

[英]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 = 2r = 3mid会变成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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM