【经典算法】·二分法


联系作者:humminwang@163.com

二分法

  • 对于区间 [ a , b ] [a,b] [ab]上连续不断且 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);
	}
}
Reference:
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值