二分查找01.基本二分查找及其变种

watermark,size_16,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_90,type_ZmFuZ3poZW5naGVpdGk=二分查找及其常见变种


目录


基本的二分查找

我们假设数据大小是 n,每次查找后数据都会缩小为原来的一半,也就是会除以 2。最坏情况下,直到查找区间被缩小为空,才停止。

可以看出来,这是一个等比数列。其中 n/2k=1 时,k 的值就是总共缩小的次数。而每一次缩小操作只涉及两个数据的大小比较,所以,经过了 k 次区间缩小操作,时间复杂度就是 O(k)。通过 n/2k=1,我们可以求得 k=log2n,所以时间复杂度就是 O(logn)。

<?php
function bsearch($arr,$n){
    $low=0;
    $high=count($arr)-1;
    //注意边界
    while($low<=$high){
//        $mid=intval(($low+$high)/2);
        $mid=$low+(($high-$low)>>1);
        if($arr[$mid]==$n){
            return $mid;
        }elseif($n<$arr[$mid]){  //n在 [low,mid-1]
            $high=$mid-1;
        }else{  //n 在[mid+1,high]
            $low=$mid+1;
        }
    }
    return -1;
}

易出错的三点

1. 循环退出条件

注意是 low<=high,而不是 low

猜你喜欢

转载自blog.51cto.com/huangkui/2677730