Deprecated: imwpcache\f884414bce24ee67f\f73723ec7b1919fa5::__construct(): Implicitly marking parameter $YECBGYFECGEAFWHA as nullable is deprecated, the explicit nullable type must be used instead in /www/wwwroot/www.chuangxiangniao.com/wp-content/plugins/imwpcache-dist/build/f884414bce24ee67ff73723ec7b1919fa5.php on line 2

Deprecated: imwpcache\f884414bce24ee67f\f73723ec7b1919fa5::__construct(): Implicitly marking parameter $BBWFDDBHHYHDXXAB as nullable is deprecated, the explicit nullable type must be used instead in /www/wwwroot/www.chuangxiangniao.com/wp-content/plugins/imwpcache-dist/build/f884414bce24ee67ff73723ec7b1919fa5.php on line 2
javascript数组如何实现二分查找_创想鸟

javascript数组如何实现二分查找

javascript数组实现二分查找的核心是利用有序性不断减半搜索区间,1. 实现时需确保数组已排序,否则结果不正确;2. 使用left

javascript数组如何实现二分查找

JavaScript数组实现二分查找,核心在于利用数组的有序性,通过不断将搜索区间减半来快速定位目标元素。这个过程需要数组预先排好序,否则二分查找将无法给出正确结果。

javascript数组如何实现二分查找

解决方案

