二分查找常规实现

使用二分查找有一个前提条件:要查找的数必须在一个有序数组里。在这个前提下,取中间位置数作为比较对象:

  • 若要查找的值和中间数相等,则查找成功。

  • 若小于中间数,则在中间位置的左半区继续查找。

  • 若大于中间数,则在中间位置的右半区继续查找。

不断重复上述过程,直到查找成功,或者查找区域变为 0,查找失败。

接下来通过具体例子来说明:

从数组 [5,8,15,17,25,30,34,39,45,52,60] 中查找元素 17 。

图解:

  1. 初始化 low = 0,high = len(s) - 1 = 10, middle = ( low + high ) // 2 = 5
    在这里插入图片描述
  2. s[middle] > 17, high = mid -1 = 4,middle = ( low + high ) // 2 = 2
    在这里插入图片描述
  3. s[middle] < 17, low = middle + 1 = 3, middle = ( low + high ) // 2 = 3
    在这里插入图片描述
  4. 此时 s[middle] = 17,查找结束。

代码实现:

def binary_search(arr, target):
	low, high = 0, len(arr) -1
	
	while low <= high:
		mid = low + (high - low) // 2
		if arr[mid] == target:
			return mid
		elif arr[mid] < target:
			low = mid + 1
		else:
			high = mid -1

注意事项:

  1. while 循环条件是 low <= high,而不是 low < high

    首先要明确的一点是,当前二分查找的区间是 [low, high]。每次在区间进行查找,找到目标值结束,查找成功;或者区间为 0 时结束,查找失败。当 low = high 时,[low, low] 的区间长度为 1,并不为空,这个时候结束循环会导致索引为 low 的元素没有被查找到。

  2. mid 取值

    mid 取值时,一般可能会使用 (low + high) // 2,但是当 low 和 high 都很大时,low + high 可能会超出整数类型的范围,导致溢出,从而使 mid 取值错误。所以,在二分查找算法中,更安全的做法是使用 low + (high - low) // 2 来计算中间索引 mid。

  3. low 和 high 取值

    以 low 来举例,low = mid + 1 而不是 low = mid,这是因为在 [low, high] 区间进行查找的过程中,已经确定下标为 mid 的元素不等于 target 的情况下,下一步需要查找的区间应该是 [mid + 1, high],因为 mid 已经比较过了。

时间复杂度:

使用 T(n) 表示 n 个元素的二分查找算法时间复杂度。

当 n = 1 时,需要一次比较来确认这个元素是不是目标值,T(n) = O(1)

当 n > 1,特定元素和中间位置元素比较,需要 O(1)时间,如果比较不成功,那么需要在前半部分或后半部分搜索,问题的规模缩小了一半,时间复杂度变为 T(n/2)。假设最差需要比较 x 次,此时 T(n) = T(n/2x) + xO(1)

最终区间的规模为 1,令 n/2x = 1,x = log2n,则 T(n) = T(1) + log2nO(1) = O(1) + log nO(1) = O(log n)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/928160.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

C++ 之弦上舞:string 类与多样字符串操作的优雅旋律

string 类的重要性及与 C 语言字符串对比 在 C 语言中&#xff0c;字符串是以 \0 结尾的字符集合&#xff0c;操作字符串需借助 C 标准库的 str 系列函数&#xff0c;但这些函数与字符串分离&#xff0c;不符合 OOP 思想&#xff0c;且底层空间管理易出错。而在 C 中&#xff0…

获取联通光猫的管理员密码

缘起&#xff1a;联通给免费更换了一个新的光猫&#xff0c;烽火的光路由&#xff0c;一个WAN口&#xff0c;4个LAN口&#xff0c;带USB接口&#xff0c;欣欣然接受。但是呢&#xff0c;发现以前的管理员密码CUAdmin不能用了。经过一系列查询&#xff0c;借助别人的经验&#x…

数组练习(非最终版)

作业1&#xff1a;使用二维数组输出杨辉三角 //杨辉三角 #include <stdio.h> #include <string.h> #include <stdlib.h> int main(int argc, const char *argv[]) {int i,j,n;scanf("%d",&n);int arr[n][n];for(i0;i<n;i){arr[i][0]1;arr[…

【MySQL 进阶之路】索引概述

第06章_索引 1.什么是索引 索引是存储引擎用于快速找到数据记录的一种数据结构&#xff0c;就好比一本教科书的目录部分&#xff0c;通过目录中找到对应文章的页码&#xff0c;便可快速定位到需要的文章。MySQL中也是一样的道理&#xff0c;进行数据查找时&#xff0c;首先查…

微积分复习笔记 Calculus Volume 2 - 3.3 Trigonometric Substitution

3.3 Trigonometric Substitution - Calculus Volume 2 | OpenStax

业财一体化新篇章:外贸ERP软件重塑业务流程

业财一体化的定义&#xff08;Definition&#xff09; FMS&#xff0c;即财务管理软件&#xff08;Financial Management Software&#xff09;&#xff0c;涵盖了用于管理公司财务的多种工具和系统&#xff0c;包括预算管理、账务处理、报表生成等功能。 ERP&#xff0c;即企…

Qt 信号与槽:UI设计的基础

Qt 的信号与槽机制是其最强大的功能之一&#xff0c;也是初学者理解 Qt 的第一步。它让对象之间的通信变得直观和高效。信号与槽类似于现实生活中的“呼叫和应答”模式&#xff1a;一个对象发出信号&#xff0c;另一个对象响应并执行动作。 什么是信号与槽&#xff1f; 信号与…

