二分查找算法
简单定义:
在一个单调有序的集合中查找元素,每次将集合分为左右两部分,判断解在哪个部分中并调整集合上下界,重复直到找到目标元素。
时间复杂度:
O (logn),优于直接顺序查找O(n)
这里也补充一下算法速度的表示方法:
指示算法的速度有多快,用于指出随数量的增大,算法的所需步骤增加的速度,常见的大O运行时间(时间复杂度):
O(1)表示常数阶时间复杂度
O(log n),也叫对数时间复杂度,这样的算法包括二分查找。
O(n),也叫线性阶时间复杂度,这样的算法包括简单查找。
O(n * log n), (n*对数复杂度)
O(n^2),平方阶时间复杂度
O(n!),阶乘阶时间复杂度
简单理解就是画出上述的各种函数图像,很明显logn最小!!
最近看了一些相关的资料加上自己的心得体会,对于二分进行相关的总结:
目的:二分查找的中心思想就是查找所需要的结果,也就是说给定一个数组和目标值,返回该目标值在数组中第一次出现的位置。
限制:也就是说二分查找的有的条件,①该数组必须满足顺序存储结构,②该数组必须按关键字的大小有序排列。
优点:时间复杂度特别小,适用于大数据的情况下。
直接上最基本原理的代码:
//x:待查找的元素, n:数组集合大小, num数组单调递增
int low=0,high=n,mid,res = -1; //low:集合下界 high:集合上节
while(low<=high)
{
mid=(low+high)/2; //mid:将集合分割为两部分
if(num[mid]==x) //查找到符合元素x
{
res = mid;
break;
}
else if(num[mid]<x)//x在右边部分,调整集合下界
low=mid+1;
else //x在左边部分,调整集合上界
high=mid-1;
} //若未找到x,则res = -1
//x:待查找的值,Caculate():所要查找的函数,在这里单调递增
//需保证查找的值在区间范围内
double low=“区间下界”,high=“区间上界”,mid;
while(high - low > 1.0e-6)
{
mid = (high + low)/2;
if(Caculate(mid)<x)
low=mid;
else
high=mid;
}
关于二分法更多的就是二分法的拓展,最典型的就是是二分法但是决不让你知道用二分来做,下次写博客的时候争取可以多总结一些二分法的题型,更加深入了解二分法的概念。
“宝剑锋从磨砺出,梅花香自苦寒来。”