怎么破解软件付费内容

来源:csdn博客 分类: 文章浏览史 发布时间:2020-10-13 15:14:06 最后更新:2020-10-13 浏览:28
转载声明:
本文为摘录自“csdn博客”,版权归原作者所有。
温馨提示:
为了更好的体验,请点击原文链接进行浏览
摘录时间:
2020-10-13 15:14:06

二分查找法只能应用于有序的数组。

将要查找的元素和数组中间的元素作比较,

如果要查找的元素比数组中间的元素小,那么到左半部分查找;

如果要查找的元素比数组中间的元素大,那么到右s半部分查找。

以此类推,直到找到为止。

如果没有找到,则返回 -1。

最坏时间复杂度:O(logn)
最优时间复杂度:O(1)
平均时间复杂度:O(logn)
最坏空间复杂度:迭代 O(1),递归 O(logn)
非递归实现
public class BinarySearch {

private BinarySearch() {

}

public static int find(int[] arr, int target) {
    if (arr == null || arr.length == 0) {
        return -1;
    }

    int l = 0;
    int r = arr.length - 1;
    int mid;

    while (l <= r) {
        mid = l + ((r - l) >> 1);

        if (arr[mid] == target) {
            return mid;
        } else if (arr[mid] > target) {
            r = mid - 1;
        } else {
            l = mid + 1;
        }
    }

    return -1;
}

/**
 * 测试非递归的二分查找算法
  */
public static void main(String[] args) {

    int N = 1000000;
    int[] arr = new int[N];
    for(int i = 0 ; i < N ; i ++) {
        arr[i] = i;
    }

    // 对于我们的待查找数组[0...N)
    // 对[0...N)区间的数值使用二分查找,最终结果应该就是数字本身
    // 对[N...2*N)区间的数值使用二分查找,因为这些数字不在arr中,结果为-1
    for(int i = 0 ; i < 2 * N ; i ++) {
        int v = BinarySearch.find(arr, i);
        if (i < N) {
            assert v == i;
        } else {
            assert v == -1;
        }
    }

    return;
}

}
递归实现
public class BinarySearch2 {

private BinarySearch2() {

}

public static int find(int[] arr, int target) {
    if (arr == null || arr.length == 0) {
        return -1;
    }

    return find(arr, 0, arr.length - 1, target);
}

private static int find(int[] arr, int l, int r, int target) {
    if (l > r) {
        return -1;
    }

    int mid = l + ((r - l) >> 1);

    if (arr[mid] == target) {
        return mid;
    } else if (arr[mid] > target) {
        return find(arr, l, mid - 1, target);
    } else {
        return find(arr, mid + 1, r, target);
    }
}

/**
 * 测试递归的二分查找算法
  */
public static void main(String[] args) {

    int N = 1000000;
    int[] arr = new int[N];
    for(int i = 0 ; i < N ; i ++) {
        arr[i] = i;
    }

    // 对于我们的待查找数组[0...N)
    // 对[0...N)区间的数值使用二分查找,最终结果应该就是数字本身
    // 对[N...2*N)区间的数值使用二分查找,因为这些数字不在arr中,结果为-1
    for(int i = 0 ; i < 2 * N ; i ++) {
        int v = BinarySearch2.find(arr, i);
        if (i < N) {
            assert v == i;
        } else {
            assert v == -1;
        }
    }

    return;
}

}

php技术微信