联系作者:humminwang@163.com
二分法
- 对于区间 [ a , b ] [a,b] [a,b]上连续不断且 f ( a ) ⋅ f ( b ) < 0 f(a)·f(b)<0 f(a)⋅f(b)<0的函数 y = f ( x ) y=f(x) y=f(x),通过不断地把函数 f ( x ) f(x) f(x)的零点所在的区间一分为二,使区间的两个端点逐步逼近零点,进而得到零点近似值的方法叫二分法。
- 通俗语言就是将搜索空间不断的减半,从而逼近解的过程。
从二分查找来看二分法:
例子:在一个一维 有序 数组中,判断数组中是否有值为 t a r g e t target target的数存在。
- 首先判断数组中间值是否大于目标值,如果大于,则将搜索空间变为前半段,删除后半段。反之同理。
迭代算法(时间复杂度O(log(n)),空间复杂度O(1))
int binarySearch(vector<int> arr,int key){
int low=0; //数组最小索引值
int high=arr.size()-1; //数组最大索引值
while(low<high){
int mid==(low+high)/2;
if(key==arr[mid]){
return mid+1;
}else if(key>arr[mid]){
low=mid+1;
}else{
high=mid-1;
}
}
return -1;//没有找到
}
递归算法(时间复杂度O(log(n)),空间复杂度O(n))
int binarySearch(vector<int> arr,int low,int high,int key){
if(low>high){return -1;}
int mid=(low+high)/2;
if(key==arr[mid]){
return mid+1;
}else if(key<arr[mid]){
high=mid-1;
return binarySearch(arr,low,high,key);
}else{
low=mid+1;
return binarySearch(arr,low,high,key);
}
}