JavaScript 二分查找(迭代与递归)

        二分搜索被定义为一种在排序数组中使用的搜索算法,通过重复将搜索间隔一分为二。二分查找的思想是利用数组已排序的信息,将时间复杂度降低到O(log N)。

二分查找算法示例 

何时在数据结构中应用二分查找的条件:
应用二分查找算法:
        1、数据结构必须是有序的。
        2、访问数据结构的任何元素都需要恒定的时间。
二分查找算法:
        在这个算法中, 通过查找中间索引“mid”将搜索空间分为两半。 

在二分查找算法中查找中间索引“mid” 

1、将搜索空间的中间元素与键进行比较。 
2、如果在中间元素找到密钥,则过程终止。
3、如果在中间元素没有找到键,则选择哪一半将用作下一个搜索空间。
        3.1、如果键小于中间元素,则使用左侧进行下一步搜索。
        3.2、如果键大于中间元素,则使用右侧进行下一步搜索。
4、这个过程一直持续到找到密钥或者总搜索空间耗尽为止。


二分查找如何工作?
要了解二分搜索的工作原理,请考虑下图:
考虑一个数组arr[] = {2, 5, 8, 12, 16, 23, 38, 56, 72, 91},目标 = 23。
第一步:计算mid并将mid元素与key进行比较。如果键小于 mid 元素,则向左移动,如果大于 mid 则将搜索空间向右移动。
        键(即 23)大于当前中间元素(即 16)。搜索空间向右移动。 

二分查找算法:将键与 16 进行比较 

密钥小于当前的中间 56。搜索空间向左移动。   

二分查找算法:将键与 56 进行比较  

第二步:如果key与mid元素的值匹配,则找到该元素并停止搜索。 

二分搜索算法:与 mid 的关键匹配  

如何实现二分查找?
二分查找算法可以通过以下两种方式实现
    1、迭代二分搜索算法
    2、递归二分查找算法
下面给出了这些方法的伪代码。
1.迭代二分查找算法:
这里我们使用 while 循环来继续比较键并将搜索空间分成两半的过程。
迭代二分搜索算法的实现:   

// Program to implement iterative Binary Search
 
// A iterative binary search function. It returns
// location of x in given array arr[l..r] is present,
// otherwise -1
 
 function binarySearch(arr, x)
{    
    let l = 0;
    let r = arr.length - 1;
    let mid;
    while (r >= l) {
         mid = l + Math.floor((r - l) / 2);
  
        // If the element is present at the middle
        // itself
        if (arr[mid] == x)
            return mid;
  
        // If element is smaller than mid, then
        // it can only be present in left subarray
        if (arr[mid] > x)
            r = mid - 1;
             
        // Else the element can only be present
        // in right subarray
        else
            l = mid + 1;
    }
  
    // We reach here when element is not
    // present in array
    return -1;
}
 
    arr =new Array(2, 3, 4, 10, 40);
    x = 10;
    n = arr.length;
    result = binarySearch(arr, x);
     
(result == -1) ? console.log("Element is not present in array")
               : console.log ("Element is present at index " + result);
                
// This code is contributed by simranarora5sos and rshuklabbb

输出
元素出现在索引 3 处 

时间复杂度: O(log N)
辅助空间: O(1)

2.递归二分查找算法:
        创建一个递归函数并将搜索空间的中间部分与键进行比较。并根据结果返回找到键的索引或调用下一个搜索空间的递归函数。
递归二分查找算法的实现:

// JavaScript program to implement recursive Binary Search
 
// A recursive binary search function. It returns
// location of x in given array arr[l..r] is present,
// otherwise -1
function binarySearch(arr, l, r, x){
    if (r >= l) {
        let mid = l + Math.floor((r - l) / 2);
 
        // If the element is present at the middle
        // itself
        if (arr[mid] == x)
            return mid;
 
        // If element is smaller than mid, then
        // it can only be present in left subarray
        if (arr[mid] > x)
            return binarySearch(arr, l, mid - 1, x);
 
        // Else the element can only be present
        // in right subarray
        return binarySearch(arr, mid + 1, r, x);
    }
 
    // We reach here when element is not
    // present in array
    return -1;
}
 
