二分查找-简单算法

这篇文章我们简单了解下二分查找算法,众所周知,二分查找就是将已知的有序数列不断的从中间分隔来查找指定结果的方法。

假设我们要从1到100中找出一个任意数字,如果我们用简单查找,那么很简单,我们只需要将每一个数字猜一遍即可,每次猜测排除一个数字,最后总会查找到我们需要的结果,但是这种查找说白了就是傻找,如果我们的目标数据足够大,那么使用简单查找估计需要到下一个冰河世纪了,所以,引入了二分查找,二分查找很简单,即就是对目标数据的集合进行数据的分割,1到100的目标数据我们一开始猜50,然后根据返回的猜小了还是大了,如果返回小了,那么下一次我们就猜75,如果大了,我们下一次就猜25,以此类推,这样,我们每次可以排除一半的数据,大大减少了我们的查询时间

接下来我们看一下二分查找的时间复杂度,这次我们将实验数据缩小,假设需要查找的目标数据为1-8,查找边界数据即为二分查找的时间复杂度的极值,假设我们要查询的数据为8,我们最快需要几步能查询出来呢,第一步,我们找到中间数字4,返回值告诉我们小了,第二步找到4到8中间的数据6,返回值告诉我们还小了,第三步我们找到6到8之间的数据7,返回值告诉我们还是小了,那么要查询的数据就只能是8了,所以很显然,我们查询1-8之间的数字最多只需要查询3次,我们把数据分割了n次,则目标数据个数集合小于等于2的n次方,即2的n次方>=目标集合数据的个数,幂函数与对数函数互为逆运算,则我们在一个目标集合数据(N)中要查找出来一个指定数据的次数就为log以2为底N的对数。

接下来我们用简单的代码实现一下二分查找,手边只有c++的工具,我们就用c++来简单实现下,java代码同样的道理,思路相同

        我们输入一个0到end的数据,然后输入一个要查找的数据,打印出来每次寻找的中间数和最终查找的次数。

#include
using namespace std; 

int  COUNT = 0,falg;
int find_number(int start,int end,int find){
	falg = (end+start)/2;
	COUNT++; 
	if(falg == find){
		cout << "查找的数据为 :[ " << falg << " ] 共查找:["  << COUNT << "]次" << endl;
		return end;
	}
	if(falg == end -1){
		cout << "查找的数据为 :[ " << end << " ] 共查找:["  << COUNT << "]次" << endl;
		return end;
	}	
	find > falg ? start = falg : end = falg;
	cout << "find = [" << find << "] end = [" << end << "] start = [" << start <<"]"<< endl;
	find_number(start,end,find); 
}
int main(){	
	int end,find,start = 0;	
	cin >> end >>find;	
	if(find > end || find < start ){
		cout << " 输入数据不合法!!" << endl;
	}
	find_number(start,end,find);
	return 0;
} 

我们来看看打印结果:我们输入0到128的目标数据集合,然后查找127,start为我们每次找的中间数,从结果知道,我们只需要查找7次即可

二分查找-简单算法_第1张图片

 二分查找相对于简单查找在大数据集合下的查询速度成指数级增长,二分查找时间复杂度表示O(logn),需要注意的是二分查找的数据集合必须是有序的,否则没有意义

你可能感兴趣的:(算法,算法,数据结构,排序算法)