二分查找的理解及应用场景。

一、是什么

在计算机科学中,二分查找算法,也称折半搜索算法,是一种在有序数组中查找某一特定元素的搜索算法

想要应用二分查找法,则这一堆数应有如下特性:

  • 存储在数组中
  • 有序排序

搜索过程从数组的中间元素开始,如果中间元素正好是要查找的元素,则搜索过程结束

如果某一特定元素大于或者小于中间元素,则在数组大于或小于中间元素的那一半中查找,而且跟开始一样从中间元素开始比较,如果在某一步骤数组为空,则代表找不到,这种搜索算法每一次比较都使搜索范围缩小一半。

相比普通的顺序查找,除了数据量很少的情况下,二分查找会比顺序查找更快。

二、如何实现

基于二分查找的实现,如果数据是有序的,并且不存在重复项,实现代码如下:

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),并且数组的存储是需要连续的内存空间,不适合大数据的情况

关于二分查找的应用场景,主要如下:

  • 不适合数据量太小的数列;数列太小,直接顺序遍历说不定更快,也更简单
  • 每次元素与元素的比较是比较耗时的,这个比较操作耗时占整个遍历算法时间的大部分,那么使用二分查找就能有效减少元素比较的次数
  • 不适合数据量太大的数列,二分查找作用的数据结构是顺序表,也就是数组,数组是需要连续的内存空间的,系统并不一定有这么大的连续内存空间可以使用

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

(黑马出品_高级篇_02)SpringCloud+RabbitMQ+Docker+Redis+搜索+分布式

&#xff08;黑马出品_高级篇_02&#xff09;SpringCloudRabbitMQDockerRedis搜索分布式 微服务技术——分布式事务 今日目标1.分布式事务问题1.1.本地事务1.2.分布式事务1.3.演示分布式事务问题 2.理论基础2.1.CAP定理2.1.1.一致性2.1.2.可用性2…

WMS系统批次管理全面解析

一、WMS系统批次管理的基本概念 WMS系统的批次管理&#xff0c;是指对仓库中不同批次的产品进行精细化、规范化的管理&#xff0c;确保产品的可追溯性、可控制性和安全性。批次管理涉及到产品的入库、存储、出库等各个环节&#xff0c;通过对批次的精确控制&#xff0c;实现仓…

RK3568行业定制主板脉冲群抗扰度整改方案验证

1. 试验目的及原理 电快速瞬变脉冲群EFT试验的目的是验证电子设备机械开关对电感性负载切换、继电器触点弹跳、高压开关切换等引起的瞬时扰动的抗干扰能力。这种试验方法是一种耦合到电源线路、控制线路、信号线路上的由许多快速瞬变脉冲组成的脉冲群试验。容易出现问题的场合有…

微信小程序开发:上传网络图片到阿里云oss

上文遇到的问题&#xff0c;用户上传的人像图片在经过人像增强后返回的结果需要再次上传到阿里云的oss。 因为是需要下下载&#xff0c;再上传&#xff0c;这个域名我们没有在MP后台配置download域名&#xff0c;所以报错了&#xff1a; 但是MP后台只能配置https的域名&#xf…

常见面试题之计算机网络

1. OSI 五层模型&#xff08;或七层模型&#xff09;是什么&#xff0c;每一层的作用是什么 应用层&#xff1a;又可细分为应用层、表示层、会话层。其中应用层主要做的工作就是为应用程序提供服务&#xff0c;常见的协议为 HTTP、HTTPS、DNS等&#xff1b;表示层主要做的工作…

如何只用pycharm创建venv虚拟环境

如何只用pycharm创建venv虚拟环境 网上貌似没有好的博客讲解&#xff0c;我之前也一直在这环境搭建上疑惑。不过照着我这博客来&#xff0c;应该没问题了。 前言 如图所示&#xff0c;我新建了一个空白文件夹。 接下来点击终端&#xff08;AltF12&#xff09; 如果发现开头…

使用Thymeleaf-没有js的html模板导出为pdf

html模板 <!DOCTYPE html> <html xmlns:th"http://www.thymeleaf.org"><head><title>PDF Template</title> </head> <body> <h1>User Information</h1> <p>Name: <span th:text"${user.name}&…

【BI-Dataease】dataease设计思路

参考&#xff1a;https://juejin.cn/post/7089310768671227940 1、BI可视化工具的关键问题是什么&#xff1f; &#xff08;1&#xff09;各种数据源的数据结构和类型如何统一&#xff1f; &#xff08;2&#xff09;各种图表的配置属性不一致&#xff0c;属性如何绑定到数据…

【python】linux系统安装了多个版本的python,如何查看安装路径、第三方库路径

