二分查找--中间值取值原则

2023-11-19

在数组总长度为奇数时,二分查找的中间值就是数组中间的那个元素。例如,对于长度为5的数组,中间元素的下标为2。

在数组总长度为偶数时,二分查找的中间值有两个,可以取任意一个作为中间值。一种常用的方法是取靠左的那个中间值。例如,对于长度为6的数组,可以取中间元素的下标为2或3作为中间值。

这里需要注意的是,在实际编程中,为了保证代码的简洁性和通用性,我们通常会将中间值向下取整,即取靠左的那个中间值。这样可以保证不管数组长度是奇数还是偶数,都能够正确地找到中间值。

注意一般mid = left + (right-left)/2;

不要用mid = (right - left)/2

中间值的计算需要考虑到整型溢出的问题。如果使用 `mid = (right - left) / 2` 的方式计算中间值,那么在 right 和 left 的值接近极限值的情况下,可能会导致计算出的中间值发生整型溢出,从而得到错误的结果。

为了避免这种情况,我们一般使用 `mid = left + (right - left) / 2` 的方式来计算中间值。这种方式可以保证计算过程中不会出现整型溢出的问题。

具体来说,`right - left` 是要查找区间的长度,而 `(right - left) / 2` 是区间长度的一半。因此,`left + (right - left) / 2` 就是区间的中间位置,这样可以避免整型溢出的问题。

在二分查找中,left 和 right 分别表示查找区间的左右边界。在最开始的时候,left 和 right 分别指向数组的第一个元素和最后一个元素,也就是说,查找区间的长度是 right - left + 1。

以长度为5的数组为例,最开始的时候,left 指向第一个元素,即下标为0的元素,right 指向最后一个元素,即下标为4的元素。此时,查找区间的长度为 4 - 0 + 1 = 5。

在二分查找的过程中,查找区间会不断缩小,left 和 right 也会随之改变。每次缩小查找区间时,都是将 left 或 right 移动一个位置,这样就保证了查找区间的长度不变。例如,在查找区间的左半部分时,需要将 right 移动到 mid - 1 的位置,此时查找区间的长度就变成了 mid - 1 - left + 1 = mid - left。

因此,可以通过 left 和 right 的差值来计算出查找区间的长度,即 right - left + 1。在最开始的时候,right 指向数组的最后一个元素,left 指向数组的第一个元素,所以 right - left + 1 就是数组的长度。

整型溢出

指的是在计算机中使用的整型数据类型(如int、long等)所能表示的范围之外进行运算时,结果会出现错误的情况。例如,32位有符号整型的范围是 -2147483648 到 2147483647,如果进行加法运算 2147483647 + 1,由于结果超出了该数据类型的范围,会发生整型溢出,结果会变成 -2147483648。

在二分查找中,如果使用 `mid = (right - left) / 2` 的方式计算中间值,当 right 和 left 的值接近整型数据类型的范围上限时,right - left 的值可能会超过数据类型所能表示的范围,从而导致计算结果错误。

例如,假设使用 int 类型进行二分查找,且数组长度为 2147483647。在最开始的时候,left = 0,right = 2147483646,此时 right - left 的值为 2147483646,没有超过 int 类型的范围。但是,在进行二分查找时,如果 left 和 right 的值都非常大,例如 left = 2147480000,right = 2147483646,此时 right - left 的值为 3646,超过了 int 类型的范围,从而导致计算结果错误。

为了避免这种情况,我们可以使用 `mid = left + (right - left) / 2` 的方式来计算中间值,这样可以保证计算过程中不会出现整型溢出的问题。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

二分查找--中间值取值原则 的相关文章

