当前位置: 首页 > article >正文

【C/C++】无限长有序数组中查找特定元素

在无限长有序数组中查找特定元素,由于数组长度未知,需先定位搜索范围,再进行二分查找。以下是C++实现:

#include <iostream>
#include <vector>
#include <climits>
using namespace std;// 假设数组访问函数,实际使用时需根据具体环境实现
// 示例中假设数组元素为int,若索引超出实际存储范围返回INT_MAX
int get(int index) {// 实际实现需替换为访问数组的逻辑// 这里仅为示例,假设数组在内存中足够大或通过其他方式访问static vector<int> arr = {1, 3, 5, 7, 9, 11, /* ... 无限有序元素 ... */};if (index < arr.size()) return arr[index];return INT_MAX; // 索引超界返回最大值(假设数组递增)
}int searchInfiniteArray(int target) {int low = 0;int high = 1;// 步骤1:指数扩展确定搜索范围while (get(high) < target) {low = high;        // 移动下界high = high * 2;   // 上界指数扩展}// 步骤2:标准二分查找while (low <= high) {int mid = low + (high - low) / 2;int midVal = get(mid);if (midVal == target) {return mid;  // 找到目标} else if (midVal < target) {low = mid + 1;} else {high = mid - 1;}}return -1;  // 未找到
}int main() {int target = 7;int index = searchInfiniteArray(target);if (index != -1) {cout << "元素 " << target << " 位于索引 " << index << endl;} else {cout << "元素 " << target << " 不存在" << endl;}return 0;
}

关键步骤解析:

  1. 动态确定搜索范围

    • 初始化 low = 0, high = 1
    • 循环扩展:当 high 处元素小于目标时,将 low 移至 highhigh 倍增
    • 终止条件:high 处元素 ≥ 目标或超界(返回 INT_MAX
  2. 二分查找

    • 在确定的 [low, high] 区间内执行标准二分查找
    • 通过 get(index) 访问元素值
    • 找到目标返回索引,否则返回 -1

注意事项:

  • 时间复杂度O(log T)T 为目标元素的索引位置
  • 数组访问函数:需根据实际环境实现 get(index),若索引超界应返回足够大的值(如 INT_MAX
  • 边界处理:当目标大于所有元素时,循环因超界终止,二分查找返回 -1
  • 适用场景:适用于动态增长的有序数据流(如日志文件、实时数据流)

此方法高效利用指数扩展快速定位搜索范围,再通过二分查找精确匹配,适合处理无限或极大尺寸的有序数据集。

http://www.lryc.cn/news/2393654.html

相关文章:

  • SQL正则表达式总结
  • 力扣经典算法篇-13-接雨水(较难,动态规划,加法转减法优化,双指针法)
  • STM32 -- USB虚拟串口通信
  • uni-app开发特殊社交APP
  • Linux中Shell脚本的常用命令
  • RabbitMQ项目实战
  • 安卓开发用到的设计模式(3)行为型模式
  • 生成模型:从数据学习到创造的 AI 新范式
  • 尚硅谷redis7 90-92 redis集群分片之集群扩容
  • RabbitMQ性能调优:关键技术、技巧与最佳实践
  • 系统架构中的组织驱动:康威定律在系统设计中的应用
  • TypeScript 中高级类型 keyof 与 typeof的场景剖析。
  • Android LiveData 详解
  • 为什么共现矩阵是高维稀疏的
  • 离散化算法的二分法应用
  • IntelliJ IDEA 中进行背景设置
  • Dart语言学习指南「专栏简介」
  • AWS之AI服务
  • Docker 部署项目
  • 半导体厂房设计建造流程、方案和技术要点-江苏泊苏系统集成有限公司
  • (c++)string的模拟实现
  • 一种通用图片红色印章去除的工具设计
  • 企业应用AI对向量数据库选型思考
  • 时序数据库IoTDB安装学习经验分享
  • RapidOCR集成PP-OCRv5_det mobile模型记录
  • 当 Redis 作为缓存使用时,如何保证缓存数据与数据库(或其他服务的数据源)之间的一致性?
  • Dify理论+部署+实战
  • 内网穿透系列五:自建SSH隧道实现内网穿透与端口转发,Docker快速部署
  • 桥梁进行3D建模时的数据采集、存储需求及技术参数
  • Transformer架构技术学习笔记:从理论到实战的完整解析