二分查找的理解及应用场景。
一、是什么
在计算机科学中,二分查找算法,也称折半搜索算法,是一种在有序数组中查找某一特定元素的搜索算法
想要应用二分查找法,则这一堆数应有如下特性:
- 存储在数组中
- 有序排序
搜索过程从数组的中间元素开始,如果中间元素正好是要查找的元素,则搜索过程结束
如果某一特定元素大于或者小于中间元素,则在数组大于或小于中间元素的那一半中查找,而且跟开始一样从中间元素开始比较,如果在某一步骤数组为空,则代表找不到,这种搜索算法每一次比较都使搜索范围缩小一半。

相比普通的顺序查找,除了数据量很少的情况下,二分查找会比顺序查找更快。
二、如何实现
基于二分查找的实现,如果数据是有序的,并且不存在重复项,实现代码如下:
function BinarySearch(arr, target) {if (arr.length <= 1) return -1// 低位下标let lowIndex = 0// 高位下标let highIndex = arr.length - 1while (lowIndex <= highIndex) {// 中间下标const midIndex = Math.floor((lowIndex + highIndex) / 2)if (target < arr[midIndex]) {highIndex = midIndex - 1} else if (target > arr[midIndex]) {lowIndex = midIndex + 1} else {// target === arr[midIndex]return midIndex}}return -1
}
如果数组中存在重复项,而我们需要找出第一个制定的值,实现则如下:
function BinarySearchFirst(arr, target) {if (arr.length <= 1) return -1// 低位下标let lowIndex = 0// 高位下标let highIndex = arr.length - 1while (lowIndex <= highIndex) {// 中间下标const midIndex = Math.floor((lowIndex + highIndex) / 2)if (target < arr[midIndex]) {highIndex = midIndex - 1} else if (target > arr[midIndex]) {lowIndex = midIndex + 1} else {// 当 target 与 arr[midIndex] 相等的时候,如果 midIndex 为0或者前一个数比 target 小那么就找到了第一个等于给定值的元素,直接返回if (midIndex === 0 || arr[midIndex - 1] < target) return midIndex// 否则高位下标为中间下标减1,继续查找highIndex = midIndex - 1}}return -1
}
实际上,除了有序的数组可以使用,还有一种特殊的数组可以应用,那就是轮转后的有序数组
有序数组即一个有序数字以某一个数为轴,将其之前的所有数都轮转到数组的末尾所得
例如,[4, 5, 6, 7, 0, 1, 2]就是一个轮转后的有序数组
该数组的特性是存在一个分界点用来分界两个有序数组,如下:

