首页
学习
活动
专区
圈层
工具
发布

javascript上的BinarySearch

二分查找(Binary Search)是一种高效的查找算法,适用于在有序数组中查找特定元素。它通过反复将查找范围减半来快速缩小目标元素的位置,从而提高查找效率。

基础概念

二分查找的基本思想是将数组分成两个部分,通过比较中间元素与目标值的大小,决定继续在左半部分还是右半部分查找。每次比较都会将查找范围缩小一半,直到找到目标元素或查找范围为空。

优势

  1. 时间复杂度低:二分查找的时间复杂度为 (O(\log n)),远优于线性查找的 (O(n))。
  2. 效率高:适用于大规模数据的快速查找。

类型

  • 迭代实现:使用循环进行查找。
  • 递归实现:使用函数递归进行查找。

应用场景

  • 数据库索引查找:数据库系统常用二分查找来加速索引查询。
  • 大型数据集的搜索:在内存中的有序数据集查找特定元素。
  • 算法竞赛:常用于解决需要高效查找的问题。

示例代码(JavaScript)

以下是二分查找的迭代实现示例:

代码语言:txt
复制
function binarySearch(arr, target) {
    let left = 0;
    let right = arr.length - 1;

    while (left <= right) {
        const mid = Math.floor((left + right) / 2);

        if (arr[mid] === target) {
            return mid; // 找到目标元素,返回其索引
        } else if (arr[mid] < target) {
            left = mid + 1; // 目标在右半部分
        } else {
            right = mid - 1; // 目标在左半部分
        }
    }

    return -1; // 未找到目标元素
}

// 示例用法
const sortedArray = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10];
const target = 7;
console.log(binarySearch(sortedArray, target)); // 输出: 6

遇到的问题及解决方法

问题1:数组未排序

原因:二分查找要求数组是有序的,如果数组未排序,查找结果将不正确。 解决方法:在使用二分查找前,确保数组已经排序。

问题2:整数溢出

原因:在计算中间索引时,如果数组长度非常大,可能会导致整数溢出。 解决方法:使用 Math.floor((left + right) / 2)left + Math.floor((right - left) / 2) 来避免溢出。

问题3:查找范围错误

原因:在更新查找范围时,可能会出现逻辑错误,导致查找范围不正确。 解决方法:仔细检查每次更新查找范围的逻辑,确保 leftright 的值正确。

通过理解二分查找的基础概念及其应用场景,并注意上述常见问题,可以有效利用这一算法提升查找效率。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

二分搜索BinarySearch的来龙去脉

二分搜索BinarySearch的 “来龙去脉” 二分搜索用于检索某个key是否在已排好序的序列中,我们还记得上编程语言的基础课程:猜字游戏吗?...因为这个笨拙的游戏规则只会告诉你是对的还是错误的!!!...然后你得进行下一次的瞎猜… 猜字游戏第二版: 程序预先选取一个数字(假设是40)作为猜想的目标; 用户键盘输入自己猜想的数字(假设是5); 如果不相等则提示错误,并且有内容:您猜的太小了;...第二版的游戏相比第一版增加了游戏提示,这个提示有利于用户缩小下一次猜想的数字的大概范围。 我们的二分搜索就可以认为来自这个猜想,思路是: 在有序数组中查找关匹配键字的元素。...如果中间索引值arr[mid] 的右边,猜的数字比较小,需要往大的方向猜。

