源码先锋

源码先锋

算法基础:二分查找

admin 193 34

二分查找,就和他的名字一样,把一个数组找到他的中间的值和我想要找的值,进行对比,这个时候可以分为三种情况

1、比中间值大,我就到中间值到最大值的范围内去找。

2、比中间值小,那就去最小值和中间值之间去寻找。如果正好相等那恭喜你找到了。然后照这个思路不断的递归迭代就可以确定是否有对应的值了。

publicintrank(Keykey){

intl1=;

intl0=0;

while(l0l1){

intmid=l0+(l1+l0)/2;

intb=(keys[mid]);

if(b0)l0=mid+1;//+1和下面-1的作用是为了找不到是跳出

elseif(b0)l1=mid-1;

elsereturnmid;

}

returnl0;

}

特性:

查找速度lgN插入速度在N-2N之间

优缺点:

相对于普通顺序查找速度由二次方到对数级块了很多。

缺陷:数组必须有序的

应用:

用二分查找法找寻边界值

之前的都是在数组中找到一个数要与目标相等,如果不存在则返回-1。我们也可以用二分查找法找寻边界值,也就是说在有序数组中找到“正好大于(小于)目标数”的那个数。

用数学的表述方式就是:

在集合中找到一个大于(小于)目标数t的数x,使得集合中的任意数要么大于(小于)等于x,要么小于(大于)等于t。

用二分查找法找寻区域

之前我们使用二分查找法时,都是基于数组中的元素各不相同。假如存在重复数据,而数组依然有序,那么我们还是可以用二分查找法判别目标数是否存在。不过,返回的index就只能是随机的重复数据中的某一个。

此时,我们会希望知道有多少个目标数存在。或者说我们希望数组的区域。