从二分查找法看循环不变量-JAVA

上代码,注释里写了具体的含义

 public static int binarySearchRN(Comparable[] arr, int n, Comparable target){

        //int l = 0, r = n - 1;//在数组中从[l...r]的范围内寻找target
        //循环不变量l 与 r 就代表了需要查找的这个范围的左右边界,而选择取不同的值,对于这个区间来说就是开区间与闭区间的区别,在修改它们的同时,也需要在循环中同步这一定义。这也就是循环不变量的意义
        //int l = 0, r = n;
        //int l = -1, r = n -1;
        int l = -1, r = n;//在数组中从[l...r)的范围内寻找target
        //while (l <= r ){ //当l == r时,区间[l...r]依然有效
        while (l < r) {
            int mid = (l + r ) / 2;//为了防止整型溢出的问题,可以修改为l + (r - l) / 2
            if(arr[mid].compareTo(target) == 0) return mid;
            if(target.compareTo(arr[mid]) > 0)
                //  l = mid + 1;    //  在[mid + 1 ... r]中寻找目标    
                l = mid;    //  在(mid ... r)中寻找目标
            else
                //r = mid - 1;    //在[l ... mid - 1]中寻找目标
                r = mid;    //在(l ... mid)中寻找目标
        }

        return -1;
    }

//测试
public static void main(String[] args) {
        int n = 1000000;
        Integer[] data = MyUtil.generateOrderArray(n);
        long startTime = System.currentTimeMillis();
        for (int i = 0; i < n; i ++)
            if(i != BinarySearch.binarySearchRN(data, data.length, i))
                throw new IllegalArgumentException("error");
        long endTime = System.currentTimeMillis();
        System.out.println("time cost: " + (endTime - startTime) + "ms");
    }

明确每一个变量的含义,就能明确循环不变量

©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

友情链接更多精彩内容