二分查找算法详解及优化

二分查找算法详解:原理、实现与工程优化 二分查找是计算机科学中的经典算法,通过每次将搜索范围减半实现O(log n)时间复杂度,适用于有序数据集合的高效查询。其核心原理是通过维护左右指针不断缩小搜索区间,关键实现细节包括正确的中间值计算和边界条件处理。在数据库查询、日志分析等大数据量场景下,二分查找相比线性搜索能带来指数级性能提升。工程实践中需要注意内存访问优化和分布式环境适配,常见变体包括查找首次/末次出现位置等。掌握二分查找不仅能解决具体问题,更能培养分治思想和边界处理能力,是算法设计的典范。 阅读详情

二分查找算法的思路

在进行二分查找之前我们首先要明确一点,那就是要想使用二分查找,给的必须是一个有序序列,否则此方法无效

二分查找的思路其实很简单,就是将给定的序列从中间数分成两份,左边这一份都比中间数小,右边这一份都比中间数大,然后我们将要找的值和这个中间值比较大小,如果目标值比中间值大,说明目标值在右边这一份里,这时我们只需将右边这一份当作一个新的有序数组,再从其中间值分成两份,然后继续比较(即递归)直到找到目标。

在这里插入图片描述

二分查找代码

package search;

import java.util.Arrays;

public class BinarySearch {

	public static void main(String[] args) {
		
//		int [] arr = new int[100];
//		for(int i = 0; i < 100; i++) {
//			arr[i] = i + 1;
//		}
		
		int arr[] = { 1, 8, 10, 89,1000,1000, 1234 };
		
		int index = binarySearch(arr, 0, arr.length - 1, 1234);
		System.out.println("index = " + index);
		
		//System.out.println(Arrays.toString(arr));
	}
	
	public static int binarySearch(int[] arr, int left, int right, int findVal) {
		// 当 left > right 时,说明递归整个数组,但是没有找到
		if (left > right) {
			return -1;
		}
		int mid = (left + right) / 2;
		int midVal = arr[mid];

		if (findVal > midVal) { // 向 右递归
			return binarySearch(arr, mid + 1, right, findVal);
		} else if (findVal < midVal) { // 向左递归
			return binarySearch(arr, left, mid - 1, findVal);
		} else {

			return mid;
		}
}


二分查找的缺陷及优化

现在我们抛开时间复杂度不谈,二分查找的缺陷就是,你只能查找出目标值的一个索引,意思就是说,如果有相同的值,你只能找到其中一个,其他的找不到,因为二分查找一旦找到目标值他就直接返回目标值了,所以为了能查出所有目标值的索引,当找到目标值的时候,我们不直接返回,我们用一个集合先将它的索引存起来,然后继续查找,直到找完,然后返回这个集合

直接上代码

package search;

import java.util.ArrayList;
import java.util.List;

//注意:使用二分查找的前提是 该数组是有序的.
public class BinarySearch {

	public static void main(String[] args) {
		//int arr[] = { 1, 8, 10, 89,1000,1000, 1234 };
		int arr[] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 , 11, 12, 13,14,15,16,17,18,19,20 };

		
		List<Integer> resIndexList = binarySearch2(arr, 0, arr.length - 1, 1);
		System.out.println("resIndexList=" + resIndexList);
	}