【python】linux系统安装了多个版本的python&#xff0c;如何查看安装路径、第三方库路劲。 1. 查看安装路径、第三方库路径 进入对应版本的python路径&#xff0c;进入交互界面&#xff0c;输入 import sys sys.path 2. 查看第三方库中已安装库

STM32进阶笔记——FATFS文件系统(下)

本专栏争取每周三更新直到更新完成&#xff0c;期待大家的订阅关注&#xff0c;欢迎互相学习交流。 本文需要一些SD卡和内存管理等前置知识&#xff0c;后续文章会介绍&#xff0c;这里先介绍一下FATFS文件系统。关于FATFS的文章分为上下两篇&#xff0c;上篇主要介绍什么是FAT…

二分搜索树和AVL树

问题 跑道预订系统。一个飞机场只有一个飞机跑道&#xff0c;需要为未来的飞机着陆预留空闲的跑道。飞机预订的着陆时间为t&#xff0c;假如没有其他的计划在(t-k,tk)的时间内着陆的飞机&#xff0c;则将t加入集合R。其中k是变量。请问有没有一种时间复杂度为O(logn)的算法解决…

增强PLMs可塑性!MetaAI | 提出主动遗忘机制,加快模型收敛,准确率高出21.2%!

引言 在自然语言处理领域&#xff0c;预训练语言模型&#xff08;PLMs&#xff09;扮演着至关重要的角色&#xff0c;它可以根据任务需求&#xff0c;可迁移至各种下游任务中。然而&#xff0c;PLMs在适应新语言时面临挑战&#xff0c;尤其是在数据和计算资源受限的情况下。本…

数据结构与算法----复习Part 14 (树与二叉树)

本系列是算法通关手册LeeCode的学习笔记 算法通关手册&#xff08;LeetCode&#xff09; | 算法通关手册&#xff08;LeetCode&#xff09; (itcharge.cn) 目录 一&#xff0c;树&#xff08;Tree&#xff09; 树的相关术语 节点间关系 树的其他术语 二&#xff0c;二叉…

比较JavaScript中的for...in和for...of循环

&#x1f90d; 前端开发工程师、技术日更博主、已过CET6 &#x1f368; 阿珊和她的猫_CSDN博客专家、23年度博客之星前端领域TOP1 &#x1f560; 牛客高级专题作者、打造专栏《前端面试必备》 、《2024面试高频手撕题》 &#x1f35a; 蓝桥云课签约作者、上架课程《Vue.js 和 E…

linux解析域名指令 nslookup 或者 host

host www.baidu.com 第二种方法 nslookup www.baidu.com 注意&#xff1a;ns是name server之意

【包邮送书】Elasticsearch 通过索引阻塞实现数据保护深入解析

欢迎关注博主 Mindtechnist 或加入【智能科技社区】一起学习和分享Linux、C、C、Python、Matlab&#xff0c;机器人运动控制、多机器人协作&#xff0c;智能优化算法&#xff0c;滤波估计、多传感器信息融合&#xff0c;机器学习&#xff0c;人工智能等相关领域的知识和技术。关…

回收小程序系统后台管理功能

会员管理&#xff1a;管理员可以查看和管理会员的基本信息&#xff0c;如姓名、联系方式、寄送地址和订单记录等。 产品管理&#xff1a;对回收物品进行管理&#xff0c;包括分类、规格设定、数据统计等。 订单管理&#xff1a;对所有订单进行追踪和管理&#xff0c;确保订单处…

Leetcode 543. 二叉树的直径

题目描述&#xff1a; 给你一棵二叉树的根节点&#xff0c;返回该树的 直径 。 二叉树的 直径 是指树中任意两个节点之间最长路径的 长度 。这条路径可能经过也可能不经过根节点 root 。 两节点之间路径的 长度 由它们之间边数表示。 示例 1&#xff1a; 输入&#xff1a;ro…

汽车屏类产品(五):仪表Cluster常用芯片i.MX117x

前言: 仪表一般就是指方向盘前面那个表盘。做仪表的芯片最主要需要支持显示Display,而仪表的主要排版布局多种多样,但是主旨显示内容不尽相同。 仪表需求: 1、rpm转速表盘 仪表Cluster一般会有转速表盘rpm,单位一般是x1000,大部分汽车仪表范围就是0~8,也就是最高8000…

MySQL安装使用(mac、windows)

目录 macOS环境 一、下载MySQL 二、环境变量 三、启动 MySql 四、初始化密码设置 windows环境 一、下载 二、 环境配置 三、安装mysql 1.初始化mysql 2.安装Mysql服务 3.更改密码 四、检验 1.查看默认安装的数据库 2.其他操作 macOS环境 一、下载MySQL 打开 MyS…