let arr = [ 2, 3, 4, 10, 40 ];
let x = 10;
let n = arr.length
let result = binarySearch(arr, 0, n - 1, x);
(result == -1) ? console.log( "Element is not present in array")
               : console.log("Element is present at index " +result);

输出
元素出现在索引 3 处

二分查找的复杂度分析:
时间复杂度: 
        最佳情况:O(1)
        平均情况:O(log N)
        最坏情况:O(log N)
辅助空间:

        O(1),如果考虑递归调用栈则辅助空间为O(logN)。
二分查找的优点:
        二分查找比线性查找更快,特别是对于大型数组。
        比具有类似时间复杂度的其他搜索算法(例如插值搜索或指数搜索)更有效。
        二分搜索非常适合搜索存储在外部存储器(例如硬盘驱动器或云中)中的大型数据集。
二分查找的缺点:
        数组应该是排序的。
        二分查找要求将要查找的数据结构存储在连续的内存位置中。 
        二分查找要求数组的元素是可比较的,这意味着它们必须能够排序。
二分查找的应用:
        二分搜索可以用作机器学习中使用的更复杂算法的构建块,例如训练神经网络或查找模型的最佳超参数的算法。
        它可用于计算机图形学中的搜索,例如光线追踪或纹理映射的算法。
        它可用于搜索数据库。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Langchain-Chatchat本地搭建ChatGLM3模型和提取PDF内容

文章目录 1、软件要求2、安装CUDA2.1、安装gcc2.2、安装CUDA 3、安装Anaconda33.1、下载Anaconda33.2、创建python虚拟环境 4、部署系统4.1、下载源码4.2、安装依赖4.3、下载模型4.4、初始化配置和知识库4.4.1、初始化配置4.4.2、初始化知识库 4.5、运行4.6、运行4.6.1、启动4.…

Python学习笔记-Flask实现简单的抽奖程序

