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

C++学习:二分查找

二分查找的前提

库函数只能对数组进行二分查找。
对一个数组进行二分查找的前提是这个数组中的元素是单调的。
一般为单调不减,当然如果是单调不增也可以(需要修改比较函数)

例如:
[1,5,5,9,18]是单调的

[1 , 9, 9, 7, 15]不是单调的

[9,8,8,7,7,1]是单调的

binary_search函数

binary_search是C++标准库中的一个算法函数,用于在已排序的序列(例如数组或容器vector)中查找特定元素。

它通过二分查找算法来确定序列中是否存在目标元素。

函数返回一个bool值,表示目标元素是否存在于序列中。

如果需要获取找到的元素的位置,可以使用std::lower_bound函数或std::upper_bound函数。

vector <int> numbers = {1, 3, 5 , 7 ,9};int target = 5;bool found = binary_search(number.begin(),number.end(),target);if(found){cout << "Target element" << target << "found." << endl;
}else{cout << "Target element" << target << "not found." << endl;
}

lower_bound和upper_bound

前提:数组必须为非降序

如果要在非升序的数组中使用,可以通过修改比较函数实现(方法与sort自定义比较函数类似)

lower_bound(st,ed,_x)返回地址[st, ed)中第一个大于等于x的元素的地址

upper_bound(st,ed,x)返回地址[st,ed)中第一个大于x的元素的地址

如果不存在则返回最后一个元素的下一个位置,在vector中即end()

地址-首地址=下标

[lower_bound , upper_bound)

//初始化
vector <int> v={5,1,7,3,10,18,9};
//排序
sort(v.begin(),v.end());
for(auto &i : v)cout<< i<<'cout<<'\n';
//找到数组中第一个大于等于8的元素的位置
cout<<(lower_bound(v.begin(),v.end(),8)- v.begin())<<'\n';

例题:

#include <bits/stdc++.h>
using namespace std;
int main(void)
{int data[200];for(int i = 0 ; i < 200 ; i ++)data[i] = 4 * i + 6;int target  = 0;cin >> target;cout << (lower_bound(data,data+200,target)- data);return 0;
}
http://www.lryc.cn/news/300290.html

相关文章:

  • 语言与科技创新(大语言模型对科技创新的影响)
  • 【C语言】简单贪吃蛇实现保姆级教学!!!
  • rtt设备io框架面向对象学习-uart设备
  • Innodb下修改事务工作流程(buffer pool、redo log、undolog)
  • redis为什么使用跳跃表而不是树
  • 【matalab】基于Octave的信号处理与滤波分析案例
  • Elasticsearch:特定领域的生成式 AI - 预训练、微调和 RAG
  • HarmonyOS—UI 开发性能提升的推荐方法
  • 84 CTF夺旗-PHP弱类型异或取反序列化RCE
  • Duilib List 控件学习
  • 详细了解Node.js的配置与使用!
  • OpenCV 移动最小二乘图像变形
  • 【深度学习】S2 数学基础 P4 概率论
  • 跟我学c++中级篇——静态多态
  • 设计模式--桥接模式(Bridge Pattern)
  • 统计图饼图绘制方法(C语言)
  • 洛谷C++简单题小练习day12—寻找最小值小程序
  • 相机图像质量研究(13)常见问题总结:光学结构对成像的影响--鬼影
  • 车载诊断协议DoIP系列 —— 车辆以太网节点需求汇总
  • 掘根宝典之C++包含对象的类,私有继承,保护继承,三大继承方式总结
  • 第六篇:MySQL图形化管理工具
  • 计算机网络——12DNS
  • vue3-应用规模化-工具链
  • EasyExcel动态列导出
  • JAVA面试题11
  • 工业数据采集的时间不确定性及PLC-Recorder的通道偏移功能
  • 十五、Object 类
  • 计算机网络——06分组延时、丢失和吞吐量
  • [C#] 如何调用Python脚本程序
  • AlmaLinux更换鼠标样式为Windows样式