/** * 在一个已排序的JavaScript数组中执行二分查找。 * * @param {Array} arr - 必须是已排序的数字数组。 * @param {number} target - 要查找的目标值。 * @returns {number} 如果找到目标值,返回其在数组中的索引;否则返回 -1。 */function binarySearch(arr, target) {    let left = 0;    let right = arr.length - 1;    // 循环条件 left <= right 是关键,确保在只有1个元素时也能正确处理    while (left >> 1 比 Math.floor((left + right) / 2) 在某些语言中能避免溢出,        // 在JS里更多是习惯或微优化,Math.floor也完全没问题。        const mid = Math.floor((left + right) / 2);        // 检查中间元素是否是目标值        if (arr[mid] === target) {            return mid; // 找到目标,返回索引        }        // 如果中间元素小于目标值,说明目标在右半部分        if (arr[mid] < target) {            left = mid + 1; // 移动左边界到 mid 的右边        }        // 如果中间元素大于目标值,说明目标在左半部分        else {            right = mid - 1; // 移动右边界到 mid 的左边        }    }    // 循环结束仍未找到,说明目标不在数组中    return -1;}// 示例用法:const sortedNumbers = [1, 5, 8, 12, 13, 16, 20, 25, 30, 35, 40];console.log("查找 13:", binarySearch(sortedNumbers, 13)); // 期望输出: 4console.log("查找 7:", binarySearch(sortedNumbers, 7));   // 期望输出: -1console.log("查找 1:", binarySearch(sortedNumbers, 1));   // 期望输出: 0console.log("查找 40:", binarySearch(sortedNumbers, 40)); // 期望输出: 10console.log("查找 0:", binarySearch(sortedNumbers, 0));   // 期望输出: -1console.log("查找 45:", binarySearch(sortedNumbers, 45)); // 期望输出: -1

为什么JavaScript内置方法没有直接提供二分查找?

这确实是个有意思的问题。当我第一次接触到

Array.prototype.indexOf

Array.prototype.findIndex

时,我就在想,为什么不直接给我一个

binarySearch

呢?后来慢慢体会到,这背后其实是设计哲学和实际应用场景的考量。

首先,JavaScript数组天生是动态的,而且非常灵活,它不强制要求数组元素必须有序。而二分查找的核心前提就是数组必须有序。如果数组无序,你强行用二分查找,结果会是灾难性的,它会给你一个完全错误甚至误导性的结果。内置方法通常追求的是通用性和鲁棒性,一个需要特定前置条件的算法,如果直接内置,可能会让很多初学者掉坑里。

立即学习“Java免费学习笔记(深入)”;

javascript数组如何实现二分查找

其次,对于很多小规模的数组操作,线性查找(

indexOf

这类)的性能开销其实并不大,甚至在某些情况下,由于CPU缓存和分支预测等底层优化,它可能比你手动实现一个二分查找还要快一点点,虽然理论复杂度更高。更何况,如果你为了使用二分查找而不得不先对一个无序数组进行排序(

sort()

方法),那么这个排序本身的复杂度通常是 O(N log N),远高于线性查找的 O(N) 和二分查找的 O(log N)。这意味着,如果你只查找一次,先排序再二分查找的总体成本,可能比直接线性查找还要高。

所以,JavaScript的设计者们可能觉得,既然二分查找的实现并不复杂,而且它有明确的使用场景(数据已排序且需要多次查找),那么把它作为一个需要开发者根据具体需求自行实现的算法,而不是一个内置方法,反而更合理。这样既避免了误用,也让开发者能更清晰地理解算法的适用范围。

javascript数组如何实现二分查找

实现二分查找时常见的陷阱与性能考量

在实际编写二分查找时,我踩过不少坑,也对它的性能有了更深的理解。

最大的陷阱,毫无疑问就是数组未排序。这个错误太常见了,有时候数据来源不是你直接控制的,或者某个环节出了问题,数组就乱了。一旦数据无序,二分查找就会变成一个“伪随机数生成器”,你根本不知道它会返回什么。所以,在调用二分查找前,务必确认你的数组是严格有序的。如果不是,你得先用

arr.sort()

处理一下,但记得,

sort()

默认是按字符串排序的,数字数组需要提供一个比较函数,比如

arr.sort((a, b) => a - b)

另一个常见的“小”陷阱是边界条件的判断

while (left <= right)

还是

while (left < right)

left = mid + 1

还是

left = mid

?这些细节决定了算法能否正确处理数组的第一个元素、最后一个元素,以及目标值不存在的情况。我个人偏爱

left <= right

的写法,因为它能更直观地覆盖到

left

right

指向同一个元素时的场景。

关于

mid

的计算,

Math.floor((left + right) / 2)

是最常见的。在一些其他语言中,

left + right

可能会导致整数溢出,所以会有

left + (right - left) / 2

这种写法。但在JavaScript中,数字都是双精度浮点数,溢出不是问题,所以

(left + right) / 2

然后

Math.floor

是完全安全的。不过,使用位运算

(left + right) >>> 1

确实能保证结果是整数,而且在某些JS引擎中可能略有性能优势,但对于大多数应用来说,这点差异可以忽略不计。

从性能角度看,二分查找的时间复杂度是 O(log N)。这意味着即使你的数组有数百万甚至数十亿个元素,查找也只需要非常少的步骤。比如,一个包含10亿个元素的数组,最多也就需要30次左右的比较(因为 2^30 约等于 10^9)。这与线性查找的 O(N) 形成了鲜明对比,后者可能需要10亿次比较。因此,对于大型数据集且需要频繁查找的场景,二分查找是性能的保证。

但正如前面提到的,这个 O(log N) 的优势是建立在数组已排序的基础上的。如果每次查找前都需要排序,那么总成本就会被排序的 O(N log N) 支配,二分查找的 O(log N) 就显得微不足道了。所以,二分查找最适合的场景是:数据只排序一次(或者本身就保持有序),然后进行多次查找。

如何将二分查找应用于更复杂的数据结构或场景?

二分查找的核心思想——“分而治之”,通过不断减半搜索空间来逼近目标——远不止应用于简单的数字数组。它是一种非常强大的思维模式,可以推广到许多看似复杂的问题。

比如说,你有一个包含对象的数组,每个对象都有一个

id

属性,并且这个数组是按

id

升序排列的。你现在想根据

id

查找某个对象。这时,二分查找依然适用,只是你的比较逻辑需要变一下:不再是

arr[mid] === target

,而是

arr[mid].id === targetId

。同理,

arr[mid].id < targetId

arr[mid].id > targetId

来调整

left

right

。这种场景在实际业务中非常常见,比如查找用户、商品等。

再进一步,有时候你可能需要找到目标值的第一个或最后一个出现位置。标准的二分查找只会返回它找到的任何一个匹配项的索引。如果你想找第一个,当

arr[mid] === target

时,你不能直接返回,而是记录下这个

mid

作为潜在答案,然后继续在左半部分搜索(

right = mid - 1

),看是否还有更早的匹配。同理,找最后一个出现位置时,则继续在右半部分搜索(

left = mid + 1

)。这稍微修改了循环内部的逻辑,但核心的二分思想不变。

甚至在一些非传统的“数组”上,二分查找的理念也能发光发热。比如,在二叉搜索树(Binary Search Tree, BST)中查找元素,其查找过程本质上就是一种二分查找:从根节点开始,如果目标值小于当前节点,就去左子树找;如果大于,就去右子树找。这和数组的二分查找逻辑异曲同工,只是数据结构从线性变成了树形。

更抽象一点,当你在解决一个问题,发现问题的解空间(所有可能的答案)是单调的(比如,某个属性随着某个参数的增大而增大或减小),并且你可以通过检查某个中间点来判断解在左半部分还是右半部分时,你就可以考虑使用二分查找来优化你的搜索过程。这在算法竞赛中非常常见,比如“在给定范围内寻找满足某个条件的最小值/最大值”这类问题,常常可以通过在答案的取值范围上进行二分查找来解决。

所以,二分查找不仅仅是一个算法,它更是一种解决问题的思维模式,一种高效利用有序性来缩小搜索范围的策略。掌握了它,你就能在很多地方找到它的影子,并将其灵活运用。

以上就是javascript数组如何实现二分查找的详细内容,更多请关注创想鸟其它相关文章!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 chuangxiangniao@163.com 举报,一经查实,本站将立刻删除。
发布者:程序猿,转转请注明出处:https://www.chuangxiangniao.com/p/1514804.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
JS如何实现斐波那契数列?递归和迭代比较
上一篇 2025年12月20日 08:42:04
js 如何使用toString将数组转为字符串
下一篇 2025年12月20日 08:42:14

相关推荐

  • MySQL全文搜索引擎集成方案_提升文本数据搜索能力的实用指南

    MySQL全文搜索引擎集成方案_提升文本数据搜索能力的实用指南MySQL全文搜索引擎集成方案_提升文本数据搜索能力的实用指南MySQL全文搜索引擎集成方案_提升文本数据搜索能力的实用指南MySQL全文搜索引擎集成方案_提升文本数据搜索能力的实用指南

    mysql原生全文搜索功能存在明显局限,需结合外部搜索引擎才能满足复杂需求。1. mysql全文搜索适用于小数据量、简单查询场景,但分词能力弱,尤其对中文支持差,查询功能有限,无法实现模糊查询、纠错等高级功能,且性能随数据量增长显著下降。2. 外部搜索引擎如elasticsearch(es)和sph…

    2026年9月21日 用户投稿
    000
  • 一周学会蝴蝶号无人直播的完整课程计划推荐

    一周学会蝴蝶号无人直播的完整课程计划推荐一周学会蝴蝶号无人直播的完整课程计划推荐一周学会蝴蝶号无人直播的完整课程计划推荐一周学会蝴蝶号无人直播的完整课程计划推荐

    掌握“蝴蝶号”无人直播的核心要义,一周内可搭建初步系统并具备独立操作能力。1.第一天厘清概念并完成基础环境搭建;2.第二天熟悉obs基础操作与场景构建;3.第三天准备高质量内容素材并确定风格;4.第四天设置自动化逻辑与推流配置;5.第五天处理互动机制及常见问题;6.第六天进行首次正式直播并复盘;7.…

    2026年9月21日 用户投稿
    100
  • PHP/MySQL:高效合并订单商品并按日期分组显示

    本教程将指导如何在PHP/MySQL应用中,将同一日期的订单商品合并显示在同一行,以提高数据展示的清晰度。核心解决方案是利用MySQL的GROUP_CONCAT函数在数据库层面进行高效聚合,避免复杂的PHP逻辑处理,从而简化代码并优化性能。 订单数据展示的常见挑战 在开发在线购物平台时,通常需要向用…

    2026年9月21日
    100
  • VSCode怎么启动Layui项目_VSCode运行Layui前端框架项目教程

    必须使用本地服务器运行Layui项目,因为直接打开HTML文件通过file://协议会受浏览器安全限制,导致AJAX、跨域等功能异常,Layui组件无法正常加载;推荐安装Node.js后使用npm全局安装http-server,通过命令行启动服务,或在VSCode中安装Live Server插件,右…

    2026年9月21日
    000
  • 俄罗斯Яндекс账号登录入口 Yandex电脑版官方网站登录

    答案是https://www.yandex.com/。该网站提供搜索、地图、新闻、翻译等服务,界面简洁,支持个性化设置与账户同步,并拥有邮箱、云存储及丰富的应用生态。 1、立即进入“☞☞☞☞点击俄罗斯yandex搜索引擎入口☜☜☜☜”; 2、立即进入“☞☞☞☞点击快速获取Yandex免登录官网链接☜…

    2026年9月21日
    000
  • 谷歌浏览器官方主站入口 最新Chrome在线登录页面

    谷歌浏览器官方主站入口是https://www.google.com,该页面具备界面简洁、操作流畅、集成化服务入口和个性化推荐等特点,支持多设备访问且无广告干扰。 谷歌浏览器官方主站入口在哪里?这是不少网友都关注的,接下来由PHP小编为大家带来谷歌浏览器最新Chrome在线登录页面相关信息,感兴趣的…

    2026年9月21日
    000
  • 如何用PyTorch训练AI大模型?构建高效神经网络的完整教程

    如何用PyTorch训练AI大模型?构建高效神经网络的完整教程如何用PyTorch训练AI大模型?构建高效神经网络的完整教程如何用PyTorch训练AI大模型?构建高效神经网络的完整教程如何用PyTorch训练AI大模型?构建高效神经网络的完整教程

    PyTorch大模型训练需综合运用分布式训练、内存优化与高效计算策略。首先采用DistributedDataParallel实现多GPU并行,配合DistributedSampler确保数据均衡;通过混合精度训练、梯度累积和激活检查点缓解显存压力;使用torch.compile优化模型计算效率;选择…

    2026年9月21日 用户投稿
    100
  • 鸣潮2.7嘉贝莉娜隐藏成就该怎么达成-鸣潮2.7嘉贝莉娜隐藏成就达成条件一览

    鸣潮2.7嘉贝莉娜隐藏成就该怎么达成-鸣潮2.7嘉贝莉娜隐藏成就达成条件一览鸣潮2.7嘉贝莉娜隐藏成就该怎么达成-鸣潮2.7嘉贝莉娜隐藏成就达成条件一览鸣潮2.7嘉贝莉娜隐藏成就该怎么达成-鸣潮2.7嘉贝莉娜隐藏成就达成条件一览鸣潮2.7嘉贝莉娜隐藏成就该怎么达成-鸣潮2.7嘉贝莉娜隐藏成就达成条件一览

    在《鸣潮》2.7版本中,每位角色都设有专属的隐藏成就与趣味彩蛋。其中,嘉贝莉娜相关的隐藏成就“再会,清醒的猎人”需要玩家满足特定的时间与地点条件方可触发。以下是该成就的详细达成方法汇总。 鸣潮2.7嘉贝莉娜隐藏成就触发条件全解析——地点一: 1、传送到黎那汐塔区域的【烈日酒馆】。 2、进入酒馆后,朝…

    2026年9月21日 用户投稿
    000
  • 怎么全选VSCode多个光标_VSCode多光标操作与批量选择文本教程

    VSCode中高效创建多光标的方法包括:Alt+Click手动添加光标,适用于不规则位置;Ctrl+Alt+方向键垂直添加光标,适合连续多行操作;Ctrl+D逐个选择匹配项,精准控制选择范围;Ctrl+Shift+L一次性选择所有匹配项,实现全局批量修改。结合查找替换和列选择模式可进一步提升编辑效率…

    2026年9月21日
    100
  • Spring Boot异常处理:为何需要自定义异常而非仅依赖HTTP状态码

    在Spring Boot应用中,自定义异常提供了比单一HTTP状态码更丰富的错误上下文,能够更精确地传达问题根源。这种细粒度的异常处理不仅提升了代码的可读性和可维护性,也极大地改善了用户体验,使客户端能够基于具体错误类型做出智能响应,而非仅仅接收到一个模糊的状态码。 为什么需要自定义异常? 在构建r…

    2026年9月21日
    200
  • CyberLinkMediaSuite如何制作AI视频?多功能工具快速剪辑的方法

    CyberLinkMediaSuite如何制作AI视频?多功能工具快速剪辑的方法CyberLinkMediaSuite如何制作AI视频?多功能工具快速剪辑的方法CyberLinkMediaSuite如何制作AI视频?多功能工具快速剪辑的方法CyberLinkMediaSuite如何制作AI视频?多功能工具快速剪辑的方法

    答案:CyberLink MediaSuite(核心为PowerDirector)通过AI艺术风格转换、智能对象选取、AI天空替换、音频降噪与运动追踪等功能,显著提升视频制作效率与创意表现。结合模板应用、快捷键操作、媒体库管理及代理编辑等实战技巧,可实现快速剪辑与专业输出,适用于Vlog创作、教育视…

    2026年9月21日 用户投稿
    300
  • 百家号视频怎么隐藏?百家号怎么设置仅自己可见

    随着短视频平台的快速发展,其已成为人们获取资讯和休闲娱乐的重要方式。作为国内知名的自媒体平台之一,百家号吸引了大量用户。然而,在享受便捷的同时,隐私安全问题也日益突出。本文将介绍百家号视频隐藏的方法,帮助用户更好地保护个人内容,维护隐私安全。 一、百家号视频隐藏方法 设置隐私权限 在百家号后台,用户…

    2026年9月21日
    200
  • VSCode怎么改环境_VSCode切换Python/Node等多版本环境教程

    切换VSCode环境需先安装对应语言扩展,再通过命令面板选择解释器或使用nvm切换Node版本,配合虚拟环境或launch.json配置确保运行和调试时使用正确版本,可通过终端命令验证环境,若失效可检查缓存、扩展冲突或权限问题。 VSCode改环境,其实就是让VSCode知道你想用哪个版本的Pyth…

    2026年9月21日
    100
  • Sublime开发MySQL存储过程教程实战_封装重复逻辑减少前端负担

    Sublime开发MySQL存储过程教程实战_封装重复逻辑减少前端负担Sublime开发MySQL存储过程教程实战_封装重复逻辑减少前端负担Sublime开发MySQL存储过程教程实战_封装重复逻辑减少前端负担Sublime开发MySQL存储过程教程实战_封装重复逻辑减少前端负担

    在web开发中使用mysql存储过程能有效封装逻辑并减少前端负担,本文介绍了其优势、环境配置及实战技巧。一、存储过程的优势包括减少网络传输、提高性能、统一业务逻辑;二、sublime text配置步骤为安装package control、sublimerepl插件、sql语法高亮插件,并建议新建.s…

    2026年9月21日 用户投稿
    900
  • 小红书从哪里看私信记录?私信记录如何清理?

    在小红书上与朋友或喜欢的博主互动时,私信是必不可少的沟通方式。不少新手用户常常困惑于如何查找过往的聊天内容。本文将为你详细说明查看私信记录的具体步骤,并分享几种实用的清理方法,帮助你轻松管理私信箱,让对话界面更清爽。 一、如何找到小红书的私信记录? 查看私信的操作非常直观,只需几个简单步骤即可完成。…

    2026年9月21日
    000
  • 梦幻号虚拟主播电商运营宝典(附新手教程+配套工具清单)

    虚拟主播电商的核心在于“内容驱动销售,人设凝聚用户”,要让“梦幻号”真正动起来并实现带货,必须先赋予其鲜明的人设,包括清晰的定位标签(如美食家、科技宅)、独特的人格魅力(性格、口头禅、小缺点)和与产品的强关联性,使其具备辨识度和故事感,从而建立用户信任;接着通过obs studio、vtube st…

    2026年9月21日
    100
  • 软删除(Soft Delete)的实现与恢复逻辑

    使用软删除的原因是它允许数据恢复和保持数据完整性。1) 软删除通过标记数据为已删除而非实际删除,提供了数据恢复的可能性。2) 它保持数据的历史记录,确保数据完整性。实现软删除通常在数据库中添加字段如is_deleted或deleted_at,恢复数据时重置这些字段。 软删除(Soft Delete)…

    2026年9月21日
    100
  • 小红书零基础赚钱攻略(精准选题+涨粉秘籍+账号运营+高转化变现方法)

    找到自己真正擅长或有热情的领域,结合用户需求和竞争情况确定细分赛道;2. 通过优质内容、高互动数据、精准关键词和话题标签提升曝光;3. 利用品牌合作、带货佣金、知识付费等方式实现变现,核心是建立在信任基础上的持续价值输出,最终将流量转化为实际收益。 小红书零基础赚钱,核心在于找到自己的定位,持续输出…

    2026年9月21日
    100
  • MySQL缓存机制对性能提升的作用_MySQL缓存配置及调优方案

    MySQL缓存机制对性能提升的作用_MySQL缓存配置及调优方案MySQL缓存机制对性能提升的作用_MySQL缓存配置及调优方案MySQL缓存机制对性能提升的作用_MySQL缓存配置及调优方案MySQL缓存机制对性能提升的作用_MySQL缓存配置及调优方案

    mysql的缓存机制主要包括innodb缓冲池、查询缓存和操作系统文件系统缓存等,其中innodb缓冲池是性能优化的核心。1. innodb缓冲池缓存表数据和索引页,减少磁盘i/o,提升读写效率;2. 查询缓存因失效频繁及锁竞争问题,在高并发场景下易成瓶颈,已在mysql 8.0中移除;3. 操作系…

    2026年9月21日 用户投稿
    200
  • PHP 数组值比较与嵌套数组过滤教程

    本教程详细讲解如何在 PHP 中比较一个简单数组与一个复杂嵌套数组,并根据特定条件(如文件名匹配)过滤嵌套数组中的所有相关子数组。我们将通过识别非匹配项的索引,然后从所有子数组中移除这些项并重新索引,实现精确的数据筛选。 问题背景 在 php 开发中,我们经常会遇到需要处理结构复杂的数组数据。例如,…

    2026年9月21日
    200

发表回复

登录后才能评论
关注微信