算法 二分查找的时间复杂度为O(log2N)的原因推理

时间复杂度概念还不清楚的可以先看我的下面这个文章:
https://blog.csdn.net/u010452388/article/details/80875958

由于二分查找每次查询都是从数组中间切开查询,所以每次查询,剩余的查询数为上一次的一半,从下表可以清晰的看出查询次数与剩余元素数量对应关系

表-查询次数及剩余数

第几次查询剩余待查询元素数量
1N/2
2N/(2^2)
3N/(2^3)
KN/(2^K)

从上表可以看出N/(2^K)肯定是大于等于1,也就是N/(2^K)>=1,我们计算时间复杂度是按照最坏的情况进行计算,也就是是查到剩余最后一个数才查到我们想要的数据,也就是
N/(2^K)=1
=>N=2^K
=>K=log2N
所以二分查找的时间复杂度为O(log2N)

代码

/** * 二分查找 * @param arr 指定查询的数组 * @param searchNum 要查询的数字 * @return 返回查询的的结果(数组中的索引),没有则返回-1 */
    public static int binerySearch(int[] arr, int searchNum) {
        // 初始化左侧索引
        int leftIndex = 0;
        // 初始化右侧索引
        int rightIndex = arr.length - 1;
        while (leftIndex <= rightIndex) {
            // 计算中间索引
            int mid = (leftIndex + rightIndex) >>> 1;//主要防止溢出,就是除以2的意思
            // 如果查询的数等于中间索引对应的数组里的数,则返回mid索引,并退出循环
            if (searchNum == arr[mid]) {
                return mid;
            }
            // 判断并计算右侧索引
            if (searchNum < arr[mid]) {
                rightIndex = mid - 1;
            }
            // 判断并计算左侧索引
            if (searchNum > arr[mid]) {
                leftIndex = mid + 1;
            }
        }
        return -1;
    }
点赞

发表评论

电子邮件地址不会被公开。 必填项已用*标注