关于二分法的理解(以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.mzph.cn/news/853503.shtml

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

相关文章

【iOS】如何断点看系统方法在哪一个库

如何断点看系统方法在哪一个库 开源网站如何断点看系统方法在哪一个库1 下符号断点2 符号断点中输入 load ,并且开启断点(Enable)。3 运行程序,触发断点,在堆栈信息中找到load方法,可以看到其在libobjc.A.d…

程序员的wsl2

坑 wsl无法打开 上班时打开wsl2提示 WSL 正在完成升级... Could not write value to key \SOFTWARE\Classes\Directory\shell\WSL. Verify that you have sufficient access to that key, or contact your support personnel. 原因未知,之前并没有更新过&#xff…

【AI+编程】工作日常场景随时可以AI编程,记一个问答SQL快速导出数据日常示例

今天有个场景,我们有个老项目,由于历史原因差不多1年多没使用了,恰巧客户紧急情况要使用。因为当时没有需求,所以V1.0上线后 就没做更新。 需求很简单:我们假定 项目问题表、客户表、问题答案表, 实时查询…

TCP协议报头详解

目录 前言 TCP特点 TCP报头 1.源端口和目的端口 2.序号 3.确认号 4.数据偏移 5.保留 6.控制位 ① 紧急URG(URGent) ② 确认ACK(ACKnowledgment) ③ 推送PSH(PuSH) ④复位RST(ReSeT&…

Hexo 搭建个人博客(ubuntu20.04)

1 安装 Nodejs 和 npm 首先登录NodeSource官网: Nodesource Node.js DEB 按照提示安装最新的 Node.js 及其配套版本的 npm。 (1)以 sudo 用户身份运行下面的命令,下载并执行 NodeSource 安装脚本: sudo curl -fsSL…

【牛客面试必刷TOP101】Day32.BM68 矩阵的最小路径和和BM69 把数字翻译成字符串

文章目录 前言一、BM68 矩阵的最小路径和题目描述题目解析二、BM69 把数字翻译成字符串题目描述题目解析总结 前言 一、BM68 矩阵的最小路径和 题目描述 描述: 给定两个字符串str1和str2,输出两个字符串的最长公共子序列。如果最长公共子序列为空&#x…

webpack逆向

声明:个人总结记录一下,避免忘记 1、webpack 类型 单文件 直接可以在文件顶部找到加载器 多文件 顶部找不到加载器 如图所示 多文件的这话,全局搜所 69725 找到类似n(69725) ,单点n进去,可以找到加载器 2、调用 通过赋值的方…

Linux 并发与竞争实验学习

Linux 并发与竞争实验学习 原子操作实验 这里原子操作就是采用原子变量来保护一个程序运行的完整过程,使用atomic 来实现一次只能允许一个应用访问 LED,创建atomic.c文件,其实改动内容就是添加原子变量, 要在设备结构体数据添加…

vue2 + element-ui,前端配置化表单封装(2024-06-14)

技术栈是 vue2 element-ui,主要能解决的问题就是 提高代码复用能力、提升开发效率,特别是需要开发多个大型表单系统的,配置化可以极大的提升效率,让你上班摸鱼不再是梦想!为了早点下班,我们接着往下看吧&a…

(Java微服务项目实战)dtpay聚合支付系统对账管理模块系统设计

1 聚合支付系统对账流程 dtpay聚合支付系统对账模块主要涵盖商户侧对账和渠道侧对账、平台侧对账,本文主要分析渠道侧对账。dtpay聚合支付系统通过支付渠道微信、支付宝等产生的支付退款交易数据需要和平台侧产生的数据进行交易数据比对。接下来我们具体分析对账流…

一款不写代码的开源爬虫工具!!【送源码】

爬虫,也被称为网络爬虫或网络蜘蛛,是一种自动化的网络机器人,其主要功能是按照一定的规则,自动浏览互联网并从网页中提取信息。 作为一个开发人员,相信大家都尝试过写一些爬虫,合理的利用一些爬虫工具&…

金融行业的等保测评要求

金融行业的等保(网络安全等级保护)测评要求是确保金融机构的信息系统达到一定的安全保护水平,以保护客户信息和金融交易的安全。等保测评在金融行业中的具体要求和流程主要包括以下几个方面: 等保级别 金融行业信息系统依据其重…

深入理解并打败C语言难关之一————指针(4)

前言: 我们在前面的几讲中已经讲了指针的很多内容了,现在我们开始层层递进,要探寻更多的指针喽,不多废话了,直接进入正题,开始今天的指针之旅喽! 目录: 1.字符指针变量 1.1常量字符…

MEGALODON:突破传统,实现高效无限上下文长度的大规模语言模型预训练和推理

在人工智能领域,尤其是在自然语言处理(NLP)中,大模型(LLMs)的预训练和推理效率一直是研究的热点。最近,一项突破性的研究提出了一种新型神经网络架构——MEGALODON,旨在解决传统Tran…

阿里新发布的UniAnimate现高效人像动画生成;在ComfyUI中使用Stable 3模型;音频版的gpt2o;将 PDF 文档转换为音频播客

✨ 1: UniAnimate 阿里新发布的UniAnimate通过统一的视频扩散模型,实现高效人像动画生成,支持长视频生成 UniAnimate 是一种专注于一致性人像动画生成的统一视频扩散模型。该模型通过映射参考图像、姿势指导和噪声视频到一个共同特征空间,实…

ZED双目相机环境配置

官方资料:stereolabs/zed-python-api: Python API for the ZED SDK (github.com) 1,配置ZED相机环境 1.安装CUDA 查看电脑是否安装CUDA,安装过程可参考以下博文: 如何选择匹配的CUDA版本:https://blog.csdn.net/iam…

MoCo v3(ICCV 2021)

paper:An Empirical Study of Training Self-Supervised Vision Transformers official implementation:https://github.com/facebookresearch/moco-v3 出发点 本文并没有提出一种新的方法,而是对计算机视觉领域最近进展中的一个重要且基础…

沃尔玛自养号测评:优势与技术要求解析

沃尔玛自养号测评是一种卖家在沃尔玛平台上提升店铺权重和排名的营销手段。传统运营策略的局限性日益显现,如营销手段单一、难以应对市场竞争等。因此,许多卖家为了提升店铺权重和排名,选择了自养号测评这一技术手段。 以下是对沃尔玛自养号…

关于BERT和embedding

embedding到一个低维向量,但是需要回到onehot高维表示,所以大部分填词游戏最后都需要加上一个MLP接头。 word2vec如此简单的结构,学习到的是embedding 基于计数的统计方法和word2vec融合就形成了glove词嵌入模型 总结:通过各种…

消费者消费数据时报错:INVALID_REPLICATION_FACTOR

今天部署了kafka集群,三台服务器,启动后,生产者发送数据,消费者接收数据的时候报错,INVALID_REPLICATION_FACTOR。 查了很多资料,说是要改kafka下config目录的server.properties,可能是副本数太小&#xff…