二分查找算法的全面解析C++

devtools/2025/2/24 15:08:08/

一、核心原理与特性

二分查找是一种**对数时间复杂度(O(log n))**的高效搜索算法46,需满足两个前提条件:

  1. 数据存储在连续内存空间(如数组)
  2. 数据按升序/降序有序排列35

算法通过折半比较缩小搜索范围:

  • 初始化左右边界left=0right=length-1
  • 计算中间位置mid = left + (right - left)/2(避免整数溢出)
  • 比较arr[mid]与目标值,调整左右边界18

二、标准实现步骤(C++迭代版)

Cpp

int binarySearch(int arr[], int size, int target) { int left = 0, right = size - 1; while (left <= right) { int mid = left + (right - left) / 2; if (arr[mid] == target) return mid; if (arr[mid] < target) left = mid + 1; else right = mid - 1; } return -1; // 未找到 }

关键点

  • 循环终止条件left <= right确保完整搜索区间覆盖48
  • 边界调整时mid±1避免死循环4

三、边界处理进阶

1. 查找第一个/最后一个匹配项

Cpp

// 查找第一个等于target的位置 int findFirst(int arr[], int size, int target) { int left = 0, right = size - 1, res = -1; while (left <= right) { int mid = left + (right - left)/2; if (arr[mid] >= target) { right = mid - 1; if (arr[mid] == target) res = mid; } else { left = mid + 1; } } return res; }

此变体通过记录临时结果处理重复元素26

2. 旋转数组查找

适用于部分有序数组(如[4,5,6,7,0,1,2]):

  • 通过比较arr[mid]与左右边界判断有序区间
  • 调整搜索方向至目标可能存在的区域76

四、应用场景与优化

场景类型适用案例优化策略
精确匹配有序数组元素定位标准二分法
范围查找统计成绩分布、查找IP归属地边界变体(lower/upper_bound)
数学问题转化求平方根、寻找峰值调整比较条件
工程实践数据库索引、缓存查找结合跳表等数据结构

五、调试工具推荐

  1. Valgrind:检测内存越界问题1
  2. 边界测试用例
    • 目标为第一个/最后一个元素
    • 数组中全为相同元素
    • 空数组或单元素数组

完整代码实现和进阶案例可参考146中的项目实例。当处理动态数据集时,建议结合平衡二叉搜索树(STL中的set/map)实现高效插入与查找。


http://www.ppmy.cn/devtools/161385.html

相关文章

网络安全入门 | TCP/IP协议栈核心协议详解(附攻防案例)

一、网络模型基础&#xff1a;OSI vs TCP/IP 1.1 经典OSI七层模型 7. 应用层 : HTTP/FTP/DNS 6. 表示层 : 数据加密/压缩 5. 会话层 : 建立/维护会话 4. 传输层 : TCP/UDP 3. 网络层 : IP/ICMP 2. 数据链路层 : ARP/PPP 1. 物理层 : 网线/光纤1.2 实际应用的TCP/I…

【js逆向入门】图灵爬虫练习平台 第七题

地址&#xff1a;aHR0cHM6Ly9zdHUudHVsaW5ncHl0b24uY24vcHJvYmxlbS1kZXRhaWwvNy8 打开f12&#xff0c;立马进入了debugger&#xff0c;处理一下&#xff0c;过debugger 请求接口&#xff0c;page代表第几页&#xff0c;关键是找到x的生成逻辑 再看请求标头&#xff0c;有关键参…

【Ubuntu】GPU显存被占用,但显示没有使用GPU的进程

文章目录 一、问题描述二、解决方案2.1 寻找问题进程2.2 尝试杀死相关进程2.3 投放核弹&#xff0c;一键全杀2.4 再次查看GPU使用情况 参考资料 一、问题描述 今天使用服务器的时候发现gpu被占了很多内存&#xff0c;但是使用 nvidia-smi 命令并没有发现占这么多显存的进程&am…

从零开始玩转TensorFlow:小明的机器学习故事 4

探索深度学习 1 场景故事&#xff1a;小明的灵感 前不久&#xff0c;小明一直在用传统的机器学习方法&#xff08;如线性回归、逻辑回归&#xff09;来预测学校篮球比赛的胜负。虽然在朋友们看来已经很不错了&#xff0c;但小明发现一个问题&#xff1a;当比赛数据越来越多、…

Webpack的持久化缓存机制具体是如何实现的?

Webpack 的持久化缓存机制是 Webpack 5 引入的一项重要特性&#xff0c;旨在提高构建速度和性能。通过将构建结果缓存到磁盘上&#xff0c;Webpack 可以在后续构建中重用先前的结果&#xff0c;减少不必要的重新计算。以下是持久化缓存机制的具体实现和工作原理。 一、持久化缓…

基于CNN的FashionMNIST数据集识别2——模型训练

源码 import copy import timeimport torch from torchvision.datasets import FashionMNIST from torchvision import transforms import torch.utils.data as Data import numpy as np import matplotlib.pyplot as plt from model import LeNet import torch.nn as nn impo…

解决videojs在ios端视频无法播放的问题

解决videojs在ios端视频无法播放的问题 问题描述&#xff1a;问题原因116为本地环境&#xff0c;为无缓存37为测试服务器 解决方法 问题描述&#xff1a; 在做多端嵌入的H5页面时&#xff0c;通过videojs插件做视频的播放&#xff0c;发现在web网页&#xff0c;andriod的app端…

苍穹外卖中的模块总结

本文总结苍穹外卖项目中可复用的通用设计 sky-common constant存放常量类&#xff0c;包括消息常量&#xff0c;状态常量 context是上下文对象&#xff0c;封装了threadlocal package com.sky.context;public class BaseContext {public static ThreadLocal<Long> thre…