关于二分法的理解(以JS为例)

算法介绍

基本概念

二分查找算法,又称折半查找算法,是一种在有序数组中查找特定元素的高效方法。它的核心思想是将数组分成两半,然后根据目标值与中间元素的比较结果来决定是继续在左半部分还是右半部分进行搜索。

工作原理
  1. 初始化:设置两个指针,一个指向数组的起始位置(low),另一个指向数组的结束位置(high)。
  2. 循环:当low指针小于或等于high指针时,执行以下步骤:
    • 计算中间位置(mid),通常使用(low + high) / 2
    • 比较中间元素(arr[mid])与目标值。
    • 如果中间元素等于目标值,返回中间位置,查找成功。
    • 如果中间元素大于目标值,说明目标值位于数组的左半部分,更新high指针为mid - 1。
    • 如果中间元素小于目标值,说明目标值位于数组的右半部分,更新low指针为mid + 1。
  3. 结束条件:当low指针大于high指针时,循环结束,表示目标值不在数组中。
时间复杂度

二分查找算法的时间复杂度为O(log n),其中n是数组的长度。这是因为每次迭代都会将搜索范围减半,因此需要对数级次迭代才能找到目标值或确定它不存在。

空间复杂度

二分查找算法的空间复杂度为O(1),因为它只需要常数级别的额外空间来存储索引。

适用条件

二分查找算法要求数组必须是有序的。如果数组是无序的,那么在应用二分查找之前,需要先对其进行排序,这将增加算法的总体时间复杂度。

优点
  • 高效:对于大型数据集,二分查找比线性搜索更快。
  • 简单:算法逻辑清晰,易于理解和实现。
局限性
  • 需要有序数组:如果数组无序,需要先排序,这可能会影响性能。
  • 不适用于动态数据集:如果数组经常变动,维护其有序状态可能会很复杂。

通俗讲解

二分查找算法:就像在书架上找书

想象一下,你在一个按字母顺序排列的书架上找一本特定的书。书架上有成千上万本书,但它们都是有序排列的。二分查找算法就像是你快速找到这本书的方法。

  1. 开始搜索:你站在书架的中间,看看那里的书是不是你要找的。
  2. 缩小范围:如果那本书的书名比你要找的书的书名要早,你就会往右边看。如果晚,就往左边看。
  3. 重复过程:不管你往左还是往右,你都会再次站在新的中间位置,重复刚才的比较过程。
  4. 直到找到:这个过程会一直重复,直到你找到那本书,或者确定书架上没有这本书。

为什么它这么快?

  • 分而治之:每次你只需要看一半的书,而不是全部。这就像是你每次翻页都跳过一半的内容,大大加快了查找速度。
  • 对数级速度:因为每次你都在减少一半的搜索范围,所以查找的速度非常快。这就是为什么我们说它的时间复杂度是O(log n),n是书的数量。想象一下,1000本书,你可能只需要10次就能找到,而不是1000次。

但是,有个前提

  • 书架要有序:这个方法只有在书架上的书籍是有序排列的情况下才有效。如果书架乱七八糟,这个方法就不管用了。

用在计算机上

在计算机科学中,二分查找算法用在有序数组中查找特定元素。计算机就像你一样,通过比较中间的元素和它要查找的目标值,然后决定是继续在数组的哪一半查找,直到找到目标或者确定它不存在。

总结

二分查找算法就像是在有序的书架上快速找到一本书的技巧。它简单、高效,但需要一个有序的环境。下次当你需要在大量有序的数据中快速找到某个元素时,不妨想想这个算法,它可能会帮你节省很多时间。