	public static List<Integer> binarySearch2(int[] arr, int left, int right, int findVal) {

		System.out.println("hello~");
		// 当 left > right 时,说明递归整个数组,但是没有找到
		if (left > right) {
			return new ArrayList<Integer>();
		}
		int mid = (left + right) / 2;
		int midVal = arr[mid];

		if (findVal > midVal) { // 向 右递归
			return binarySearch2(arr, mid + 1, right, findVal);
		} else if (findVal < midVal) { // 向左递归
			return binarySearch2(arr, left, mid - 1, findVal);
		} else {
//			 * 思路分析
//			 * 1. 在找到mid 索引值,不要马上返回
//			 * 2. 向mid 索引值的左边扫描,将所有满足 1000, 的元素的下标,加入到集合ArrayList
//			 * 3. 向mid 索引值的右边扫描,将所有满足 1000, 的元素的下标,加入到集合ArrayList
//			 * 4. 将Arraylist返回
			
			List<Integer> resIndexlist = new ArrayList<Integer>();
			//向mid 索引值的左边扫描,将所有满足 1000, 的元素的下标,加入到集合ArrayList
			int temp = mid - 1;
			while(true) {
				if (temp < 0 || arr[temp] != findVal) {//退出
					break;
				}
				//否则,就temp 放入到 resIndexlist
				resIndexlist.add(temp);
				temp -= 1; //temp左移
			}
			resIndexlist.add(mid);  //
			
			//向mid 索引值的右边扫描,将所有满足 1000, 的元素的下标,加入到集合ArrayList
			temp = mid + 1;
			while(true) {
				if (temp > arr.length - 1 || arr[temp] != findVal) {//退出
					break;
				}
				//否则,就temp 放入到 resIndexlist
				resIndexlist.add(temp);
				temp += 1; //temp右移
			}
			
			return resIndexlist;
		}

	}
}

THE END

C++二分查找算法详解:原理、应用与性能优化 在计算机科学中,查找算法是处理数据检索的基础技术之一,其核心目标是在数据集中高效定位目标元素。基于有序序列的二分查找算法,通过分治策略将搜索范围每次减半,实现了对数级别的时间复杂度O(log n),极大提升了大规模数据查找效率。这一原理在数据库索引、游戏资源管理、配置查询等工程实践中具有重要价值。C++标准库中的std::binary_search函数封装了该算法,但需注意排序前提和等价性判断等关键细节。本文结合C++开发实践,深入解析二分查找的实现机制、常见陷阱以及与lower_bound等关联函数的关系 阅读详情

相关推荐

数据结构与算法15丨二分查找(上):如何用最省内存的方式实现快速查找功能?

二分查找的底层需要依赖数组这种数据结构,而数组为了支持随机访问的特性,要求内存空间连续,对内存的要求比较苛刻。比如,我们有 1GB 大小的数据,如果希望用数组来存储,那就需要 1GB 的连续内存空间。注意这里的“连续”二字,也就是说,即便有 2GB 的内存空间剩余,但是如果这剩余的 2GB 内存空间都是零散的,没有连续的 1GB 大小的内存空间,那照样无法申请一个 1GB 大小的数组。而我们的二分查找是作用在数组这种数据结构之上的,所以太大的数据用数组存储就比较吃力了,也就不能用二分查找了。

qq_53280238的博客 1150

二值图像连通域搜索BFS

// https://blog.youkuaiyun.com/weixin_41788963/article/details/104470487 //【算法笔记】基于广度优先搜索(BFS)求解图像连通域 //简介 //广度优先搜索,是以广度作为第一关键词,当碰到岔口时,首先访问这个岔口能直接到达的所有结点,然后这些结点被访问的顺序,依次继续访问其可以到达的所有结点,直到所有结点都被访问,或者满足终止条件; // //算法较为理想的实现方式是使用队列,将前面的元素不断弹出,在搜索过程中,将下一层的元素...

juluwangriyue的博客 1361

离散化算法详解:C++中的二分查找与哈希表实现对比

本文详细解析了离散化算法在C++中的两种实现方式:二分查找与哈希表。通过对比时间复杂度、内存占用和代码复杂度,帮助开发者根据具体场景选择最优方案。文章还探讨了离散化的核心原理、应用场景及工程实践建议,特别适合处理大规模稀疏数据。

weixin_42524276的博客 348

优化二分查找算法:从理论到实践的全面解析

最新接入DeepSeek-V3模型,点击下载最新版本InsCode AI IDE 优化二分查找算法:从理论到实践的全面解析 在计算机科学中,二分查找(Binary Search)是一种高效的搜索算法,适用于有序数组或列表。它通过不断将搜索区间减半来快速定位目标元素,时间复杂度为 O(log n),显著优于线性查找的 O(n)。本文将深入探讨二分查找的原理、实现步骤,并结合实际编程场景,展示如何利用...

inscode_067的博客 1165

OpenClaw Docker 安装问题解决全记录

