二分法的时间复杂度计算

先说下定义O(log2n)与O(n)的区别

O(log2n)含义说明:

比如123456789,你要找2,首先查中间元素5,大于2,所以直接排除掉5右边的6789,然后在1234里继续二分查找。每次排除1/2的元素,所以是O(log2n)。

O(n)含义说明:

n是元素的个数,O(n)意味着你把每个元素都访问一遍,这样你当然可以找到要查找的数了。但是对于有序数组,没必要这样遍历整个数组。

再说下时间复杂度:

总共有n个元素,每次查找的区间大小就是n,n/2,n/4,…,n/2^k(接下来操作元素的剩余个数),其中k就是循环的次数。 

由于n/2^k取整后>=1,即令n/2^k=1, 

可得k=log2n,(是以2为底,n的对数),所以时间复杂度可以表示O()=O(logn)。

总结一下就是:

二分法的关键思想是   假设该数组的长度是N那么二分后是N/2,再二分后是N/4……直到二分到1结束(当然这是属于最坏的情况了,即每次找到的那个中点数都不是我们要找的),那么二分的次数就是基本语句执行的次数,于是我们可以设次数为x,N*(1/2)^x=1;则x=logn,底数是2。

最后说二分法查找(binary search):

也称作折半查找(half-interval search),每次划分一半进行下一步搜索,所以时间复杂度无非就是while循环的次数。

适用范围:

已经排好序的数组

Java 实现:

定义两个变量,一个low,一个high,则mid=(low+high)/2

    public static void main(String[] args) {
        int[] arr= {30,20,50,10,80,9,7,12,100,40,8};
        Arrays.sort(arr);//{7,8,9,10,12,20,30,40,50,80,100};
        System.out.println(Arrays.toString(arr));
        System.out.println(twoff(arr,40));
    }

    public static int twoff(int[] arr, int value) {
        //定义边界
        int low = 0;
        int high = arr.length - 1;

        while ((low <= high) && (low <= arr.length - 1)
                && (high <= arr.length - 1)) {
            int mid=(low+high)/2;
            if(value==arr[mid]) {
                return mid;
            }
            if(value>arr[mid]) {
                low=mid+1;
            }
            if(value<arr[mid]) {
                high=mid-1;
            }
        }
        return -1;//没有找到返回-1
    }

总结一下,简单理解就是二分都是以2为底n的对数

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值