核心思想

  1. 有序性:二分查找算法的基础是数据的有序性。只有当数据集(如数组)是有序的,算法才能有效工作。

  2. 中间点:算法通过计算数组中间的索引来找到一个参考点,即中间元素。

  3. 比较与决策:将目标值与中间元素进行比较。根据比较结果,算法决定是继续在当前搜索区间的左侧还是右侧进行查找。

  4. 区间减半:无论比较结果如何,都会将搜索范围缩小到原来的一半。如果目标值小于中间元素,搜索区间将变为左侧一半;如果目标值大于中间元素,搜索区间将变为右侧一半。

  5. 迭代:这个过程会不断重复,每次迭代都会更新搜索区间的边界,直到找到目标值或搜索区间为空。

  6. 效率:通过每次迭代将搜索区间减半,二分查找算法能够非常快速地定位元素或确定元素不存在,其效率远高于线性搜索。

  7. 终止条件:搜索终止的条件有两个:找到目标值或搜索区间为空(即low指针大于high指针)。

  8. 简单性:算法的逻辑简单明了,易于实现和理解。

  9. 普适性:虽然二分查找算法在数组上最为常见,但其核心思想可以应用于其他有序数据结构的搜索问题。

  10. 局限性:算法的局限性在于它要求数据必须是事先排序的。如果数据动态变化,需要重新排序,这可能会影响算法的效率。

具体实现(以LeeCode 704题为例)

题目:

答案:

你学废了吗

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

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

相关文章

Vue3+Vite报错:vite忽略.vue扩展名 Failed to resolve import ..... Does the file exist?

Vue3Vite报错:vite忽略.vue扩展名 Failed to resolve import … Does the file exist? 先看报错: 分析原因 原因是我们没有写后缀名 建议你在你的vite.config.js中加上如下配置 import { defineConfig } from "vite"; import vue from &qu…

股指期货功能

其金融期货的本质,决定了股指期货具有以下几方面特点: (1)交割方式为现金交割; (2)股指期货的持有成本较低; (3)股指期货的保证金率较低,杠杆性…

R 初级教程之一

IT的发展目前已经相当的内卷,到处都在说24年是将来4年最难的一年!确实是,眼下各大厂商都在疯狂的裁员砍掉不营利的业务,收紧业务,不再盲目的扩张。小公司更是水深火热,无以言表。近期有个医院联系让使用R给…

Zombie Animations Set

僵尸动画合集,包括成对攻击/抓取、各种移动方式、爬行、击中反应、死亡动画等。 生产说明 动画总数:99(包括22个位置变化) 配对动画:36 攻击次数:6次 爬网:9 命中反应:6 空转:14 行程2 跑步次数:9次 短跑:2 匝数:3 步行次数:12次 免责声明 任何游戏玩法蓝图都不包…

【计算机毕业设计】240基于微信小程序的校园综合服务平台

🙊作者简介:拥有多年开发工作经验,分享技术代码帮助学生学习,独立完成自己的项目或者毕业设计。 代码可以私聊博主获取。🌹赠送计算机毕业设计600个选题excel文件,帮助大学选题。赠送开题报告模板&#xff…

禁止methtype联网

mathtype断网_如何禁止mathtype联网-CSDN博客https://blog.csdn.net/qq_41060221/article/details/128144783

StarNet实战:使用StarNet实现图像分类任务(二)

文章目录 训练部分导入项目使用的库设置随机因子设置全局参数图像预处理与增强读取数据设置Loss设置模型设置优化器和学习率调整策略设置混合精度,DP多卡,EMA定义训练和验证函数训练函数验证函数调用训练和验证方法 运行以及结果查看测试完整的代码 在上…

微服务开发与实战Day09 - Elasticsearch

一、DSL查询 Elasticsearch提供了DSL(Domain Specific Language)查询,就是以JSON格式来定义查询条件。类似这样: DSL查询可以分为两大类: 叶子查询(Leaf query clauses):一般是在特…

局域网内怎么访问另一台电脑?(2种方法)

案例:需要在局域网内远程电脑 “当我使用笔记本电脑时,有时需要获取保存在台式机上的文件,而两者都连接在同一个局域网上。我的台式机使用的是Windows 10企业版,而笔记本电脑则是Windows 10专业版。我想知道是否可以通过网络远程…

