二分查找算法之x的平方根

本文介绍了二分查找算法,包括其定义、搜索过程和优势,如减少比较次数、提高查找速度等。同时,文章以LeetCode题目为例,展示了如何利用二分法计算非负整数的算术平方根,强调不使用内置函数的要求。
摘要由CSDN通过智能技术生成

目录: 

1. 二分查找是什么且其有哪些优势

2. 前提条件

3. 求x的平方根


【二分查找是什么】

二分法,也称为二分搜索,是一种在有序数组中查找某一特定元素的搜索算法。

搜索过程从数组的中间元素开始,如果中间元素正好是要查找的元素,则搜索过程结束;

如果某一特定元素大于或者小于中间元素,则在数组大于或小于中间元素的那一半中查找,而且跟开始一样从中间元素开始比较。

如果在某一步骤数组为空,则代表找不到。

这种搜索算法每一次比较都使搜索范围缩小一半。

【优势】

二分查找的优势主要包括:

比较次数少:二分查找每次将搜索区域一分为二,因此比较次数相对较少,对于大型数据集,这可以大大提高查找速度;
查找速度快:由于每次都将搜索区域减半,所以二分查找的速度非常快,特别是当数据量很大时,效果更为显著;
平均性能好:在平均情况下,二分查找需要比较log2n次(n为数据量),性能稳定;
占用系统内存较少:由于二分查找只需要存储关键元素,不需要存储整个数据集,因此可以节省内存空间。


【前提条件】

二分查找法的前提条件是:

在查找的内容范围上一定是有顺序的。
这是因为二分查找依赖于有序数组的中间元素来分割数组,并在两侧继续搜索,直到找到目标值或者搜索区域变为0。如果没有这些前提条件,二分查找无法正确工作。

使用二分查找时,要特别注意数组是否已经排序,如果数组无序,那么二分查找将无法得到正确的结果。

那么为什么二分查找的前提需要数组有序呢,为了方便同学们理解,接下来举个例子

22-12510923-78999

如果我们要找的元素是8,那么这个无序数列的中间值比较就没有意义中间值,中间值为9,则我们默认为8在9的前面,但我们肉眼可见8在9的后面,这是再用二分法则会出现错误! ! !

除此之外,二分查找只能实现单值查找,不可能实现多值查找!!!所以总结一下:

二分查找有两个限制条件:

  1. 查找的数量只能是一个,不能是多个
  2. 查找的对象在逻辑上必须是有序的

下面我们来看一道经典例题

给你一个非负整数 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为了防溢出哦

  • 9
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值