0

0

详解BinarySearch二分查找算法_在有序集合中快速定位元素的原理

P粉602998670

P粉602998670

发布时间:2026-02-16 12:11:20

|

403人浏览过

|

来源于php中文网

原创

binarysearch必须要求数组有序,因为其核心逻辑依赖中间值划分有序区间;无序时排除一半数据无效,降序或部分有序需额外处理;防溢出应使用mid = left + (right - left) / 2;返回值设计兼顾存在性与插入点,重复元素时位置不固定。

详解binarysearch二分查找算法_在有序集合中快速定位元素的原理

为什么 binarySearch 一定要求数组有序?

因为算法每一步都依赖“中间值能划分左右区域”的逻辑:如果 arr[mid] > target,它就默认所有右边的数都更大——这只有在升序时才成立。一旦无序,mid 左右两边毫无规律,排除一半数据就成了瞎猜。

  • 降序数组不能直接用标准 binarySearch,要么先反转,要么改比较逻辑(比如把 target 改成 <code>target > arr[mid]
  • 部分有序(如旋转数组)需先定位断点,再分段二分,不能跳过预处理
  • Java 的 Collections.binarySearch() 和 Python 的 bisect 模块都明确要求输入已排序,否则返回值无意义,甚至越界

mid = left + (right - left) / 2 而不是 (left + right) / 2

这是防整数溢出的关键细节。当 leftright 都接近 Integer.MAX_VALUE(约 21 亿)时,left + right 会溢出变负数,导致 mid 错误,进而索引越界或死循环。

  • 几乎所有现代实现(JDK、Go sort.Search、Rust slice::binary_search)都用减法形式
  • 在 C/C++ 中尤其危险;Java 8+ 的 Arrays.binarySearch 内部也如此实现
  • 即使当前数据量小,也建议统一写法,避免未来迁移或边界扩展时翻车

查不到时返回 -1 还是 -(insertionPoint + 1)

返回 -1 是最简语义(“没找到”),但很多场景需要知道“它该插在哪”。比如维护有序列表、计算排名、找前驱后继——这时返回插入位置的补码更实用。

今天学点啥
今天学点啥

秘塔AI推出的AI学习助手

下载
  • Java 的 Arrays.binarySearch() 就是后者:若返回负值 r,则插入点为 -r - 1
  • Python bisect.bisect_left() 直接返回插入索引,不加转换,语义更直白
  • 自己实现时,若只关心“是否存在”,返回 -1 足够;若后续要插入或求 rank,务必保留插入点信息

重复元素时 binarySearch 返回哪个位置?

标准实现不保证返回第一个或最后一个——它只保证返回“某个匹配位置”。比如数组 [2, 4, 4, 4, 6]4,可能返回索引 1、2 或 3,取决于中间点怎么落。

  • 要找第一次出现位置,得用左边界二分:while (left ,并保持 <code>arr[mid] >= target 时收缩右边界
  • 要找最后一次出现位置,用右边界二分:while (left ,条件改为 <code>arr[mid]
  • Java 的 Arrays.binarySearch 不提供边界变体;需手写或借助 Arrays.binarySearch 配合 while 向左/右扫描(但最坏退化为 O(n))

实际写的时候,最容易漏掉的是:没验证输入是否真有序,以及混淆了“查找存在性”和“查找插入点”两种语义。这两个点不靠测试很难暴露,一上线就静默错。

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

通义千问
通义千问

阿里巴巴推出的全能AI助手

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
C++系统编程内存管理_C++系统编程怎么与Rust竞争内存安全
C++系统编程内存管理_C++系统编程怎么与Rust竞争内存安全

C++系统编程中的内存管理是指 对程序运行时内存的申请、使用和释放进行精细控制的机制,涵盖了栈、堆、静态区等不同区域,开发者需要通过new/delete、智能指针或内存池等方式管理动态内存,以避免内存泄漏、野指针等问题,确保程序高效稳定运行。它核心在于开发者对低层内存有完全控制权,带来灵活性,但也伴随高责任,是C++性能优化的关键。

13

2025.12.22

Rust异步编程与Tokio运行时实战
Rust异步编程与Tokio运行时实战

本专题聚焦 Rust 语言的异步编程模型,深入讲解 async/await 机制与 Tokio 运行时的核心原理。内容包括异步任务调度、Future 执行模型、并发安全、网络 IO 编程以及高并发场景下的性能优化。通过实战示例,帮助开发者使用 Rust 构建高性能、低延迟的后端服务与网络应用。

3

2026.02.11

sort排序函数用法
sort排序函数用法

sort排序函数的用法:1、对列表进行排序,默认情况下,sort函数按升序排序,因此最终输出的结果是按从小到大的顺序排列的;2、对元组进行排序,默认情况下,sort函数按元素的大小进行排序,因此最终输出的结果是按从小到大的顺序排列的;3、对字典进行排序,由于字典是无序的,因此排序后的结果仍然是原来的字典,使用一个lambda表达式作为key参数的值,用于指定排序的依据。

399

2023.09.04

while的用法
while的用法

while的用法是“while 条件: 代码块”,条件是一个表达式,当条件为真时,执行代码块,然后再次判断条件是否为真,如果为真则继续执行代码块,直到条件为假为止。本专题为大家提供while相关的文章、下载、课程内容,供大家免费下载体验。

102

2023.09.25

页面置换算法
页面置换算法

页面置换算法是操作系统中用来决定在内存中哪些页面应该被换出以便为新的页面提供空间的算法。本专题为大家提供页面置换算法的相关文章,大家可以免费体验。

452

2023.08.14

pixiv网页版官网登录与阅读指南_pixiv官网直达入口与在线访问方法
pixiv网页版官网登录与阅读指南_pixiv官网直达入口与在线访问方法

本专题系统整理pixiv网页版官网入口及登录访问方式,涵盖官网登录页面直达路径、在线阅读入口及快速进入方法说明,帮助用户高效找到pixiv官方网站,实现便捷、安全的网页端浏览与账号登录体验。

149

2026.02.13

微博网页版主页入口与登录指南_官方网页端快速访问方法
微博网页版主页入口与登录指南_官方网页端快速访问方法

本专题系统整理微博网页版官方入口及网页端登录方式,涵盖首页直达地址、账号登录流程与常见访问问题说明,帮助用户快速找到微博官网主页,实现便捷、安全的网页端登录与内容浏览体验。

104

2026.02.13

Flutter跨平台开发与状态管理实战
Flutter跨平台开发与状态管理实战

本专题围绕Flutter框架展开,系统讲解跨平台UI构建原理与状态管理方案。内容涵盖Widget生命周期、路由管理、Provider与Bloc状态管理模式、网络请求封装及性能优化技巧。通过实战项目演示,帮助开发者构建流畅、可维护的跨平台移动应用。

35

2026.02.13

TypeScript工程化开发与Vite构建优化实践
TypeScript工程化开发与Vite构建优化实践

本专题面向前端开发者,深入讲解 TypeScript 类型系统与大型项目结构设计方法,并结合 Vite 构建工具优化前端工程化流程。内容包括模块化设计、类型声明管理、代码分割、热更新原理以及构建性能调优。通过完整项目示例,帮助开发者提升代码可维护性与开发效率。

14

2026.02.13

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号