控制面板无法加载(WebSocket 错误) | 确认 Nginx 配置中的 `Upgrade` 和 `Connection` 头正确 || 网关容器无法启动 | `docker compose logs openclaw-gateway`,检查权限、镜像名 |如需消除,使用 Let's Encrypt |- `<your-token>`:你的 OpenClaw 网关令牌(如 `b0e5ab...`)将 `<nas-ip>` 替换为你的群晖内网 IP(例如 `192.168.1.100`)。

u014490376的博客 2308

微型纵向加密在新能源场站中的实战部署与运维避坑指南

本文详细解析了微型纵向加密在新能源场站中的实战部署与运维技巧。通过国密算法SM4实现数据加密,确保新能源场站通信安全,同时提供非侵入式部署方案和运维避坑指南,帮助提升网络稳定性和运维效率。

weixin_30505225的博客 595

优化搜索算法:二分查找的深度解析与实践

最新接入DeepSeek-V3模型,点击下载最新版本InsCode AI IDE 优化搜索算法:二分查找的深度解析与实践 在计算机科学中,搜索算法是编程和数据处理的核心部分。其中,二分查找(Binary Search)以其高效性和简洁性脱颖而出,成为许多开发者在处理有序数据时的首选。本文将深入探讨二分查找的工作原理、应用场景,并通过实际案例展示如何使用智能化工具InsCode AI IDE来实现高...

inscode_086的博客 1168

Arduino for ESP32-----ESP-NOW介绍及使用

ESP-NOWESP-NOW介绍ESP-NOW支持以下特性ESP-NOW技术也存在以下局限性获取ESP32的MAC地址ESP-NOW单向通信(One-way communication)ESP32单板间的双向通信一对多通信(一发多收)一对多通信(多发一收) ESP-NOW介绍 ESP-NOW是一种由Espressif开发的协议,可以让多个设备在不使用Wi-Fi的情况下相互通信。该协议类似于低功耗的2.4GHz无线连接。设备之间的配对需要在通信之前完成。配对完成后,连接是安全的、点对点的,不需要握手。这意味着

Better_man1的博客 2万+

GBi-Net理解

看完新论文,记录并分享。

如人饮水、冷暖自知 2269

超全!!snowboy语音唤醒(树莓派4b)

通过snowboy进行树莓派的语音唤醒

crimaster1024的博客 8733

使用Anaconda和conda快速搭建YOLO开发环境

本文详细介绍了如何使用Anaconda和conda为YOLO目标检测项目快速搭建独立、纯净的开发环境。通过创建虚拟环境,有效解决了Python包版本冲突和CUDA兼容性问题,并指导安装GPU版PyTorch等核心依赖,最后通过验证脚本确保环境配置成功,为YOLO开发提供了稳定可靠的基础。

weixin_28829629的博客 161

二分查找算法及其优化