JVM 性能分析——jdk 自带命令分析工具(jps/jstat/jinfo/jmap/jhat/jstack)

文章目录 jps(Java Process Status):查看正在运行的Java进程jstat(JVM Statistics Monitoring Tool):查看 JVM 的统计信息jinfo(Configuration Info for Java):实时查看和…

zip加密txt文件后,暴力破解时会有多个解密密码可以打开的疑问??

最近在做一个关于zip压缩文件解密的测试,发现通过暴力解密时,会有多个解密密码可以打开,非常疑惑,这里做个问题,希望能有大佬解惑。 1、首先在本地创建一个113449.txt的文件,然后右键txt文件选择压缩&…

AI赋能软件测试

AI赋能软件测试 AI赋能软件测试软件测试分类软件质量模型:用来衡量软件质量的维度AI赋能软件测试 随着AI时代的到来,如何轻松掌握软件测试新趋势,将AI技术应用于软件测试行业,提高测试速度与测试效率~~ 传智星云AI助手:https://nebula.itcast.cn tips:各种AI工具应有尽有…

图像处理方向信息

前言 Exif 规范 定义了方向标签,用于指示相机相对于所捕获场景的方向。相机可以使用该标签通过方向传感器自动指示方向,也可以让用户通过菜单开关手动指示方向,而无需实际转换图像数据本身。 在图像处理过程中,若是原图文件包含…

jeecg快速启动(附带本地运行可用版本下载)

版本整理(windows x64位): redis:3.0.504 MYSQL:5.7 Maven:3.9.4(setting文件可下载) Nodejs:v16.20.2(建议不要安装默认路径下,如已安装在c盘,运行yarn报…

MySQL之优化服务器设置(五)

优化服务器设置 高级InnoDB设置 innodb_old_blocks_time InnoDB有两段缓冲池LRU(最近最少使用)链表,设计目的是防止换出长期很多次的页面。像mysqldump产生的这种一次性的(大)查询,通常会读取页面到缓冲池的LRU列表,从中读取需要的行&…

安装wsl

安装wsl 先决条件: 打开控制面板->选择程序与功能->选择启动或关闭windows功能,将以下框选的勾选上 二、到Mircosoft store下载Ubuntu 三、如果以上都勾选了还报以下错误 注册表错误 0x8007019e Error code: Wsl/CallMsi/REGDB_E_CLASSNOTREG…

机器学习周报第46周

目录 摘要Abstract一、文献阅读1.1 摘要1.2 研究背景1.3 论文方法1.4 模块分析1.5 网络规格1.6 高效的端到端对象检测1.7 mobile former模块代码 目录 摘要Abstract一、文献阅读1.1 摘要1.2 研究背景1.3 论文方法1.4 模块分析1.5 网络规格1.6 高效的端到端对象检测1.7 mobile f…

9. 文本三剑客之awk

文章目录 9.1 什么是awk9.2 awk命令格式9.3 awk执行流程9.4 行与列9.4.1 取行9.4.2 取列 9.1 什么是awk 虽然sed编辑器是非常方便自动修改文本文件的工具,但其也有自身的限制。通常你需要一个用来处理文件中的数据的更高级工具,它能提供一个类编程环境来…

JVM-GC-什么是垃圾

JVM-GC-什么是垃圾 前言 所谓垃圾其实是指,内存中没用的数据;没有任何引用指向这块内存,或者没有任何指针指向这块内存。没有的数据应该被清除,垃圾的处理其实是内存管理问题。 JVM虽然不直接遵循冯诺依曼计算机体系架构&#…

SAP HCM 员工供应商过账详解 财务角度理解员工供应商过账

导读 INTRODUCTION 员工供应商:在某些情况下,特别是在大型组织或集团公司中,员工可能同时扮演着供应商的角色,为组织内部的其他部门或子公司提供产品或服务。例如,一个技术部门的员工可能为销售部门提供技术支持或定制开发服务。,还有一种,就是员工在公司挂账的欠款,每…