16620
  • JavaScript 入门(上)

    二、JavaScript编辑工具 三、JavaScript在HTML的引用方式 四、JavaScript和Java的关系 五、训练题 2、JavaScript入门基础 一、数据结构 二、JavaScript...十一、split()方法 十二、从字符串提取字符串 7、日期对象 一、创建日期对象 二、日期对象方法 ---- 预备知识与后续知识及项目案例 [HTML入门与进阶以及HTML5] [CSS] [JS-上]...JavaScript和Java虽然名字相似,但是本质上是不同的。...(1)JavaScript往往都是在网页中使用,而Java却可以在软件、网页、手机App等各个领域中使用; (2)Java是一门面向对象的语言,而从本质上讲,JavaScript更像是一门函数式编程语言...有可能这些技巧一时半会你用不上,但是学习知识有一种说法是:你只有接触了某个知识点,即使将来你已经忘记了这个知识点具体是怎样的了,不过你却能想到用这么一个知识去帮你解决某些问题。

    68030

    JavaScript 对象(上)

    JavaScript 中的所有事物都是对象:字符串、数值、数组、函数... 此外,JavaScript 允许自定义对象。...---- 所有事物都是对象 JavaScript 提供多个内建对象,比如 String、Date、Array 等等。 对象只是带有属性和方法的特殊数据类型。 布尔型可以是一个对象。...; var x=message.length; 在以上代码执行后,x 的值将是: 12 ---- 访问对象的方法 方法是能够在对象上执行的动作。...---- 创建 JavaScript 对象 通过 JavaScript,您能够定义并创建自己的对象。 创建新对象有两种不同的方法: 使用 Object 定义并创建对象的实例。...使用 Object 在 JavaScript 中,几乎所有的对象都是 Object 类型的实例,它们都会从 Object.prototype 继承属性和方法。

    20020

    JavaScript事件(上)

    在JavaScript中,事件往往是页面的一些动作引起的,例如当用户按下鼠标或者提交表单,甚至在页面移动鼠标时,事件都会出现。...二、JavaScript事件 在JavaScript中,调用事件的方式共有2种: (1)在script标签中调用; 在script标签中调用事件,也就是在</script标签内部调用事件...(2)在元素中调用; 在元素事件中引入JS,就是指在元素的某一个属性中直接编写JavaScript程序或调用JavaScript函数,这个属性指的是元素的“事件属性”。...举例1:(在元素事件属性中直接编写JavaScript) JavaScript元素中调用的。 这2种调用JavaScript事件的方式,大家刚刚开始看不理解没关系,我们只是给大家说个语法,留个印象。在接下来的章节中,我们会经常接触。

    46620

    高并发 Javascript: 存在的!(上)

    目前 Javascript 虚拟机(VM) 的优化利用了只有一个执行线程的基本事实,因此高并发肯定会带来一些性能问题。本文考虑的问题是这是否在技术上是可行的,如果可行,那代价会是什么?...目前还无法从经验上评估这套方案的性能,但我们的实现思路能够有助于直观感受到性能也许看上去像是什么样的。...与 DOM 进行交互 对于所有的 Javascript 来扩展高并发会很难;将其扩展到所有 DOM 上难度更甚。...垃圾回收器拥有固定数量的分配器,而且我们已经有了快速的线程局部存储,因此这会是一个机制上的改变。 像 Javascript 一样,那些语言由多层 JIT 机制实现,也许还有一个解释器。...在 Javascript 上,这些才能正常运行。 如 Javascript 的实现一样,这些语言使用内联缓存技术(inline caching) 来加速动态操作。

    1.2K20

    JavaScript Number 对象(上)

    极大或极小的数字可通过科学(指数)计数法来写: 实例 var y=123e5;    // 12300000 var z=123e-5;   // 0.00123 ---- 所有 JavaScript...与许多其他编程语言不同,JavaScript 不定义不同类型的数字,比如整数、短、长、浮点等等。 在JavaScript中,数字不分为整数类型和浮点型类型,所有的数字都是由 浮点型类型。...JavaScript 采用 IEEE754 标准定义的 64 位浮点格式表示数字,它能表示最大值(Number.MAX_VALUE)为 ±1.7976931348623157e+308,最小值(Number.MIN_VALUE...所能表示的数字上限(溢出),结果为一个特殊的无穷大(infinity)值,在JavaScript中以Infinity表示。...同样地,当负数的值超过了JavaScript所能表示的负数范围,结果为负无穷大,在JavaScript中以-Infinity表示。

    30020

    JavaScript 获取 url 上的指定参数值

    图片 假设现在有 A 和 B 两个页面,当我们从 A 页面跳转到 B 页面的时候,需要将 A 页面的两个值传递到 B 页面当中,前端可以通过读取缓存的方式,从 B 页面获取到 A 页面的数据,但这样的方式...,会让其他端上的数据不同步,所以我们往往通过 url 传参的方式,在 A 页面跳转到 B 页面的时候,通过字符串拼接的方式,将 A 页面上的值链到 url 上,可参考下面的栗子 A 页面 javascript:void(0);" class="date_btn" data-year="2017" target="_blank">12 $('body').on('click'...year=2017&month=12,则 B 页面获取参数值的方式如下 var date = { init: function(){ this.bindCusEvent();...= that.getQueryString('year'), b_month = that.getQueryString('month'); // 利用得到的参数值进行其他操作

    2.1K50

    简单说 JavaScript中的事件委托(上)

    https://blog.csdn.net/FE_dev/article/details/78821578 说明 这篇文章说JavaScript中的事件委托,这次先说一些比较基本的知识。...事件:JavaScript 侦测到的行为就是事件,比如鼠标点击、某个键盘的键被按下、元素获得焦点。 委托:就是把原来自己做的事,交给别人做。...,并不在生成的元素上绑定事件,而是在生成元素的父元素上绑定事件,因为父元素是一直存在的,所以绑定的事件就可以生效。...,而是绑定在已经存在于页面上的父元素,冒泡到父元素上时,执行绑定在父元素上的事件处理函数,这样能减少很多不必要的工作。...还有 JQuery中的事件委托 又是怎么做的呢? 看这里 简单说 JavaScript中的事件委托(下)

    78020

    JavaScript 函数式编程解析(上)

    一些必要的概念 纯函数(Pure Function) Pure function 意指相同的输入,永远会得到相同的输出,而且没有任何显著的副作用。 纯函数就是数学里的函数,这也是函数式编程的全部。...可变状态(mutable state) 不受限的副作用(unrestricted side effects) 无原则设计(unprincipled design) 函数是一等公民的意义 在 JavaScript...Professor Frisby’s Mostly Adequate Guide to Functional Programming》[11],翻译版本为《JS 函数式编程指南中文版》[12] Pointfree Javascript...JS 函数式编程指南中文版》: https://jigsawye.gitbooks.io/mostly-adequate-guide/content/SUMMARY.md [13] Pointfree Javascript...: http://lucasmreis.github.io/blog/pointfree-javascript/ [14] Favoring Curry: http://fr.umio.us/favoring-curry

    65020

    javascript面向对象之继承(上)

    我们之前介绍了javascript面向对象的封装的相关内容,还介绍了js的call方法,今天开始讨论js的继承 这篇文章参考了《javascript高级程序设计》(第三版),但内容不局限于,网上很多关于...留意代码注释内容 //创建自定义构造函数 function Hqg() { this.name = '洪七公'; } //在当前构造函数的原型链上添加属性skill Hqg.prototype.skill...gj的skill屏蔽掉了原型链上的skill,所以gj的skill是降龙十八掌,而hr的skill依然是打狗棒 问题即将暴露 function Hqg() { this.name = '洪七公'...这样既通过在原型上定义方法实现了函数复用,又能保证每个实例都有自己的属性 一个栗子 function Hqg(name) { this.name = name this.skill = ["降龙十八掌...我们把这个组合继承和之前的两个原型链继承和借用构造函数继承进行比较 不难发现组合继承融合了他们的优点,成为javascript中最常用的继承模式 今天就讨论前三个,还有三个明天继续,不见不散

    44610

    GitHub上最流行的Top 10 JavaScript项目

    统计出Github中所有项目的数量,几乎是不可能的,而明确指出哪些是最优秀的项目就更不可能了。如果说到JavaScript,曾经极富创新的项目(很可能)在一两个月后就会变得过时、落后。...以防被淹没在大量的项目中,去研究(哪个项目更好),我们可以来看看2016年Github上最热门的Javascript项目。 Vue.JS ?...前端,Electron采用Chromium,后端使用Node.js,因此可以使用 HTML、CSS、JavaScript 构建App。它具有跨平台性,可运行在Linux、Windows及Mac上。...除了JavaScript扩展,Bootstrap包含HTML和基于CSS的设计模板。...---- 我们已经看到2016年 GitHub上的Top10 JavaScript项目。毫无疑问,不久将有更多的项目产生。

    1.2K20

    Angular 2 JavaScript 环境配置(上)

    本章节使用的是 JavaScript 来创建 Angular 的应用,当然你也可以使用 TypeScript 和 Dart 来创建 Angular 应用 。...npm 来作为包的管理工具,如果你还没安装npm或者不了解 npm 可以查看我们的教程:NPM 使用介绍。...---- 创建 Angular 组件 组件(Component)是构成 Angular 应用的基础和核心,一个组件包装了一个特定的功能,并且组件之间协同工作以组装成一个完整的应用程序。...一般来说,一个组件就是一个用于控制视图模板的JavaScript类。...Component方法接受一个包含两个属性的配置对象,Class方法是我们实现组件本身的地方,在Class方法中我们给组件添加属性和方法,它们会绑定到相应的视图和行为。

    53010

    JavaScript基础知识梳理(上)

    普通函数和箭头函数的this 原始数据类型及其判断和转化方法 深浅拷贝及实现 JS 事件模型 常见的高阶函数 普通函数和箭头函数的 this 还是一道经典题目,下面的这段代码的输出是什么?...① es5 普通函数: 函数被直接调用,上下文一定是window 函数作为对象属性被调用,例如:obj.foo(),上下文就是对象本身obj 通过new调用,this绑定在返回的实例上 ② es6 箭头函数...原始类型转化 当我们对一个“对象”进行数学运算操作时候,会涉及到对象 => 基础数据类型的转化问题。 事实上,当一个对象执行例如加法操作的时候,如果它是原始类型,那么就不需要转换。...否则,将遵循以下规则: 调用实例的valueOf()方法,如果有返回的是基础类型,停止下面的过程;否则继续 调用实例的toString()方法,如果有返回的是基础类型,停止下面的过程;否则继续 都没返回原始类型...值得提醒的是,ES6 的Object.assign()和 ES7 的...解构运算符都是“浅拷贝”。

    58230

    《你不知道的JavaScript》 (上) 阅读摘要

    本书属于基础类书籍,会有比较多的基础知识,所以这里仅记录平常不怎么容易注意到的知识点,不会全记,供大家和自己翻阅; 上中下三本的读书笔记: 《你不知道的JavaScript》 (上) 读书笔记 《你不知道的...JavaScript》 (中) 读书笔记 《你不知道的JavaScript》 (下) 读书笔记 第一部分 作用域和闭包 第二章 词法作用域 词法查找 全局变量会自动成为全局对象(浏览器中是 window...) 的属性,因此是不可以直接通过全局对象的此法名称,而是间接地通过全局对象属性的应用来对其进行访问 window.a,通过这种方法可以访问那些被同名变量所遮蔽的全局变量。...foo() { console.log(1) } function foo() { console.log(2) } 第二部分 this和对象原型 第一章 关于this this到底是什么 this 实际上是在函数被调用时发生的绑定...当一个函数被调用时,会创建一个执行上下文,它包含函数在哪里被调用(调用栈)、函数的调用方式、传入的参数等信息,this 就是这个记录的一个属性,会在函数执行的过程中用到。

    59520

    GitHub上最流行的Top 10 JavaScript项目

    以防被淹没在大量的项目中,去研究(哪个项目更好),我们可以来看看2016年Github上最热门的Javascript项目。 1. Vue.JS ?...由于简单小巧的核心,加上可渐进式使用的工具栈,Vue.js被认为非常“多才多艺”。 2. React ? 2016年,React在Github上名列第二,同样引起了我们的注意。...前端,Electron采用Chromium,后端使用Node.js,因此可以使用 HTML、CSS、JavaScript 构建App。它具有跨平台性,可运行在Linux、Windows及Mac上。...这便于开发者直接专注于编码及应用的业务逻辑上。 Create React App为具有基本结构的命令行工具。它提供了运行、测试、创建package.json的脚本。...除了JavaScript扩展,Bootstrap包含HTML和基于CSS的设计模板。

    1.4K20
    领券
    首页
    学习
    活动
    专区
    圈层
    工具
    MCP广场