二分查找是一种非常高效的算法,又称折半查找,下面用递归和非递归实现 二分查找的思想 有序序列,每次取序列的中间元素和目标元素进行对比,每次缩小一半的查找范围,这样直到找到为止。 二分查找图示说明:(图片来自百度) 使用递归实现 public static int recursionBinarySearch(int[] arr,int key,int low,int high){ if(k...

芒果就是没有盲的博客 2143

NCBI Datasets CLI优化:解决基因组数据下载报错与速度问题

基因组数据下载是生物信息学分析的关键环节,其稳定性和效率直接影响研究进度。NCBI Datasets CLI作为官方命令行工具,常面临连接中断和下载速度慢两大痛点,这主要源于服务器连接限制和网络传输问题。通过自动重试机制和校验修复流程可提升稳定性,而连接复用与CDN加速等技术能显著提高下载效率。在植物基因组等大规模数据场景中,结合脱水模式和增量更新策略可减少70%传输量。本文以艾草基因组项目为例,展示如何通过并行下载和API优化将100个基因组的下载时间从18小时缩短至2小时,为生物信息学研究提供可靠的数据

weixin_29051245的博客 242

C++二分查找算法详解:从基础实现到工业级应用与性能优化

二分查找是一种基于有序数据集合的高效搜索算法,其核心原理是通过每次比较将搜索空间减半,从而将时间复杂度从线性O(n)降至对数级O(log n)。这种减治思想在计算机科学中具有重要技术价值,广泛应用于数据库索引(如B+树)、操作系统内存管理及分布式系统路由等底层基础设施。在工程实践中,二分查找不仅是算法面试的高频考点,更是实现快速检索、解决最优化问题的关键技术。本文以C++为例,深入剖析二分查找的边界条件、整数溢出陷阱及STL标准库实现,并探讨其在内存键值存储、峰值查找及二分答案等场景中的实战应用,帮助开发者

weixin_33894640的博客 594

【博文汇总】I2C总线学习

将这一周学习I2C总线的文章汇总一下。 基础知识学习 触发器的建立时间和保持时间 如何学习总线技术 TTL电平和CMOS电平 深入理解 关于I2C和SPI总线协议 I2C总线深入浅出 I2C总线信号时序总结 对I2C总线协议的一些理解 对I2C总线的时钟同步和总线仲裁的深入理解 I2C总线学习终结,开始SPI总线的学习 深入理解IIC总线时序

ce123的技术博客 6213

TI硬件笔试面试题型解析上

摘要: 本专栏聚焦大厂硬件笔试面试题解析,当前第14期以德州仪器(TI)为例,涵盖模拟电路与数字电路核心考点。模拟电路部分涉及最大功率传递定理、运放设计(虚短/虚断)、共模抑制比(CMRR)及高频PCB信号完整性;数字电路包括CMOS与TTL对比、建立/保持时间、竞争冒险消除、D触发器分频及“线与”逻辑实现。文章强调通过例题掌握解题方法与知识点,助力读者应对硬件工程岗位的笔试与面试挑战,附常见考点总结与实用建议。全文注重理论与实践结合,提供典型题型解析与设计思路。(150字)

启芯硬件的博客 950

【算法详解】斐波那契查找(黄金分割查找)——二分查找的优雅优化

斐波那契查找是一种基于黄金分割原理的优化二分查找算法。文章从二分查找的缺点切入,指出斐波那契查找通过斐波那契数列特性(0.618黄金分割比)改进mid计算方式,用加减法替代除法运算提升效率。核心原理是将数组按斐波那契数列比例分割(F[k-1]-1和F[k-2]两部分),mid计算公式为mid=low+F[k-1]-1。相比二分查找,斐波那契查找在特定数据分布下能减少比较次数,时间复杂度仍为O(logn)但常数项更优,是一种兼顾效率与优雅的查找算法。

weixin_68315058的博客 655

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

二分查找算法&最靠左索引&最靠右索引详解与优化:图文全解+代码详注+思路分析

java实现二分查找,二分查找算法实现思路,二分查找算法时间复杂度与空间复杂度,二分查找平衡版,Java源码中二分查找的使用,实现二分查找目标值,不存在则插入Rightmost,Leftmost,最靠左索引,最靠右索引,返回≥目标的最靠左索引,搜索大于等于目标值的最小索引位置 ,返回≤目标的最靠右索引,搜索小于等于目标值的最大索引位置,范围查询,求排名,求前任,求后任,求最近邻居

是谢添啊 3410

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

数据结构与算法笔记:基础篇 - 二分查找(上):如何用最省内存的方式实现快速查找功能?

二分查找的底层依赖数组这种数据结构,而数组为了支持随机访问的特性,要求内存空间连续,对内存的要求比较苛刻。比如,我们有 1GB 大小的数据,如果希望用数组来存储,那就需要 1GB 的连续内存空间。注意这里的 “连续” 二字,也就是说,即便有 2GB 的内存剩余空间,但是如果这剩余的 2GB 内存都是零散的,没有连续的 1GB 大小的内存空间,那照样无法申请一个 1GB 大小的数组。而我们的 二分查找是作用在数组这种数据结构之上的,所以太大的数据用数组存储就比较吃力了,也就不能用二分查找了。

chenjian723122704的专栏 729

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

【优选算法必刷100题】第021-022题(二分查找):山峰数组的的峰顶索引、寻找峰值

算法题解:山峰数组与寻找峰值 核心内容: 通过二分查找解决山峰数组峰顶索引问题(LeetCode 852) 运用二段性分析处理寻找峰值问题(LeetCode 162) 关键思路: 山峰数组:根据峰顶左右数据的不同趋势特性(左边上升、右边下降),通过比较mid与mid-1的值来缩小搜索范围 寻找峰值:利用数组边界为负无穷的特性,通过比较当前点与相邻点的值确定峰值所在区间 实现要点: 均采用二分查找框架,时间复杂度O(logN) 代码简洁高效,分别用不同条件判断移动左右指针

心向往之,行必能至 1040

2025大厂算法面试通关指南:从二分查找到动态规划的实战突破

《Hello 算法》是一本动画图解、一键运行的数据结构与算法教程,支持 Java, C++, Python, Go, JS, TS, C#, Swift, Rust, Dart, Zig 等语言,能帮助你系统掌握算法知识,轻松应对大厂算法面试。 ## 一、算法面试核心考点解析 在大厂算法面试中,二分查找和动态规划是高频考点,掌握这两大算法能让你在面试中脱颖而出。二分查找以其高效的查找效率,在处

gitblog_01130的博客 1371

TBOX算法库终极指南:10个常用算法实战解析与性能优化技巧

TBOX是一个类似glib的跨平台C语言库,提供了丰富的算法实现,帮助开发者快速构建高效应用。本文将深入解析TBOX算法库中10个常用算法的实战应用与性能优化技巧,让你轻松掌握算法的正确使用方法。 ## 一、TBOX算法库概述 TBOX算法库位于`src/tbox/algorithm/`目录下,提供了从基础排序到高级查找的完整算法实现。核心头文件[algorithm.h](https://li

gitblog_00604的博客 918

30字内点亮你的代码:二分查找高效指南

这段代码实现了高效的二分查找算法,适用于有序数组中的元素查找。核心内容包括:1) 预处理指令禁用VS警告;2) 类型定义Etype增强代码可维护性;3) twoFind函数实现二分查找,时间复杂度为O(log n);4) 主函数初始化1000元素数组并处理用户输入。算法通过比较中间值调整查找范围,最多10次比较即可完成搜索。建议增加输入验证、动态数组和错误处理等改进。

