【数据结构】二分查找(返回插入点)5.14
二分查找基础版
package 二分查找;
public class BinarySearch {
public static void main(String[] args) { // TODO Auto-generated method stub } public static int
binarySearchBasic(int[] a,int target) { int i=0,j=a.length-1; //设置指针初值
while(i<=j) { //范围有内容
int m=(i+j)/2;
if(target<a[m]) {
j=m-1;
}else if(target>a[m]) { i=m+1;
}else {
return m;
}
}
return -1; }
}
说明:
若目标在最左边,判断语句执行L次
若目标在最右边,判断语句执行2*L次
不平衡
平衡版
目的:为了减少执行次数
package 二分查找;
public class BinarySearch {
public static void main(String[] args) { // TODO Auto-generated method stub } public static int
binarySearchBasic(int[] a,int target) { int i=0,j=a.length; //设置指针初值
while(1<j-i) { //范围有内容
int m=(i+j)>>>2;
if(target<a[m]) {
j=m; //边界改变
}else {
i=m; //若i=m+1,当目标等于中间值时会错过}
}
if(a[m]==traget){return i;
}else{
return -1; }}
}
Java版
package 二分查找;
public class BinarySearch {
public static void main(String[] args) { // TODO Auto-generated method stub } public static int
binarySearchBasic(int[] a,int target) { int i=0,j=a.length-1; //设置指针初值
while(i<=j) { //范围有内容
int m=(i+j)/2;
if(target<a[m]) {
j=m-1;
}else if(target>a[m]) { i=m+1;
}else {
return m;
}
}
return -(i+1); //返回值 -插入点-1
}
}
源码
private static int binarySearch0(int[] a, int key) {int low = 0, high = a.length - 1; while (low <= high) {
int mid = (low + high) >>> 1;
if (a[mid] < key)
low = mid + 1;
else if (a[mid] > key)
high = mid - 1;
else return mid; // 找到时返回下标
}
return -(low + 1); // 未找到时返回插入点编码
}
为什么这样设计?
// 编码过程
返回值 = -(插入点 + 1)
// 解码过程插入点 = -返回值 - 1
-
保留插入点信息
通过数学变换,你可以反向计算出插入位置:
插入点 = -(返回值 + 1)
例如-2 → -( -2 + 1 ) = 1
-
避免歧义
如果直接返回-插入点
,当插入点是0
时,返回值也是0
,这会和「找到目标且下标为0」的情况冲突。 -
效率优化
查找时已经计算出了插入点,直接返回可以避免二次查找。
插入元素
int[] a = {2, 5, 8}; // 已经排好序的数组
int target = 4; // 我们要查找/插入的数字
int i = Arrays.binarySearch(a, target);
//Java中的二分查找
int insertIndex = Math.abs(i + 1);//实际插入位置
int[] b = new int[a.length + 1]; // 新数组长度比原数组大1
// 1. 复制插入点前的元素(不包含插入点)
System.arraycopy(a, 0, b, 0, insertIndex);
// 参数解释:
// a: 源数组
// 0: 从源数组的哪个位置开始复制
// b: 目标数组
// 0: 放到目标数组的哪个位置
// insertIndex: 要复制多少个元素// 2. 插入新元素
b[insertIndex] = target;// 3. 复制插入点后的元素
System.arraycopy(a, insertIndex, b, insertIndex + 1, a.length - insertIndex);
// 参数解释:
// a: 源数组
// insertIndex: 从源数组的哪个位置开始复制
// b: 目标数组
// insertIndex + 1: 放到目标数组的哪个位置(跳过插入的新元素)
// a.length - insertIndex: 要复制多少个元素
为什么这样设计?
这种设计的好处:
1)保持数组始终有序
2)插入操作高效(使用 System.arraycopy 是本地方法,速度很快)
3)利用了二分查找的高效性(O(log n))
相关文章:
【数据结构】二分查找(返回插入点)5.14
二分查找基础版 package 二分查找; public class BinarySearch { public static void main(String[] args) { // TODO Auto-generated method stub } public static int binarySearchBasic(int[] a,int target) { int i0,ja.length-1; //设置指针初值 while…...
如何设计一个二级缓存(Redis+Caffeine)架构?Redis 6.0多线程模型如何工作?
一、二级缓存(RedisCaffeine)架构设计 1. 设计目标 通过「本地缓存(Caffeine) 分布式缓存(Redis)」的分层结构,实现: 低延迟:热点数据本地缓存(内存级访问…...
Java:logback-classic与slf4j版本对应关系
1、结论 logback-classic-1.2.x及以下版本,则适配的slf4j 1.0.x - 1.7.x logback-classic-1.3.x及以上版本,则适配的slf4j 1.8.x及以上 2、原因分析 (1)logback-classic-1.2.x及以下版本 通过org.slf4j.impl.StaticLoggerBinder初…...

【OpenGL学习】(一)创建窗口
文章目录 【OpenGL学习】(一)创建窗口 【OpenGL学习】(一)创建窗口 GLFW OpenGL 本身只是一套图形渲染 API,不提供窗口创建、上下文管理或输入处理的功能。 GLFW 是一个支持创建窗口、处理键盘鼠标输入和管理 OpenGL…...

AI大语言模型评测体系演进与未来展望
随着人工智能技术的飞速发展,大语言模型(LLMs)已成为自然语言处理领域的核心研究方向。2025年最新行业报告显示,当前主流模型的评测体系已从单一任务评估转向多维度、全链路的能力剖析。例如,《全球首个大语言模型意识水平”识商”白盒DIKWP测评报告》通过数据、信息、知识…...

微服务项目->在线oj系统(Java版 - 5)
相信自己,终会成功 微服务代码: lyyy-oj: 微服务 目录 C端代码 用户题目接口 修改后用户提交代码(应用版) 用户提交题目判题结果 代码沙箱 1. 代码沙箱的核心功能 2. 常见的代码沙箱实现方式 3. 代码沙箱的关键问题与解决方案 4. 你的代码如何与沙箱交互? …...
disryptor和rabbitmq
disryptor和rabbitmq Disruptor 是什么? Disruptor 是一个由 LMAX Exchange 开发的高性能、低延迟的进程内(in-process)并发编程框架/库。它最初是为了解决金融交易系统中高吞吐量、低延迟消息传递的需求而设计的。 核心特点和设计理念&am…...
HTTP与HTTPS协议的核心区别
HTTP与HTTPS协议的核心区别 数据传输安全性 HTTP采用明文传输,数据易被窃听或篡改(如登录密码、支付信息),而HTTPS通过SSL/TLS协议对传输内容加密,确保数据完整性并防止中间人攻击。例如,HTTPS会生成对称加…...
Flink 并行度的设置
在 Apache Flink 中,并行度(Parallelism) 是控制任务并发执行的核心参数之一。Flink 提供了 多个层级设置并行度的方式,优先级从高到低如下: 🧩 一、Flink 并行度的四个设置层级 层级描述设置方式Operator…...
【微服务】SpringBoot + Docker 实现微服务容器多节点负载均衡详解
目录 一、前言 二、前置准备 2.1 基本环境 2.2 准备一个springboot工程 2.2.1 准备几个测试接口 2.3 准备Dockerfile文件 2.4 打包上传到服务器 三、制作微服务镜像与运行服务镜像 3.1 拷贝Dockerfile文件到服务器 3.2 制作服务镜像 3.3 启动镜像服务 3.4 访问一下服…...

get请求使用数组进行传参
get请求使用数组进行传参,无需添加中括号 mvc接口要添加参数名,使用array承接。不能用list, 否则会报错 这里是用apifox模拟前端调用。 前端调用代码 // 根据项目ID和角色ID查询相关审批人 export function findRelativeApproverByProjectIdAndRoleId(roleIds, p…...
20. 自动化测试框架开发之Excel配置文件的IO开发
20.自动化测试框架开发之Excel配置文件的IO开发 一、核心架构解析 1.1 类继承体系 class File: # 文件基类# 基础文件验证和路径管理class ExcelReader(File): # Excel读取器# 实现Excel数据解析逻辑1.2 版本依赖说明 # 必须安装1.2.0版本(支持xlsx格式&#…...

【MySQL成神之路】MySQL常用语法总结
目录 MySQL 语法总结 数据库操作 表操作 数据操作 查询语句 索引操作 约束 事务控制 视图操作 存储过程和函数 触发器 用户和权限管理 数据库操作 创建数据库: CREATE DATABASE database_name; 选择数据库: USE database_name; 删除数…...

Linux动静态库制作与原理
什么是库 库是写好的现有的,成熟的,可以复用的代码。现实中每个程序都要依赖很多基础的底层库,不可能每个人的代码都从零开始,因此库的存在意义非同寻常。 本质上来说库是一种可执行代码的二进制形式,可以被操作系统…...
确保高质量的音视频通话,如何最大化利用视频带宽
在当今数字时代,音视频内容随处可见,对于开发者来说,理解互联网带宽变得至关重要。我们的在线体验质量,无论是观看高清电影还是演唱会直播,都严重依赖于互联网带宽的概念。在本文中,我们将揭示视频带宽的复…...

ffmpeg 把一个视频复制3次
1. 起因, 目的: 前面我写过,使用 python 把一个视频复制3次但是速度太慢了,我想试试看能否改进。而且我想换一种新的视频处理思路,并试试看速度如何。 2. 先看效果 效果就是能行,而且速度也快。 3. 过程: 代码 1…...

GPT/Claude3国内免费镜像站更新 亲测可用
无限次使用:无限制的提问次数,不设上限,随心所欲。 无需魔法、稳定流畅:操作简便,无需复杂设置,即可享受稳定流畅的服务。 手机和电脑均能用:轻松适配手机和电脑,使用体验更佳。 …...
AI自动化工作流:开启当下智能生产力的价值
举手之言:AI自动化工作流创造了什么呢? AI自动化工作流 ,顾名思义,是将人工智能(AI)技术与自动化流程相结合,通过智能化的方式来完成复杂的任务和操作。简单来说,它就是利用AI的强大…...
stm32——EXTI外部中断
NVIC优先级分组 抢占优先级 可以进行中断嵌套的优先级,即可以不等上一个中断执行完成就进入下一个中断 响应优先级 决定中断发生的顺序,但不可嵌套 程序实现 对射式红外传感计次 #include "stm32f10x.h" // Device head…...

Python:操作Excel按行写入
Python按行写入Excel数据,5种实用方法大揭秘! 在日常的数据处理和分析工作中,我们经常需要将数据写入到Excel文件中。Python作为一门强大的编程语言,提供了多种库和方法来实现将数据按行写入Excel文件的功能。本文将详细介绍5种常见的Python按行写入Excel数据的方法,并附上…...

Redis进阶知识
Redis 1.事务2. 主从复制2.1 如何启动多个Redis服务器2.2 监控主从节点的状态2.3 断开主从复制关系2.4 额外注意2.5拓扑结构2.6 复制过程2.6.1 数据同步 3.哨兵选举原理注意事项 4.集群4.1 数据分片算法4.2 故障检测 5. 缓存5.1 缓存问题 6. 分布式锁 1.事务 Redis的事务只能保…...
Python机器学习笔记(二十三 模型评估与改进-网格搜索)
上一次学习了评估一个模型的泛化能力,现在继续学习通过调参来提升模型的泛化性能。scikit-learn中许多算法的参数设置,在尝试调参之前,重要的是要理解参数的含义。找到一个模型的重要参数(提供最佳泛化性能的参数)的取值是一项棘手的任务,但对于几乎所有模型和数据集来说…...

12.vue整合springboot首页显示数据库表-实现按钮:【添加修改删除查询】
vue整合springboot首页显示数据库表:【添加修改删除查询】 提示:帮帮志会陆续更新非常多的IT技术知识,希望分享的内容对您有用。本章分享的是node.js和vue的使用。前后每一小节的内容是存在的有:学习and理解的关联性。【帮帮志系…...

bisheng系列(一)- 本地部署(Docker)
目录 一、导读 二、说明 1、镜像说明 2、本节内容 三、docker部署 1、克隆代码 2、运行镜像 3、可能的错误信息 四、页面测试 1、注册用户 2、登陆成功 3、添加模型 一、导读 环境:Ubuntu 24.04、Windows 11、WSL 2、Python 3.10 、bisheng 1.1.1 背景…...

如何用Python批量解压ZIP文件?快速解决方案
如何用Python批量解压ZIP文件?快速解决方案 文章目录 **如何用Python批量解压ZIP文件?快速解决方案**代码结果详细解释 话不多说,先上干货!!! 代码 import os import zipfiledef unzip_file(dir_path: str…...

DriveGenVLM:基于视觉-语言模型的自动驾驶真实世界视频生成
《DriveGenVLM: Real-world Video Generation for Vision Language Model based Autonomous Driving》2024年8月发表,来自哥伦比亚大学的论文。 自动驾驶技术的进步需要越来越复杂的方法来理解和预测现实世界的场景。视觉语言模型(VLM)正在成…...
JavaScript 中的五种继承方式进行深入对比
文章目录 前言JavaScript 五种继承方式对比原型链继承构造函数继承组合继承寄生组合继承ES6 class extends 继承五种继承方式对比表前言 对 JavaScript 中的五种继承方式进行深入对比:原型链继承、构造函数继承、组合继承、寄生组合继承、以及 ES6 的 class extends。 内容将…...

企业标准信息公共服务平台已开放标准通编辑器访问入口
标准通 数字化标准编辑器 专业、高效、便捷 企业标准信息公共服务平台 近日,企业标准信息公共服务平台已开放标准通编辑器访问入口,可进入官网指定版块使用! 核心功能亮点 解决企业痛点 传统标准编制,需反复核对格式、逐条…...
[Linux]安装吧!我的软件包管理器!
一、常见安装方式 在 Linux 中,有 3 种常见的软件安装方式: (1)yam、apt (2).rpm 安装包安装 (3)源码安装 二、什么是软件包 在 Linux 下安装软件,通常的办法是下载…...
Spring Boot 与 RabbitMQ 的深度集成实践(三)
高级特性实现 消息持久化 在实际的生产环境中,消息的可靠性是至关重要的。消息持久化是确保 RabbitMQ 在发生故障或重启后,消息不会丢失的关键机制。它涉及到消息、队列和交换机的持久化配置。 首先,配置队列持久化。在创建队列时…...