1>何为而分查找?
二分查找针对的是有序的数据集合,每次都是通过跟区间的中间元素对比,将待查找的区间缩小为之前的一半,直到查找到该元素,或者区间缩小为0。
2>二分查找为何这么高效?
我们假设数据的数据量为n,每次查找都会将数据集缩小为原来的一半,最坏的情况下 ,直到这区间缩小为空,
根据上式求得二分查找的时间复杂度为logn
3>二分查找的简单得到代码实现
public int bsearch(int[] a,int n,int value){
int low = 0;
int high = n-1;
while(low <= high){
int mid = (low+high)/2
if(mid == value){
return mid;
}else if(a[mid] < value){
low = mid+1;
}else{
high = mid-1;
}
}
return -1;
}
注意点:循环退出的条件是low <=high;
mid的取值:如果low 和high的取值是很大的话,mid计算的值可能出现溢出,改进的方式是(low +(high-low))/2
low=mid+1,high=mid-1。注意这里的 +1 ,-1,如何直接写成low = mid,high=mid,可能出现死循环,这种事没有意义的.
4>二分法使用于那些场景
可知到,使用二分法查找要随机的访问元素,并进行比较,所以二分法查找依赖的数据结构是顺序存储结构,比如说是数组,可以随机访问元素进行比较,如果是基于链表,链表的随机访问时间复杂度是O(n),增大了二分查找性能,
其次二分查找针对的数据必须是有序的,所以在频繁的插入删除操作,我们为保证数据有序,必须使用其他排序算法保证数据有序,才能使用二分查找,而排序的成本本身比较高,二分查找另一个限制就是插入,删除比较少的数据集合当中来保证全局的有序.二分查找更适合静态有序集合数据.
二分法查找所针对的数据结构必须是顺序连续的,支持随机访问,如果内存分配不连续也不能使用二分查找
二分法查找如果针对的是数据量比较小的情况下,遍历O(n) = logn,2者的时间复杂度相近,完全遍历就可以了,所以二分法查找不使用小数据集.