随机推荐

  • 吴恩达老师深度学习视频课笔记:逻辑回归公式推导及C++实现

    逻辑回归 Logistic Regression 是一个二分分类算法 逻辑回归的目标是最小化其预测与训练数据之间的误差 为了训练逻辑回归模型中的参数w和b 需要定义一个成本函数 cost function 成本函数 cost functio
  • Golang匿名结构体的使用

    一 结构体基础 结构体 struct 将多个不同类型的字段集中组成一种复合类型 按声明时的字段顺序初始化 type user struct name string age byte user user Tom 2 定义匿名结构体时没有 ty
  • 编程TRICK

    一 20200729 1 image和annots的数据类型要统一 如image annots设为np float32 在具体函数中 输入和输出的数据类型要保持一致 中间具体应用再改变数据类型 2 仿射变换可以用PIL的transform
  • Flowable入门系列文章113 - 进程实例 02

    1 激活或暂停流程实例 PUT运行时 process instances processInstanceId 表1 激活或暂停流程实例 URL参数 参数 需要 值 描述 processInstanceId 是 串 激活 挂起的流程实例的ID
  • 4.bio、request和request_queue

    通常一个bio对应上层传递给块层的I O请求 每个bio结构体实例及其包含的bvec iter bio vec结构体实例描述了该I O请求的开始扇区 数据方向 读还是写 数据放入的页 其定义如代码清单13 3所示 struct bvec i
  • Redis 分布式锁实现

    原文地址 http blog csdn net zhu tianwei article details 44927331 Redis是一个key value存储系统 和Memcached类似 但是解决了断电后数据完全丢失的情况 而且她支持更
  • 英文版线性代数笔记1

    是一个给自己期中复习做的笔记 第二课 关于矩阵 mxn的矩阵 是m行n列 先行后列 如A2 1 就是3 单位矩阵 关于向量 向量 有序有限的一列数字 定义 了解列向量 横向量 零向量 向量可以是一组解 关于单位向量 只有一个1 其他都是0
  • VC文件扩展名一览表

    VC文件扩展名一览表 2003 12 7 23 05 34 阅读589次 APS 存放二进制资源的中间文件 VC把当前资源文件转换成二进制格式 并存放在APS文件中 以加快资源装载速度 BMP 位图资源文件 BSC 浏览信息文件 由浏览信息
  • 西门子S7通信

    1 总体结构 1 1 西门子通信场景 在讨论更多的技术细节之前 首先我想简单介绍一下西门子通信场景的基本情况 当我谈到 S7协议 时 我指的是以太网S7通信 主要用于将PLC连接到 I PC站 PG PC PLC通信 不要将此与西门子设备使
  • okhttp源码分析

    Okhttp介绍 由square公司贡献的一个处理网络请求的开源项目 是目前Android使用最广泛的网络框架 从Android4 4开始HttpURLConnection的底层实现采用的是okhttp 项目地址 https github
  • 消息服务器 ws 高并发,HServer-JAVA: 基于Netty做的一个WebServer,同时集成MVC等相关快速开发功能的高并发服务器,做一些简单的应用分分钟搞定,同时性能报表...

    以下注解基本模拟Spring的功能 Bean 将Bean对象加入IOC容器中比如 按默名字加入IOC容器 Bean class TestService 指定名字加入容器 装配的时候就只能通过名字装配了 Bean testService cl
  • Element 修改el-table自带样式

    1 修改el table选中当前行高亮的样式 deep el table body tr current row gt td background color fff important 2 修改el table当前行的hover样式 de
  • 视觉SLAM漫谈

    视觉SLAM漫谈 1 前言 开始做SLAM 机器人同时定位与建图 研究已经近一年了 从一年级开始对这个方向产生兴趣 到现在为止 也算是对这个领域有了大致的了解 然而越了解 越觉得这个方向难度很大 总体来讲有以下几个原因 入门资料很少 虽然国
  • 22黑马QT笔记之事件全总结

    22黑马QT笔记之事件全总结 1 每个控件重写过滤器 event函数 各个事件处理函数都一样 都是先类中声明 类外定义 2 每个控件都可以重写事件过滤器 但是他一般写在窗口 安装时参数要求继承QObject嘛 event函数和各个事件处理函
  • Flutter状态管理Provider,简单上手

    学习Flutter一段时间了 偶然看到大家都说状态管理 多数人都是用redux 对于一个Android开发人员来说之前根本没接触过 于是开始了解redux 之后又了解闲鱼推出的fish redux 然后又看到Vadaski发表的一系列关于F
  • ChatBox安装--ChatGPT的桌面客户端

    ChatBox 是什么 是开源的 ChatGPT API OpenAI API 桌面客户端 Prompt 的调试与管理工具 支持 Windows Mac 和 Linux gt github地址 下载链接 支持的平台 Windows 请下载
  • 设置QFrame的背景图片并不影响其子控件的效果

    项目建立完成后 右键点你的项目 Add New gt QT Resource file 生成一个qrc文件 然后双击它 点add 然后Add Prefix 再Add file 完事之后build一下 在你的ui上点右键 gt Change
  • 选择软件外包公司需要注意哪些方面

    每个行业中不同公司的实力都是良莠不齐 特别是IT软件外包公司更是如此 当我们一旦将整个项目交付对方之后 项目的成败就全看软件外包公司的表现 风险极大 那么 我们该如何选择一家靠谱的深圳软件外包公司 选择软件外包公司需要注意哪些方面 北京木奇
  • 刷脸支付让城市真正迈入智能化数字化新阶段

    众所周知 每一次通信时代的变革都会催生一系列新兴事物的发展 比如3G时代的到来让越来越多国人开始了解互联网 4G时代的普及 让互联网产业得到了前所未有的发展空间 而5G时代的来临 将进一步推动数字化工作的进程刷脸支付正是如此 让城市真正迈入
  • 二分查找--中间值取值原则

    在数组总长度为奇数时 二分查找的中间值就是数组中间的那个元素 例如 对于长度为5的数组 中间元素的下标为2 在数组总长度为偶数时 二分查找的中间值有两个 可以取任意一个作为中间值 一种常用的方法是取靠左的那个中间值 例如 对于长度为6的数组