目录:
1. 二分查找是什么且其有哪些优势
2. 前提条件
3. 求x的平方根
【二分查找是什么】
二分法,也称为二分搜索,是一种在有序数组中查找某一特定元素的搜索算法。
搜索过程从数组的中间元素开始,如果中间元素正好是要查找的元素,则搜索过程结束;
如果某一特定元素大于或者小于中间元素,则在数组大于或小于中间元素的那一半中查找,而且跟开始一样从中间元素开始比较。
如果在某一步骤数组为空,则代表找不到。
这种搜索算法每一次比较都使搜索范围缩小一半。
【优势】
二分查找的优势主要包括:
比较次数少:二分查找每次将搜索区域一分为二,因此比较次数相对较少,对于大型数据集,这可以大大提高查找速度;
查找速度快:由于每次都将搜索区域减半,所以二分查找的速度非常快,特别是当数据量很大时,效果更为显著;
平均性能好:在平均情况下,二分查找需要比较log2n次(n为数据量),性能稳定;
占用系统内存较少:由于二分查找只需要存储关键元素,不需要存储整个数据集,因此可以节省内存空间。
【前提条件】
二分查找法的前提条件是:
在查找的内容范围上一定是有顺序的。
这是因为二分查找依赖于有序数组的中间元素来分割数组,并在两侧继续搜索,直到找到目标值或者搜索区域变为0。如果没有这些前提条件,二分查找无法正确工作。
使用二分查找时,要特别注意数组是否已经排序,如果数组无序,那么二分查找将无法得到正确的结果。
那么为什么二分查找的前提需要数组有序呢,为了方便同学们理解,接下来举个例子
22 | -1 | 2 | 5 | 10 | 9 | 23 | -7 | 8 | 99 | 9 |
如果我们要找的元素是8,那么这个无序数列的中间值比较就没有意义中间值,中间值为9,则我们默认为8在9的前面,但我们肉眼可见8在9的后面,这是再用二分法则会出现错误! ! !
除此之外,二分查找只能实现单值查找,不可能实现多值查找!!!所以总结一下:
二分查找有两个限制条件:
- 查找的数量只能是一个,不能是多个
- 查找的对象在逻辑上必须是有序的
下面我们来看一道经典例题
给你一个非负整数 x ,计算并返回 x 的 算术平方根 。
由于返回类型是整数,结果只保留 整数部分 ,小数部分将被 舍去 。
注意:不允许使用任何内置指数函数和算符,例如 pow(x, 0.5) 或者 x ** 0.5 。
来源:力扣(LeetCode)
链接:https://leetcode.cn/problems/sqrtx
【思路】很明显这道题就可以直接采取我们的二分法
所谓x开平方根
就是找一个数x,x的平方=y
我们一直x一定在1---y之间
因此我们一直让x余中间值做对比,看x的平方若小于则取接近于m,位于x右侧的数
int mySqrt(int x)
{
int left=0;
int right=x;
int mid;
if(x<2)
return x;
while(left<=right)
{
mid = (right-left)/2+left;
int sum = x/mid;
if(mid==sum)
{
return mid;
}
else if(mid>sum)
{
right = mid-1;
}
else
{
left = mid+1;
}
}
return right;
}
这样子就欧克啦
还有这里注意用mid=(right-lef)/2+left为了防溢出哦