二分查找及其常见变种
目录
基本的二分查找
我们假设数据大小是 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