Javascript 元二分搜索 | 单边二分查找(Meta Binary Search | One-Sided Binary Search)
元二分搜索(Steven Skiena 在《算法设计手册》第 134 页中也称为单边二分搜索)是二分搜索的一种修改形式,它以增量方式构建数组中目标值的索引。与普通二分搜索一样,元二分搜索需要 O(log n) 时间。
元二分搜索,也称为单边二分搜索,是二分搜索算法的一种变体,用于搜索有序列表或元素数组。该算法旨在减少在列表中搜索给定元素所需的比较次数。
元二分搜索背后的基本思想是从包含整个数组的大小为 n 的初始区间开始。然后,该算法像二分搜索一样计算中间元素,并将其与目标元素进行比较。如果找到目标元素,则搜索终止。如果中间元素大于目标元素,则算法将新区间设置为前一个区间的左半部分,如果中间元素小于目标元素,则将新区间设置为前一个区间的右半部分间隔。但是,与二分搜索不同,元二分搜索不会对循环的每次迭代执行比较。
相反,该算法使用启发式方法来确定下一个间隔的大小。它计算中间元素的值与目标元素的值之间的差值,并将差值除以预定常数(通常为2)。然后将该结果用作新区间的大小。该算法将继续进行,直到找到目标元素或确定它不在列表中。
元二分搜索相对于二分搜索的优势在于,它在某些情况下可以执行更少的比较,特别是当目标元素接近列表开头时。缺点是在其他情况下,该算法可能比二分查找执行更多的比较,特别是当目标元素接近列表末尾时。因此,当列表的排序方式与目标元素的分布一致时,元二分搜索是最有效的。
这是元二分搜索的伪代码:
function meta_binary_search(A, target):
n = length(A)
interval_size = n
while interval_size > 0:
index = min(n - 1, interval_size / 2)
mid = A[index]
if mid == target:
return index
elif mid < target:
interval_size = (n - index) / 2
else:
interval_size = index / 2
return -1
例子:
Input: [-10, -5, 4, 6, 8, 10, 11], key_to_search = 10
Output: 5
Input: [-2, 10, 100, 250, 32315], key_to_search = -2
Output: 0
确切的实现有所不同,但基本算法有两个部分:
1、计算出存储最大数组索引需要多少位。
2、通过确定索引中的每个位应设置为 1 还是 0,增量构造数组中目标值的索引。
方法:
1、在变量 lg 中存储表示最大数组索引的位数。
2、使用 lg 在 for 循环中开始搜索。
3、如果找到该元素,则返回 pos。
4、否则,在 for 循环中增量构造索引以达到目标值。
5、如果找到元素,则返回 pos,否则返回 -1。
下面是上述方法的实现:
// Javascript implementation of above approach
// Function to show the working of Meta binary search
function bsearch(A, key_to_search)
{
let n = A.length;
// Set number of bits to represent largest array index
let lg = parseInt(Math.log(n-1) / Math.log(2)) + 1;
//while ((1 << lg) < n - 1)
//lg += 1;
let pos = 0;
for (let i = lg ; i >= 0; i--) {
if (A[pos] == key_to_search)
return pos;
// Incrementally construct the
// index of the target value
let new_pos = pos | (1 << i);
// find the element in one
// direction and update position
if ((new_pos < n) && (A[new_pos] <= key_to_search))
pos = new_pos;
}
// if element found return pos otherwise -1
return ((A[pos] == key_to_search) ? pos : -1);
}
// Driver code
let A = [ -2, 10, 100, 250, 32315 ];
document.write(bsearch(A, 10));
输出:
1
时间复杂度: O(log n),其中 n 是给定数组的大小
辅助空间: O(1) ,因为我们没有使用任何额外空间
相关文章:
Javascript 元二分搜索 | 单边二分查找(Meta Binary Search | One-Sided Binary Search)
元二分搜索(Steven Skiena 在《算法设计手册》第 134 页中也称为单边二分搜索)是二分搜索的一种修改形式,它以增量方式构建数组中目标值的索引。与普通二分搜索一样,元二分搜索需要 O(log n) 时间。 元二分搜索,也称为…...
柚见十三期(优化)
前端优化 加载匹配功能与加载骨架特效 骨架屏 : vant-skeleton index.vue中 /** * 加载数据 */ const loadData async () > { let userListData; loading.value true; //心动模式 if (isMatchMode.value){ const num 10;//推荐人数 userListData await myA…...
Node.js常用命令:了解Node.js的核心命令和用法
学习目标: 理解Node.js和npm的概念及其在开发中的作用;掌握Node.js的核心命令,包括node、npm、npx等;学会使用node命令来执行JavaScript文件和模块;熟悉npm命令,包括安装、更新、卸载依赖包等操作…...
QT 驾校系统界面布局编写
MainWindow::MainWindow(QWidget *parent): QMainWindow(parent), ui(new Ui::MainWindow) {ui->setupUi(this);this->resize(ui->label_img->width(),ui->label_img->height());//图片自适应窗口大小ui->label_img->setScaledContents(true);//图片置…...
【Auth Proxy】为你的 Web 服务上把锁
Auth Proxy 一个极简的用于 Web 服务鉴权的反向代理服务 极其简约的 UI对你的真实服务无任何侵入性支持容器部署,Docker Image 优化到不能再小(不到 9MB)GitHub:https://github.com/wengchaoxi/auth-proxy 效果 我在 http://lo…...
Docker 从0安装 nacos集群
前提条件 Docker支持一下的CentOs版本 Centos7(64-bit),系统内核版本为 3.10 以上Centos6.5(64-bit) 或者更高版本,系统内核版本为 2.6.32-431 或者更高版本 安装步骤 使用 yum 安装(CentOS 7下) 通过 uname -r 命令查看你当…...
keithley2612A数字源表
181/2461/8938产品概述: Keithley 2612A源表既可用作台式I-V表征工具,也可用作多通道I-V测试系统的构建模块组件。对于台式使用,吉时利2612ASourceMeter具有嵌入式TSP Express软件工具,允许用户快速轻松地执行常见的I-V测试&…...
AI助手 - 月之暗面 Kimi.ai
前言 这是 AI工具专栏 下的第四篇,这一篇所介绍的AI,也许是截至今天(204-03-19)国内可访问的实用性最强的一款。 今年年初,一直看到有人推荐 Kimi,不过面对雨后春笋般的各类品质的AI,说实话也有…...
《计算机考研精炼1000题》为你考研之路保驾护航
创作背景 在这个充满挑战与竞争的时代,每一位考生在备战研究生考试的过程中,都希望通过更多符合考纲要求的练习题来提高自己的知识和技能。为了满足这一需求,我们精心策划和编辑了这本《计算机考研精炼1000题》。在考研政治和考研数学领域&a…...
el-input添加keyup事件无响应
<el-input type"password" v-model"formData.password" keyup.enter"onSubmit"></el-input>使用 .native修饰符 有时,Vue 组件内部可能会处理某些事件,导致你不能直接在组件上监听这些事件。 在这种情况下&am…...
错误1075:依存服务不存在, 或已标记为删除的解决方法
错误1075:依存服务不存在, 或已标记为删除的解决方法 运行 sc config spooler depend rpcss 注意"depend “而不是"depend”。...
【Python】使用selenium对Poe批量模拟注册脚本
配置好接码api即可实现自动化注册登录试用一体。 运行后会注册账号并绑定邮箱与手机号进行登录试用。 测试结果30秒一个号 import re import time import requests from bs4 import BeautifulSoup from selenium import webdriver from selenium.webdriver.chrome.options imp…...
【Linux】编译器-gcc/g++的使用(预处理、编译、汇编、连接)
目录 01.预处理(宏替换) 02.编译(生成汇编) 03.汇编(生成机器可识别码) 04.连接(生成可执行文件或库文件) 05.选项 编译器在编译代码时包含以下四个步骤:1.预处理 2…...
【Linux】Linux安装软件---软件包管理器 yum
主页:醋溜马桶圈-CSDN博客 专栏:Linux_醋溜马桶圈的博客-CSDN博客 gitee:mnxcc (mnxcc) - Gitee.com 目录 1.Linux中安装软件 1.1 源代码安装 1.2 rpm包安装 1.3 yum安装 1.3.1 举例 1.3.2 图示yum下载安装 2.Linux系统的生态 如何选…...
QT网络编程之获取本机网络信息
一.概述 查询一个主机的MAC地址或者IP地址是网络应用中常用到的功能,Qt提供了QHostInfo和QNetworkInterface 类可以用于此类信息的查询 1.QHostInfo 类(显示和查找本地的信息) 2.QNetworkInterface 类(获得应用程序上所在主机的…...
离线安装docker、docker-compose、Mysql镜像
离线安装docker docker-compose mysql镜像 一、下载docker docker-compose mysql 镜像文件 1、首先下载docker镜像 博主所用文件版本号: docker-23.0.6.tgz 下载docker 地址 :https://blog.csdn.net/xiaohanshasha/article/details/135489623?spm1001…...
Redis系列学习文章分享---第九篇(Redis快速入门之好友关注--关注和取关 -共同关注 -Feed流实现方案分析 -推送到粉丝收件箱 -滚动分页查询)
Redis的实战篇-好友关注 目录 好友关注-关注和取关好友关注-共同关注好友关注-Feed流实现方案分析好友关注-推送到粉丝收件箱好友关注-滚动分页查询收件箱的思路好友关注-实现滚动分页查询 1. 好友关注-关注和取关 1.1 概述 在好友关注系统中,用户可以关注其他用…...
数据库基本介绍及编译安装mysql
目录 数据库介绍 数据库类型 数据库管理系统(DBMS) 数据库系统 DBMS的工作模式 关系型数据库的优缺点 编译安装mysql 数据库介绍 数据:描述事物的的符号纪录称为数据(Data) 表:以行和列的形式组成…...
代码随想录算法训练营第55天 | 583. 两个字符串的删除操作, 72. 编辑距离
动态规划章节理论基础: https://programmercarl.com/%E5%8A%A8%E6%80%81%E8%A7%84%E5%88%92%E7%90%86%E8%AE%BA%E5%9F%BA%E7%A1%80.html 583. 两个字符串的删除操作 题目链接:https://leetcode.cn/problems/delete-operation-for-two-strings/descrip…...
Guava之EventBus源码分析
简介 事件总线。 有助于深入理解代码的功能和实现细节。 可以了解代码背后的逻辑、算法、数据结构和设计模式等方面,从而更好地理解代码的作用和功能。 可以学习到业界的最佳实践和设计模式。 这有助于提高自己的编程水平,使你能够编写更高质量、可…...
电力老师傅带你读懂IEC 60870-5-101规约:从帧格式到主站子站对话全解析
电力老师傅手把手教你玩转IEC 60870-5-101规约 记得刚入行那会儿,第一次看到IEC 60870-5-101规约文档,整个人都是懵的——满眼的十六进制代码、控制位定义、报文格式,活像一本天书。直到跟着师傅在变电站蹲了三个月,才慢慢摸清门道…...
高等数学——从入门到精通:二重积分的实战计算与技巧解析
1. 二重积分的核心概念与几何意义 第一次接触二重积分时,很多同学会被这个"二重"吓到。其实我们可以把它想象成给一个立体图形"称重量"的过程。比如你面前有个形状不规则的山丘,想知道它的总体积,二重积分就是解决这类问…...
Conan实战:如何把本地编译好的cJSON库(Linux ARM平台)一键发布为团队共享包
Conan实战:从本地构建到团队共享的ARM平台cJSON库高效封装指南 在嵌入式开发领域,跨平台库的管理往往伴随着复杂的工具链配置和漫长的编译等待。当你的团队在为Linux ARM平台开发时,是否经历过这样的场景:每位新成员加入项目时&am…...
给你的STM32F429项目加个“网口”:基于CubeMX的LAN8720以太网模块驱动与LWIP应用实战
STM32F429以太网实战:从CubeMX配置到LWIP应用开发 当你需要为工业传感器节点或智能设备添加远程监控能力时,以太网通信往往是可靠的选择。本文将手把手带你完成STM32F429与LAN8720的硬件协同设计,并通过CubeMX快速构建包含FreeRTOS和LWIP的工…...
深入SGLang HiCache与LMCache:两大KV Cache卸载方案,我该选哪个?
深入解析SGLang HiCache与LMCache:KV Cache卸载技术选型指南 在大模型推理服务中,KV Cache管理是影响性能的关键因素之一。随着模型规模的不断扩大,KV Cache占用的显存资源也急剧增加,如何高效管理这些缓存成为技术团队必须面对的…...
RMBG-1.4与Anaconda集成:Python数据科学工作流
RMBG-1.4与Anaconda集成:Python数据科学工作流 1. 引言 在日常的数据科学工作中,我们经常需要处理大量的图像数据。无论是电商平台的产品图片处理,还是社交媒体内容的批量编辑,背景去除都是一个常见但耗时的任务。传统的手动抠图…...
Co-MOF-74@Fe₃O₄ NPs,Co-MOF-74修饰四氧化三铁纳米颗粒,反应机制
Co-MOF-74Fe₃O₄ NPs,Co-MOF-74修饰四氧化三铁纳米颗粒,反应机制Co-MOF-74Fe₃O₄ NPs(Co-MOF-74修饰四氧化三铁纳米颗粒)是一类由磁性无机核与过渡金属有机骨架协同构建的核–壳型复合纳米材料,其反应机制可从“表面…...
CSS如何制作响应式图片集布局_利用object-fit填充空间
object-fit 应选 cover、contain 或 scale-down:cover 等比缩放裁剪填满,适合封面;contain 等比缩放留白显全图,适合证件照;scale-down 仅大图缩放防模糊。图片容器宽高固定时,object-fit 怎么选固定尺寸容…...
保姆级教程:Unsloth快速微调DeepSeek,打造你的专属AI
保姆级教程:Unsloth快速微调DeepSeek,打造你的专属AI 1. Unsloth简介与核心优势 Unsloth是一个开源的LLM微调和强化学习框架,专为快速高效地训练大语言模型而设计。它的核心使命是让人工智能训练尽可能准确且易于获取。 三大核心优势&…...