分界点有如下特性:
- 分界点元素 >= 第一个元素
- 分界点元素 < 第一个元素
代码实现如下:
function search (nums, target) {// 如果为空或者是空数组的情况if (nums == null || !nums.length) {return -1;}// 搜索区间是前闭后闭let begin = 0,end = nums.length - 1;while (begin <= end) {// 下面这样写是考虑大数情况下避免溢出let mid = begin + ((end - begin) >> 1);if (nums[mid] == target) {return mid;}// 如果左边是有序的if (nums[begin] <= nums[mid]) {//同时target在[ nums[begin],nums[mid] ]中,那么就在这段有序区间查找if (nums[begin] <= target && target <= nums[mid]) {end = mid - 1;} else {//否则去反方向查找begin = mid + 1;}//如果右侧是有序的} else {//同时target在[ nums[mid],nums[end] ]中,那么就在这段有序区间查找if (nums[mid] <= target && target <= nums[end]) {begin = mid + 1;} else {end = mid - 1;}}}return -1;
};
对比普通的二分查找法,为了确定目标数会落在二分后的哪个部分,我们需要更多的判定条件。
三、应用场景
二分查找法的O(logn)让它成为十分高效的算法。不过它的缺陷却也是比较明显,就在它的限定之上:
- 有序:我们很难保证我们的数组都是有序的
- 数组:数组读取效率是O(1),可是它的插入和删除某个元素的效率却是O(n),并且数组的存储是需要连续的内存空间,不适合大数据的情况
关于二分查找的应用场景,主要如下:
- 不适合数据量太小的数列;数列太小,直接顺序遍历说不定更快,也更简单
- 每次元素与元素的比较是比较耗时的,这个比较操作耗时占整个遍历算法时间的大部分,那么使用二分查找就能有效减少元素比较的次数
- 不适合数据量太大的数列,二分查找作用的数据结构是顺序表,也就是数组,数组是需要连续的内存空间的,系统并不一定有这么大的连续内存空间可以使用
相关文章:
二分查找的理解及应用场景。
一、是什么 在计算机科学中,二分查找算法,也称折半搜索算法,是一种在有序数组中查找某一特定元素的搜索算法 想要应用二分查找法,则这一堆数应有如下特性: 存储在数组中有序排序 搜索过程从数组的中间元素开始&…...
共创时代,品牌如何做好UGC营销?
在当下的互联网时代,众多品牌已经逐渐意识到“产品为重”的影响方式已经很难提升转化率,内容才是吸引用户的必胜法宝,然而当代人被海量信息裹挟,人们的注意力成为稀缺资源,在这个环境下,UGC成为品牌的营销方…...
华为三层交换机:ACL的基本实验
实验要求: PC1不允许访问PC3,PC3可以访问PC1 分析问题: PC1不允许访问PC3,问题中含有“目标地址”则我们需要设置目标地址,这样基本ACL是不行的,必须使用高级ACL [sw1]acl ? INTEGER<2000-2999>…...
基于springboot+vue的旅游管理系统
博主主页:猫头鹰源码 博主简介:Java领域优质创作者、CSDN博客专家、阿里云专家博主、公司架构师、全网粉丝5万、专注Java技术领域和毕业设计项目实战,欢迎高校老师\讲师\同行交流合作 主要内容:毕业设计(Javaweb项目|小程序|Pyt…...
4. git 添加版本标签
要给某一分支的某一提交版本添加标签(tag),你首先需要确定该提交版本在分支上的具体哈希值(commit hash)。 一旦你有了这个哈希值,你就可以像之前描述的那样使用 git tag 命令来创建标签。 以下是如何操作的…...
2024 PhpStorm激活,分享几个PhpStorm激活的方案
文章目录 PhpStorm 公司简介我这边使用PhpStorm的理由PhpStorm 2023.3 最新变化AI Assistant 预览阶段结束 正式版基于 LLM 的代码补全测试代码生成编辑器内代码生成控制台中基于 AI 的错误解释 Pest 更新PHP 8.3 支持#[\Override] 特性新的 json_validate() 函数类型化类常量弃…...
2419. prufer序列(prufer编码,模板题)
活动 - AcWing 本题需要你实现prufer序列与无根树之间的相互转化。 假设本题涉及的无根树共有 n 个节点,编号 1∼n。 为了更加简单明了的描述无根树的结构,我们不妨在输入和输出时将该无根树描述为一个以 n 号节点为根的有根树。 这样就可以设这棵无…...
鸿蒙Harmony应用开发—ArkTS声明式开发(基础手势:Text)
显示一段文本的组件。 说明: 该组件从API Version 7开始支持。后续版本如有新增内容,则采用上角标单独标记该内容的起始版本。 子组件 可以包含Span和ImageSpan子组件。 接口 Text(content?: string | Resource, value?: TextOptions) 从API versi…...
开源大数据集群部署(十五)Zookeeper集群部署
作者:櫰木 1、集群规划 主机版本角色系统用户hd1.dtstack.com3.7.1followerzookeeperhd2.dtstack.com3.7.1leaderzookeeperhd3.dtstack.com3.7.1followerzookeeper 2、zookeeper kerberos主体创建 在生产中zk服务端和客户端票据可以设置成不通名称或相同名称&am…...
服务器镜像是什么
镜像即镜像服务器。镜像服务器与主服务器的服务内容都是一样的,只是放在一个不同的地方,分担主服务器的负载量。 可以使用,但不是原版的。在网上内容完全相同而且同步更新的两个或多个服务器,除主服务器外,其余的都被称…...
JWT原理
JWT 介绍 JWT(JSON Web Token)是一个开放标准(RFC 7519),它定义了一种简洁的、自包含的方法用于通信双方之间以 JSON 对象的形式安全地传输信息。这种信息可以被验证和信任,因为它是数字签名的。JWT通常用于…...
操作系统:一款纯正的“管理”软件
目录 前言: 1.操作系统的概念 2.操作系统的结构示意图: 3.什么是接口? 4.什么是驱动程序? 4.什么是系统调用(system call)? 5.操作系统和操作系统内核的区别 6.设计OS的核心目的 前言&…...
Mac笔记本聚焦SpotLight占用内存太高的 解法
分享一个自创的绝对有效的解决苹果电脑Mac笔记本SpotLight聚焦占用内存过高的方法! 一、背景 / 问题原因 1、Mac的聚焦功能,可以快速打开应用程序,非常方便! But,随着电脑的使用文件等越来越多,就会导致SpotLight聚焦需要更多更多甚至巨多的内存来建立索引,就会导致电脑…...
C++中.h和.hpp文件有什么区别?
在C中,.h和.hpp文件都是用于包含函数声明、类定义、宏定义等内容的头文件,它们的主要区别在于约定和习惯。 历史与来源:.h后缀是C语言头文件的标准后缀,随着C的演变,一些开发者开始使用.hpp后缀来表示C头文件ÿ…...
MongoDB聚合运算符:$derivative
$derivative聚合运算符返回返回指定窗口内的平均变化率(即求导),变化率使用以下公式计算: $setWindowFields阶段窗口中的第一个和最后一个文件。分子,等于最后一个文档的表达式的值减去第一个文档表达式的值。分母&am…...
面试官:如果你现在有20个Spring Boot微服务,如何监视所有这些Spring Boot微服务?
该文章专注于面试,面试只要回答关键点即可,不需要对框架有非常深入的回答,如果你想应付面试,是足够了,抓住关键点 面试官:如果你现在有20个Spring Boot微服务,如何监视这些微服务? 要监视所有 Spring Boot 微服务,可以使用 Spring Boot Admin 这样的监控工具。Sprin…...
冯诺依曼模型
只要我们学习计算机操作系统,就离不开对冯诺依曼体系结构。因为我们常见的计算机,如笔记本。我们不常见的计算机,如服务器,大部分都遵守冯诺依曼体系。 1.什么是冯诺依曼模型呢? 如上图所示,冯诺依曼模型由…...
高低拖延个体的任务决策及执行差异
高低拖延个体的任务决策及执行差异 摘要 拖延行为普遍存在,且影响着许多人的工作.学习和生活。已有的许多研究发现拖延个体明知自己需要尽快完成某项任务,但行动上却迟迟无法付诸实践,表现出一种知行不- -”的倾向.这种倾向是否在高低拖延特质者之间存…...
数据分析Pandas专栏---第十三章<Pandas训练题(初)>
前言: 写这篇是为了弄一个富有挑战性的Pandas练习题库,涵盖了许多常见和实用的数据处理问题。通过解决这些练习,能够深入了解Pandas提供的关键功能,掌握有效处理数据的技巧和方法。 练习题库涵盖了选择特定列并创建新DataFrame、对DataFrame进…...
Delete `␍`eslint(prettier/prettier) 错误的解决方案
最近开始一个新的项目,由他人构建,clone下来后,发现页面每行都有黄色的波浪线的提示:Delete ␍eslint(prettier/prettier) ,尝试了很多方法不能解决,最后选择关闭Prettier: 在.eslintrc.js文件…...
装饰模式(Decorator Pattern)重构java邮件发奖系统实战
前言 现在我们有个如下的需求,设计一个邮件发奖的小系统, 需求 1.数据验证 → 2. 敏感信息加密 → 3. 日志记录 → 4. 实际发送邮件 装饰器模式(Decorator Pattern)允许向一个现有的对象添加新的功能,同时又不改变其…...
CVPR 2025 MIMO: 支持视觉指代和像素grounding 的医学视觉语言模型
CVPR 2025 | MIMO:支持视觉指代和像素对齐的医学视觉语言模型 论文信息 标题:MIMO: A medical vision language model with visual referring multimodal input and pixel grounding multimodal output作者:Yanyuan Chen, Dexuan Xu, Yu Hu…...
k8s从入门到放弃之Ingress七层负载
k8s从入门到放弃之Ingress七层负载 在Kubernetes(简称K8s)中,Ingress是一个API对象,它允许你定义如何从集群外部访问集群内部的服务。Ingress可以提供负载均衡、SSL终结和基于名称的虚拟主机等功能。通过Ingress,你可…...
鱼香ros docker配置镜像报错:https://registry-1.docker.io/v2/
使用鱼香ros一件安装docker时的https://registry-1.docker.io/v2/问题 一键安装指令 wget http://fishros.com/install -O fishros && . fishros出现问题:docker pull 失败 网络不同,需要使用镜像源 按照如下步骤操作 sudo vi /etc/docker/dae…...
CRMEB 框架中 PHP 上传扩展开发:涵盖本地上传及阿里云 OSS、腾讯云 COS、七牛云
目前已有本地上传、阿里云OSS上传、腾讯云COS上传、七牛云上传扩展 扩展入口文件 文件目录 crmeb\services\upload\Upload.php namespace crmeb\services\upload;use crmeb\basic\BaseManager; use think\facade\Config;/*** Class Upload* package crmeb\services\upload* …...
【Oracle】分区表
个人主页:Guiat 归属专栏:Oracle 文章目录 1. 分区表基础概述1.1 分区表的概念与优势1.2 分区类型概览1.3 分区表的工作原理 2. 范围分区 (RANGE Partitioning)2.1 基础范围分区2.1.1 按日期范围分区2.1.2 按数值范围分区 2.2 间隔分区 (INTERVAL Partit…...
蓝桥杯3498 01串的熵
问题描述 对于一个长度为 23333333的 01 串, 如果其信息熵为 11625907.5798, 且 0 出现次数比 1 少, 那么这个 01 串中 0 出现了多少次? #include<iostream> #include<cmath> using namespace std;int n 23333333;int main() {//枚举 0 出现的次数//因…...
算法:模拟
1.替换所有的问号 1576. 替换所有的问号 - 力扣(LeetCode) 遍历字符串:通过外层循环逐一检查每个字符。遇到 ? 时处理: 内层循环遍历小写字母(a 到 z)。对每个字母检查是否满足: 与…...
MySQL 部分重点知识篇
一、数据库对象 1. 主键 定义 :主键是用于唯一标识表中每一行记录的字段或字段组合。它具有唯一性和非空性特点。 作用 :确保数据的完整性,便于数据的查询和管理。 示例 :在学生信息表中,学号可以作为主键ÿ…...
PostgreSQL——环境搭建
一、Linux # 安装 PostgreSQL 15 仓库 sudo dnf install -y https://download.postgresql.org/pub/repos/yum/reporpms/EL-$(rpm -E %{rhel})-x86_64/pgdg-redhat-repo-latest.noarch.rpm# 安装之前先确认是否已经存在PostgreSQL rpm -qa | grep postgres# 如果存在࿰…...
