关于二分法的理解(以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题为例)

题目:

答案:

你学废了吗

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

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

【漏洞复现】东胜物流软件 GetProParentModuTreeList SQL注入漏洞

0x01 产品简介 东胜物流软件是青岛东胜伟业软件有限公司-款集订单管理、仓库管理、运输管理等多种功能于一体的物流管理软件。该公司初创于2004年11月(前身为青岛景宏物流信息技术有限公司),专注于航运物流相关环节的产品和服务。东胜物流信息管理系统货代版采用MS…

计算机组成原理历年考研真题对应知识点(计算机系统层次结构)

目录 1.2计算机系统层次结构 1.2.2计算机硬件 【命题追踪——冯诺依曼计算机的特点(2019)】 【命题追踪——MAR 和 MDR 位数的概念和计算(2010、2011)】 1.2.3计算机软件 【命题追踪——三种机器语言的特点(2015)】 【命题追踪——各种翻译程序的概念(2016)】 1.2.5计算…

网络协议,OSI,简单通信,IP和mac地址

认识协议 1.讲故事 2004年,小明因为给他爹打电话(座机)费用太贵,所以约定一种信号,响一次是报平安,响两次是要钱,响三次才需要接通。 2.概念 协议:是一种约定,这种约…

【odoo15】前端自定义模态弹窗

概要 在odoo15或者在15之前,odoo前端的owl框架还没完全替换当前前端框架的时候,我们很多时候都是用js或者jq来直接操作dom,那么我们如果需要在前端用到一个模态弹窗,可以怎么解决呢? 方法1 直接用js原生的模态弹窗&am…

Zadig vs. Jenkins 详细比较

01、Zadig vs. Jenkins:关于时代的选择 最近官方公众号发布了一篇名为 《是时候和 Jenkins 说再见了》的文章,引起了社区的广泛关注和讨论。作为曾经最被广泛使用的持续构建交付工具,Jenkins 的江湖地位似乎被挑战了。评论中有一条被高度点赞…

和鲸科技执行总裁殷自强:面向空间数据协同分析场景的模型生命周期管理方法

导读: 由 ACM SIGSPATIAL 中国分会主办的第五届空间数据智能学术会议(SpatialDI 2024)于 2024 年 4 月 25 日- 27 日在南京圆满召开,主题为“ AGI 时代下的空间数据智能”,旨在深入推动空间数据智能研究的理论进步与应…

解决javadoc一直找不到路径的问题

解决javadoc一直找不到路径的问题 出现以上问题就是我们在下载jdk的时候一些运行程序安装在C:\Program Files\Common Files\Oracle\Java\javapath下: 一开始是没有javadoc.exe文件的,我们只需要从jdk的bin目录下找到复制到这个里面,就可以使用…

苹果电脑装虚拟机和双系统的区别 苹果笔记本虚拟机和双系统哪个好 虚拟机能装MacOS吗 虚拟机类似的软件

Mac电脑用户在需要使用Windows操作系统的软件时,通常会面临两个选择:安装双系统或使用虚拟机。两种方式各有优缺点,适用于不同的使用场景。本文将详细分析和说明Mac电脑装双系统和虚拟机之间的区别,帮助用户选择最适合自己的方案。…

实况:老菜鸟自力更生从零开始重学spring目标是画出一张唬人大图(二、源码下载编译)

前情提要:调试前的基础知识梳理 速览 “Spring”包含哪些东西源码下载源码编译1、编译工具选择:gradle2、使用gradle编译spring并导入idea预编译spring-oxm导入IDEA确认合适的jdk版本排除spring-aspects模块 开始调试 “Spring”包含哪些东西 可以明确的…

民生银行信用卡中心金融科技24届春招面经

本文介绍2024届春招中,中国民生银行下属信用卡中心的金融科技(系统研发方向) 岗位2场面试的基本情况、提问问题等。 2024年04月投递了中国民生银行下属信用卡中心的金融科技(系统研发方向) 岗位,暂时不清楚…

Linux--08---挂载分区

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 1.查看系统磁盘分区情况1.lsblk 查看2.fdisk -l 2.挂载未分区磁盘1. 创建分区2. 格式化分区3. 创建挂载点4. 挂载分区5. 更新 /etc/fstab6.验证挂载 3.修改挂载的磁…

力扣19. 删除链表的倒数第N个节点

给你一个链表,删除链表的倒数第 n 个结点,并且返回链表的头结点。 示例 1: 输入:head [1,2,3,4,5], n 2 输出:[1,2,3,5] 示例 2: 输入:head [1], n 1 输出:[] 示例…

springboot+vue+mybatis家电系统+PPT+论文+讲解+售后

随着信息互联网购物的飞速发展,一般企业都去创建属于自己的电商平台以及购物管理系统。本文介绍了家电销售系统的开发全过程。通过分析企业对于家电销售系统的需求,创建了一个计算机管理家电销售系统的方案。文章介绍了家电销售系统的系统分析部分&#…

Ubuntu基础-VirtualBox安装增强功能

目录 零. 前言 一. 安装 1.点击安装增强功能 2.点击光盘图标 3.复制到新文件夹 4.运行命令 5.重启系统 6.成果展示 二. 打开共享 1.共享粘贴 ​编辑2.共享文件夹 三.总结 安装步骤 打开共享粘贴功能: 打开共享文件夹功能: 零. 前言 在使用…

用HAL库改写江科大的stm32入门-7-1 ADC

实验目的:了解ADC基本概念 电路图: ADC(Analog-Digital Converter)模拟-数字转换器,它可以将引脚上连续变化的模拟电压转换为内存中存储的数字变量,建立模拟电路到数字电路的桥梁。 实验效果: &#xff0…

增强的依赖性

增强的依赖性 原文参见 https://universaldependencies.org/u/overview/syntax.html 受控/提升主语 受控主语:表示主语由控制动词决定。提升主语:表示主语通过提升动词从嵌套句提升到主句。 基本树缺少受控动词与其控制者之间的主语依存关系&#xf…

【网络编程】多进程服务器端

并发服务器的实现 多进程服务器:通过创建多个进程提供服务多路复用服务器:通过捆绑并统一管理IO对象提供服务。多线程服务器:通过生成与客户端等量的线程提供服务。、 理解进程process 定义:占用内存空间的正在运行的程序。 CPU核和进程数:1个CPU 中…

搭建自己的AI模型应用网站:JavaScript + Flask-Python + ONNX

1. 前言 本文作者以一个前端新手视角,部署自己的神经网络模型作为后端,搭建自己的网站实现应用的实战经历。目前实现的网页应用有: AI 语音服务主页AI 语音识别AI 语音合成AI CP号码生成器 欢迎大家试用感受,本文将以博客基于G…

[DDR4] DDR1 ~ DDR4 发展史导论

依公知及经验整理,原创保护,禁止转载。 专栏 《深入理解DDR4》 内存和硬盘是电脑的左膀右臂, 挑起存储的大梁。因为内存的存取速度超凡地快, 但内存上的数据掉电又会丢失,一直其中缓存的作用,就像是我们的工…

15天系统化入门AI产品经理,打好入行基础,抢占时代红利!!

前言 随着算法、算力和数据条件的逐渐成熟,AI时代来临已成共识。 与此同时,行业巨头争先布局人工智能,产生大量人才需求,人工智能产品经理岗位缺口高达6.8万。 面对这样一个大热的朝阳行业,产品经理如何才能快速入行…