时间复杂度O(log n)之二分查找法

介绍

O(log n):也叫对数时间,典型算法是二分查找法

当数据增大n倍时,耗时增大log n倍(这里的log是以2为底的,比如,当数据增大256倍时,耗时只增大8倍,是比线性还要低的时间复杂度)

二分查找法

使用二分查找法时的前提是:查询的数组是已经排序的

例如当前有十个数1-10,使用简单查询法查询时最糟糕的情况下需要查询10次,使用二分查询的方式如下:
如需要查询4所在的位置,则
1、从1-10取中间值5
2、比较4和5,4<5,则抛弃后半部分即5-10
3、取1-4的中间值2,4>2,则抛弃前半部分1-2
4、剩下3-4只剩下两个数则和3比较,不管是否相等都可以确定4所处位置了
总比较次数仅仅只有3次
当总数+1为11时比较次数仍然为3,当比较次数为增加到16时比较次数为4
递增规律为:数量(次数),2(1), 4(2), 8(3), 16(4), 32(5)…
即数量每乘以2次数+1,用数学表示即2的次数幂等于总数,属于用大O表示法即为O(log n)

二分查找法是一种随着数量越多,算法耗时增速越慢的算法,但是前提是查找数组必须是已经排序过的

代码实现:

public class BinarySearch {

    public static void main(String[] args) {
        System.out.println(binarySearch(new Integer[]{1, 2, 3, 4, 5}, 6));
    }


    /**
     * 二分查找法,每次都可以排除一半数据,时间复杂度O(log n)
     *
     * @param array
     * @param searchValue
     * @return
     */
    public static int binarySearch(Integer[] array, Integer searchValue) {
        int low = 0;
        int high = array.length - 1;
        while (low <= high) {
            int mid = (low + high) / 2;
            Integer value = array[mid];
            if (value.equals(searchValue)) {
                return mid;
            } else if (value.intValue() > searchValue.intValue()) {
                // 取左边数组,最大值为中间值-1
                high = mid - 1;
            } else {
                // 取右边数组,最小值为组件值+1
                low = mid + 1;
            }

        }
        return -1;

    }


}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值