1.导入flask包和randint包 from flask import Flask,render_template from random import randint 2.初始化 Flask 应用: app Flask(__name__) 3. 定义英雄列表 hero [黑暗之女,狂战士,正义巨像,卡牌大师,德邦总管,无畏战车,诡术妖姬,猩红收割者,远古恐惧,正义天使,无极剑…

Clickhouse表引擎介绍

作者:俊达 1 引擎分类 ClickHouse表引擎一共分为四个系列,分别是Log、MergeTree、Integration、Special。其中包含了两种特殊的表引擎Replicated、Distributed,功能上与其他表引擎正交,根据场景组合使用。 2 Log系列 Log系列…

高阶提示词工程、幻觉综述

提示词工程技术 类比提示 “类比提示”利用类比推理的概念,鼓励模型生成自己的例子和知识,从而实现更灵活和高效的解决问题。 后退提示 “后退提示”专注于抽象,引导模型推导出高级概念和原理,进而提高其推理能力。 使用一个…

mysql学习笔记8——常用5个内置方法

1count 对查询内容进行计数,并返回结果 2as as可以将查询出来结果赋予新名字 3sum sum可以查询某字段特定条件下的和值 4concat concat可以将多列数据合并成一列,只要concat()即可 5group_concat group_concat可以把多列…

SpringBoot+Ajax+redis实现隐藏重要接口地址

🏡浩泽学编程:个人主页 🔥 推荐专栏:《深入浅出SpringBoot》《java对AI的调用开发》 《RabbitMQ》《Spring》《SpringMVC》《项目实战》 🛸学无止境,不骄不躁,知行合一 文章目录 …

预付费电表的应用和预付费平台的操作方式

*、智能预付费电能表的应用分析 1应用功能的分析 这里主要讲的是与远程抄表系统的结合.如图2所示.为系统工作的程序.在远程抄表中,通信方式多种多样.主要有互联网、电话线通信、有线电视通信、光纤通信、GPRS、卫星通…

关于esp8266的一些经验汇总,新手必看

说实话,esp8266的nodemcu 已经使用了2年多了,各种问题遇到过,就尝试各种解决,而现在回头来看真的是稀里糊涂的在用,当然这个问题也同样涉及到esp32. 因为最近打算自己打一块esp8266的板,之前打的比较多的是…

Hi3516DV500+SC2210 AIISP 黑光相机

1. Hi3516DV500 Hi3516DV500是一颗面向行业市场推出的高清智能网络摄像头SoC。该芯片最高支持2路sensor输入,支持最高5M30fps的ISP图像处理能力,支持2F WDR、多级降噪、六轴防抖、多光谱融合等多种传统图像增强和处理算法,支持通过AI算法对输…

ABAP 内表排序总结

目录 ABAP 内表排序总结需求的场景二分法查找SAP 二分法查找SAP SORT排序 ABAP 内表排序总结 ABAP 内表排序SORT总结: 在创建完内表之后,最好使用sort去排序一下使用read读取内表,如果没有排序的话,可能会读取失败read内表只能读…

Fortran语法介绍(一)

个人专栏—ABAQUS专栏 Abaqus2023的用法教程——与VS2022、oneAPI 2024子程序的关联方法 Abaqus2023的用法教程——与VS2022、oneAPI 2024子程序的关联方法Abaqus有限元分析——有限元网格划分基本原则 Abaqus有限元分析——有限元网格划分基本原则各向同性线弹性材料本构模型…

创维汽车SKYHOME获德国设计奖,中国红设计闪耀世界

祝贺!创维汽车SKYHOME以卓越的国潮设计理念和突破性的设计语言强势出圈,荣获被誉为设计界“奥斯卡”德国iF设计奖! 创维汽车SYHOME是一款集完美设计理念、出色用户体验及创新实用功能为一体的优秀设计产品。SKYHOME的设计灵感来源于中式亭台楼…

【掌握数学公式的魔法】LatexEasy:让你的数学写作不再是难题!

内容摘要:在学术和研究领域,数学公式的准确表达至关重要。然而,传统的LaTeX编辑过程往往复杂且耗时。幸运的是,有了LatexEasy,一切都变得简单起来。这款工具不仅简化了数学公式的编辑流程,还大大提高了工作…

【梳理】k8s使用Operator搭建Flink集群

文章目录 架构图安装cert-manager依赖helm 安装operator运行集群实例k8s上的两种模式:Native和Standalone两种CRDemo1:Application 单任务Demo2:Session 多任务创建ingress 总结 架构图 参考:部署验证demo 安装cert-manager依赖 …

面试高频 牛群的位置排序---搜索插入位置

题目描述 农场里有一群牛,每头牛都有一个标签值,这些标签值组成一个升序排列的数组 labels。现在农场主想知道,给定一个目标标签值 target,如果在牛群中存在这个标签,返回它的位置,如果不存在,…

NSSCTF Round#13 WEB

1.flask?jwt? 在忘记密码下面有提示secretkey,那么就可以jwt伪造 自己注册个账号然后登录 点击拿flag提示你不是admin,并且cookie里面有个session,用工具解密一下 python flask_session_cookie_manager3.py decode -s th3f1askisfunny -c .eJwlzjsOAyEMANG7UK…

JavaScript实现小球移动(二)

这次采用了封装函数的方法&#xff0c;将小球向左向右移动封装在同一个函数内。 代码&#xff1a; <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-wi…

高效办公-浏览器基本操作

日常我们使用电脑&#xff0c;其实很大部分是用于网络功能&#xff0c;这里面除了客户端程序剩余的就是通过我们的浏览器获取信息或者使用业务系统了&#xff0c;这里就简单学习下浏览器基本常识与操作。 一、浏览器是什么&#xff1f; 白话讲浏览器就是一个软件&#xff0c;我…

springboot3.x集成nacos踩坑,并实现多环境配置

一、nacos安装部署 springboot3.x集成Nacos首先需要将Nacos从1.x升级到2.x&#xff0c;建议直接安装2.x版本&#xff0c;手动将1.x的配置信息迁移到2.x中&#xff0c;先并行一段时间&#xff0c;待全部迁移完成稳定运行之后再停掉1.x&#xff0c;升级和安装、操作请查看官方文…

了解开源可视化表单的主要优势

为什么可视化表单深受大家喜爱&#xff1f;这就需要了解开源可视化表单的优势和特点了。在流程化办公深入人心的今天&#xff0c;提高办公协作效率早已成为大家的发展目标&#xff0c;低代码技术平台、开源可视化表单是提升办公协作效率的得力助手&#xff0c;一起来看看它的优…