2301_81451531的博客 284

go语言实现二分查找算法(附带源码)

go语言实现二分查找算法(附带源码)

欢迎来到我的博客!这里是一个专注于计算机技术的分享平台,涵盖编程开发、算法研究、系统架构、软件工程等多个领域。无论你是初学者还是资深开发者,都能在这里找到有价值的内容。 970

二分查找算法总结

1 二分查找简介   二分查找也叫折半查找,是一种常见的查找方法,它将原本是线性时间提升到了对数时间范围,大大缩短了搜索时间。   二分查找必须具备两个条件,一是数列必须使用顺序存储结构(例如数组),二是数列必须有序。 2 二分查找的原理及实现   以升序数列为例,比较一个元素与数列中的中间位置的元素的大小,如果比中间位置的元素大,则继续在后半部分的数列中进行二分查找;如果比中间位置的元素小,则在数列的前半部分进行比较;如果相等,则找到了元素的位置。   每次比较的数列长度都会是之前数列的一半,直到找到相等

Summer_night_star的博客 8139

二分查找(算法)

主要使用场景:在有序数组中找到一个期望的对象算法模板:1:定义 left ,right 指针,分别指向数组的左右区间。2: 找到待查找区间的中间点 mid ,找到之后分三种情况讨论:i. arr[mid] == 查找值说明正好找到,返回 mid 的值ii.arr[mid]>查找值,说明 [mid, right] 这段区间都是⼤于查找值的,因此舍去右边区间,在左边 [left, mid -1] 的区间继续查找,即让 right = mid - 1 ,然后重复 2 过程;

2301_81831423的博客 1719
上一篇: 常用排序算法的时间复杂度和稳定性
下一篇: 插值查找算法详解
interesting_code
博客等级 码龄7年 38粉丝 37原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值