QT 左右 上下,拉伸 分配窗口大小

要的效果是以下&#xff1a; QT C 两个QWideget A B现在有放在一个窗口QWideget Test内&#xff0c;初始比例要2&#xff1a;8 ,现在我要 A B 两个窗口中间 当鼠标移到他中间时&#xff0c;有条线&#xff0c;可以左右移动来控件 A B 窗口所占的大小widgetB &#xff08;有 wi…

Linux 各个目录作用

刚毕业的时候学习Linux基础知识&#xff0c;发现了一份特别好的文档快乐的 Linux 命令行&#xff0c;翻译者是happypeter&#xff0c;作者当年也在慕课录制了react等前端相关的视频&#xff0c;通俗易懂&#xff0c;十分推荐 关于Linux的目录&#xff0c;多数博客已有详细介绍…

基于PyTorch框架的线性回归实现指南

目录 ​编辑 1. 线性回归基础 2. PyTorch环境搭建 3. 数据准备 4. 定义线性回归模型 5. 损失函数和优化器 6. 训练模型 7. 评估模型 8. 结论 线性回归是统计学和机器学习中最基本的预测模型之一&#xff0c;它试图找到输入特征和输出结果之间的线性关系。在深度学习框…

HYSPLIT下载及使用

准备工作 官网基础教程&#xff1a;https://www.ready.noaa.gov/documents/Tutorial/html/index.html 使用 参考&#xff1a;https://blog.csdn.net/liaohaibing/article/details/112788701 下载之前还需要Graphical Utilities&#xff1a;https://www.ready.noaa.gov/HYSPLI…

基于Java Springboot环境保护生活App且微信小程序

一、作品包含 源码数据库设计文档万字PPT全套环境和工具资源部署教程 二、项目技术 前端技术&#xff1a;Html、Css、Js、Vue、Element-ui 数据库&#xff1a;MySQL 后端技术&#xff1a;Java、Spring Boot、MyBatis 三、运行环境 开发工具&#xff1a;IDEA/eclipse 微信…

骨架行为识别-论文复现

✨✨ 欢迎大家来访Srlua的博文&#xff08;づ&#xffe3;3&#xffe3;&#xff09;づ╭❤&#xff5e;✨✨ &#x1f31f;&#x1f31f; 欢迎各位亲爱的读者&#xff0c;感谢你们抽出宝贵的时间来阅读我的文章。 我是Srlua小谢&#xff0c;在这里我会分享我的知识和经验。&am…

【PyTorch】torch.distributed.elastic.multiprocessing.errors.ChildFailedError:

报错说明 torch.distributed.elastic.multiprocessing.errors.ChildFailedError: 报错如图所示 报错分析 该报错是 torch 和 CUDA 版本不兼容导致。 &#xff08;一般N卡自带的CUDA版本与最新的torch版本相差较大&#xff09; 解决方案 1.查看自己的CUDA版本 # 查看自己的…

Kylin Server V10 下基于Kraft模式搭建Kafka集群

一、Kraft 模式与 ZooKeeper 模式简介 在Kafka 2.8 之前,Kafka 重度依赖 ZooKeeper 集群做元数据管理、Controller 的选举等(统称为共识服务);当ZooKeeper 集群性能发生抖动时,Kafka 的性能也会受到很大的影响。如下图所示: 在 Kafka 2.8 之后,引入了基于 Raft …

ceph手动部署

ceph手动部署 一、 节点规划 主机名IP地址角色ceph01.example.com172.18.0.10/24mon、mgr、osd、mds、rgwceph02.example.com172.18.0.20/24mon、mgr、osd、mds、rgwceph03.example.com172.18.0.30/24mon、mgr、osd、mds、rgw 操作系统版本&#xff1a; Rocky Linux release …

记录vite关于tailwindcss4.0-bate4出现margin[m-*]、padding[p-*]无法生效的问题。

环境如下&#xff1a; vite:5.4.10 tailwindcss: 4.0.0-beta.4 tailwindcss/vite: 4.0.0-beta.4 4.0默认的样式优先级比较低 如果使用了一些reset的css文件 那么很多样式会失效 例如&#xff1a;reset.css中 html, body, ul, li, h1, h2, h3, h4, h5, h6, dl, dt, dd, ol, i…

AcWing 841. 字符串哈希

字符串哈希 一种将任意长度的字符串转换为固定长度数值&#xff08;通常是整数&#xff09;的过程。全称字符串前缀哈希法&#xff0c;把字符串变成一个p进制数字&#xff08;哈希值&#xff09;&#xff0c;实现不同的字符串映射到不同的数字。 对形如 X1X2X3⋯Xn−1Xn 的字…

物联网接入网关的数据安全和高效传输详解

物联网接入网关&#xff0c;作为连接物联网终端设备与云端或本地服务器的关键环节&#xff0c;不仅负责数据的汇聚与转发&#xff0c;更需确保数据在传输过程中的安全无虞与高效流畅。 一、数据安全&#xff1a;构筑坚实防线 1. 加密技术的应用 天拓四方物联网接入网关内置了…

遇到问题:hive中的数据库和sparksql 操作的数据库不是同一个。

遇到的问题&#xff1a; 1、hive中的数据库和sparksql 操作的数据库不同步。 观察上面的数据库看是否同步 &#xff01;&#xff01;&#xff01; 2、查询服务器中MySQL中hive的数据库&#xff0c;发现创建的位置没有在hdfs上&#xff0c;而是在本地。 这个错误产生的原因是&…