C++ STL 中的二分查找函数(binary_search、lower_bound 和 upper_bound)

news2024/11/18 5:53:44

        二分搜索是竞争性编程或任何算法竞赛的重要组成部分,了解速记函数可以减少编写代码的时间。二分查找是最有效的查找算法。

        二分搜索是一种在排序数组中使用的搜索算法,通过重复将搜索间隔一分为二。二分查找的思想是利用数组已排序的信息,将时间复杂度降低到O(Log N)。 

使用二分搜索执行的一般操作:
1、寻找一个元素
2、下界 
3、上限

1. 二进制搜索:
        binary_search(start_ptr, end_ptr, num):如果元素存在于容器中,则该函数返回 true,否则返回 false。start_ptr变量保存二分查找的起点,end_ptr保存二分查找空间的结束位置,num是要查找的值。

binary_search函数的编码实现: 

// C++ code to demonstrate the working of binary_search()
 
#include <bits/stdc++.h>
using namespace std;
 
// Driver's code
int main()
{
    // initializing vector of integers
    vector<int> arr = { 10, 15, 20, 25, 30, 35 };
 
    // using binary_search to check if 15 exists
    if (binary_search(arr.begin(), arr.end(), 15))
        cout << "15 exists in vector";
    else
        cout << "15 does not exist";
 
    cout << endl;
 
    // using binary_search to check if 23 exists
    if (binary_search(arr.begin(), arr.end(), 23))
        cout << "23 exists in vector";
    else
        cout << "23 does not exist";
 
    cout << endl;
}

输出
15 存在于向量中
23 不存在

时间复杂度: O(log N) – 其中 N 是数组中的元素数量。
辅助空间: O(1)

2.下界:
        lower_bound(start_ptr, end_ptr, num):如果容器仅包含一次num,则返回指向 num 位置的指针。如果容器包含多次出现的 num,则返回指向 num 的第一个位置的指针。如果容器不包含num ,则返回指向刚好高于 num 的数字位置的指针,num是插入到已排序数组并再次排序时的数字位置。从指针中减去第一个位置,即 vect.begin(),返回实际索引。start_ptr变量保存二分查找的起点,end_ptr保存二分查找空间的结束位置,num是要查找的值。

lower_bound函数的编码实现:

// C++ code to demonstrate the working of lower_bound()
#include <bits/stdc++.h>
using namespace std;
 
// Driver's code
int main()
{
    // initializing vector of integers
    // for single occurrence
    vector<int> arr1 = { 10, 15, 20, 25, 30, 35 };
 
    // initializing vector of integers
    // for multiple occurrences
    vector<int> arr2 = { 10, 15, 20, 20, 25, 30, 35 };
 
    // initializing vector of integers
    // for no occurrence
    vector<int> arr3 = { 10, 15, 25, 30, 35 };
 
    // using lower_bound() to check if 20 exists
    // single occurrence
    // prints 2
    cout << "The position of 20 using lower_bound "
            " (in single occurrence case) : ";
    cout << lower_bound(arr1.begin(), arr1.end(), 20)
                - arr1.begin();
 
    cout << endl;
 
    // using lower_bound() to check if 20 exists
    // multiple occurrence
    // prints 2
    cout << "The position of 20 using lower_bound "
            "(in multiple occurrence case) : ";
    cout << lower_bound(arr2.begin(), arr2.end(), 20)
                - arr2.begin();
 
    cout << endl;
 
    // using lower_bound() to check if 20 exists
    // no occurrence
    // prints 2 ( index of next higher)
    cout << "The position of 20 using lower_bound "
            "(in no occurrence case) : ";
    cout << lower_bound(arr3.begin(), arr3.end(), 20)
                - arr3.begin();
 
    cout << endl;
}

输出
使用 lower_bound 的 20 的位置(在单次出现的情况下):2
使用 lower_bound 的 20 的位置(在多次出现的情况下):2
使用 lower_bound 的 20 的位置(在没有出现的情况下):2

时间复杂度: O(log N) – 其中 N 是数组中的元素数量。
辅助空间: O(1)

3.上限:
        upper_bound(start_ptr, end_ptr, num):如果容器包含一次num,则返回指向下一个比 num 大的数字的位置的指针。如果容器包含多次出现的 num,则返回指向比最后一次出现的 num 更大的下一个数字的第一个位置的指针。如果容器不包含num,则返回指向下一个比 num 大的数字的位置的指针。从指针中减去第一个位置,即 vect.begin(),返回实际索引。start_ptr变量保存二分查找的起点,end_ptr保存二分查找空间的结束位置,num是要查找的值。

upper_bound函数的编码实现:

// C++ code to demonstrate the working of upper_bound()
#include <bits/stdc++.h>
using namespace std;
 
// Driver's code
int main()
{
    // initializing vector of integers
    // for single occurrence
    vector<int> arr1 = { 10, 15, 20, 25, 30, 35 };
 
    // initializing vector of integers
    // for multiple occurrences
    vector<int> arr2 = { 10, 15, 20, 20, 25, 30, 35 };
 
    // initializing vector of integers
    // for no occurrence
    vector<int> arr3 = { 10, 15, 25, 30, 35 };
 
    // using upper_bound() to check if 20 exists
    // single occurrence
    // prints 3
    cout << "The position of 20 using upper_bound"
            " (in single occurrence case) : ";
    cout << upper_bound(arr1.begin(), arr1.end(), 20)
                - arr1.begin();
 
    cout << endl;
 
    // using upper_bound() to check if 20 exists
    // multiple occurrence
    // prints 4
    cout << "The position of 20 using upper_bound "
            "(in multiple occurrence case) : ";
    cout << upper_bound(arr2.begin(), arr2.end(), 20)
                - arr2.begin();
 
    cout << endl;
 
    // using upper_bound() to check if 20 exists
    // no occurrence
    // prints 2 ( index of next higher)
    cout << "The position of 20 using upper_bound"
            " (in no occurrence case) : ";
    cout << upper_bound(arr3.begin(), arr3.end(), 20)
                - arr3.begin();
 
    cout << endl;
}

输出
使用 upper_bound 的 20 的位置(在单次出现的情况下):3
使用 upper_bound 的 20 的位置(在多次出现的情况下):4
使用 upper_bound 的 20 的位置(在没有出现的情况下):2

时间复杂度: O(log N) – 其中 N 是数组中的元素数量。
辅助空间: O(1)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1655843.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

AMEYA360代理:稳先微车规WSD7025AD双通道高边智能开关介绍

高边开关是一种保护电子电路在过电流异常时免受电击穿破坏的电子元器件&#xff0c;与传统常规的保险丝不同&#xff0c;它通过负载电流检测防止系统组件因电流过大而造成短路损坏&#xff0c;在不损坏或恶化的条件下确保负载电流始终可控&#xff0c;提高汽车电气系统的可靠性…

统信UOS 1070如何制作GHOST镜像并安装到其他设备

原文链接&#xff1a;统信UOS 1070制作GHOST镜像并安装到其他设备 Hello&#xff0c;大家好啊&#xff01;对于想要快速部署多台计算机或在硬件更换后恢复系统的用户来说&#xff0c;制作一个GHOST镜像是一种非常高效的方法。今天&#xff0c;我将介绍如何在统信UOS 1070桌面操…

毕业论文怎么写? 推荐4个AI工具

写作这件事一直让我们从小学时期就开始头痛&#xff0c;初高中时期800字的作文让我们焦头烂额&#xff0c;一篇作文里用尽了口水话&#xff0c;拼拼凑凑才勉强完成。 大学时期以为可以轻松顺利毕业&#xff0c;结果毕业前的最后一道坎拦住我们的是毕业论文&#xff0c;这玩意不…

Golang | Leetcode Golang题解之第72题编辑距离

题目&#xff1a; 题解&#xff1a; func minDistance(word1 string, word2 string) int {m, n : len(word1), len(word2)dp : make([][]int, m1)for i : range dp {dp[i] make([]int, n1)}for i : 0; i < m1; i {dp[i][0] i // word1[i] 变成 word2[0], 删掉 word1[i], …

Spring IoCDI(1)—入门

目录 一、IoC & DI入门 1、Spring是什么 &#xff08;1&#xff09;什么是容器&#xff1f; &#xff08;2&#xff09;什么是IoC&#xff1f; 二、IoC介绍 1、传统程序开发 2、解决方案 3、IoC程序开发 4、IoC优势 三、DI介绍 通过前面的学习&#xff0c;我们知…

【项目实战】使用Yolov8 + tesseract 实现身份证信息解析(OCR) + 输入可为图片或者pdf + 完整代码 + 整体方案 + 全网首发

本项目可用于实验,毕业设计参考等。整体效果如下所示: 说明:图片来源于网络,如有侵权,请联系作者删除。 目录 一 数据集制作

【论文笔记】KAN: Kolmogorov-Arnold Networks 全新神经网络架构KAN,MLP的潜在替代者

KAN: Kolmogorov-Arnold Networks code&#xff1a;https://github.com/KindXiaoming/pykan Background ​ 多层感知机&#xff08;MLP&#xff09;是机器学习中拟合非线性函数的默认模型&#xff0c;在众多深度学习模型中被广泛的应用。但MLP存在很多明显的缺点&#xff1a;…

电机控制系列模块解析(19)—— 反电势观测器

随着现代工业自动化技术的飞速发展&#xff0c;交流电机作为关键的动力装置&#xff0c;其控制精度与效率日益受到重视。其中&#xff0c;无位置传感器控制技术由于其成本低、可靠性高、系统简洁等优点&#xff0c;逐渐成为研究热点。本文将对交流电机反电势观测器这一关键技术…

DevExpress Reporting 根据某个字段,合并单元格

1、根据字段值合并列&#xff08;设置为Merge、Value&#xff09; 2、根据字段Tag值合并列&#xff08;设置为Merge、Tag&#xff0c;并且手动绑定字段Tag值&#xff09;

uniapp + vue3 设置 axios proxy 代理,并重写路径

uniapp vue2 设置代理如下&#xff1a; 已生成的项目架构里面找到manifest.json文件&#xff0c;通过源码视图的方式打开文件&#xff0c;在文件中添加一下代码即可完成代理&#xff1a; "h5": {"devServer": {"disableHostCheck": true, //禁…

搜维尔科技:OptiTrack是基于LED墙虚拟制作舞台的最佳选择

OptiTrack因其绝对精度、易用性、可靠性以及与现场工具的完美集成而被选中&#xff0c;仍然是全球首屈一指的基于 LED 墙的虚拟制作舞台的选择。 当今虚拟制作阶段的低延迟、超精确摄像机跟踪标准 /- 0.2 毫米 位置精度1 < 10 毫秒 系统延迟 /- 0.1 度 旋转精度2 电影…

Windows电脑搭建HarmonyOS NEXTDeveloper Preview2环境详解

Windows电脑搭建HarmonyOS NEXTDeveloper Preview2环境详解&#xff1a; HarmonyOS NEXT Preview系列教程基于Api11讲解-IT营大地老师 1 、电脑要求以及注意事项 操作系统 &#xff1a; Windows10 64 位、 Windows11 64 位 内存 &#xff1a; 8GB 及以上&#xff0c;推荐 16G…

基于springboot实现公交线路查询系统项目【项目源码+论文说明】计算机毕业设计

基于SpringBoot实现公交线路查询系统演示 摘要 社会发展日新月异&#xff0c;用计算机应用实现数据管理功能已经算是很完善的了&#xff0c;但是随着移动互联网的到来&#xff0c;处理信息不再受制于地理位置的限制&#xff0c;处理信息及时高效&#xff0c;备受人们的喜爱。本…

解决在C#中方向键对控件焦点的控制

不要犹豫直接把下面这个程序复制进去就好了&#xff0c;不用担心0个引用&#xff0c;哈哈&#xff0c;可以的 public partial class MainForm : Form {public MainForm(){InitializeComponent();}protected override bool ProcessDialogKey(Keys keyData){// 检查是否是方向键…

RoNID:通过生成可靠标签与聚类友好型表征来实现新意图的发现

论文地址&#xff1a;https://arxiv.org/abs/2404.08977 原文地址&#xff1a;intents-are-not-going-away-ronid-is-a-new-intent-discovery-framework 2024 年 4 月 26 日 Robust New Intent Discovery&#xff08;RoNID&#xff09;框架致力于在开放域场景中识别已知意图并合…

Windows录屏怎么录?3个方法教会你

在Windows操作系统中&#xff0c;Windows录屏功能已经成为了许多用户日常工作与生活的必备工具。无论是教学演示、游戏直播&#xff0c;还是会议记录、视频教程制作&#xff0c;Windows录屏软件都能帮助我们轻松捕捉屏幕上的精彩瞬间。 本文将为您带来3种Windows录屏的方法&am…

1553B总线接口仿真卡,1553B IP核,适用于航空机载,飞机综合航电等领域

1553B总线接口卡可作为通讯或仿真测试板卡使用&#xff0c;支持USB&#xff0c;PCI&#xff0c;PXI&#xff0c;CPCI&#xff0c;以太网&#xff0c;RS422&#xff0c;RS485等计算机总线平台&#xff0c;单功能&#xff08;1个BC、0-31个RT和1个BM&#xff0c;当前仅可单工作模…

大模型相关技术-初识RAG

这个时候如果想对用户输入做一些过滤、对某种回答有了固定的答案怎么办呢&#xff1f;java程序员肯定就会想到写个filter或者intercepter&#xff0c;RAG就是在做类似的事情&#xff0c;只不过流程更加复杂。 RAG是什么 检索增强生成&#xff08;RAG&#xff09;是对大型语言…

c++:优先级队列(priority queue)使用及底层详解,附带仿函数初步使用

文章目录 优先级队列的使用大堆小堆**注意** 优先级队列的模拟实现pushpopsizeemptytop 仿函数仿函数是什么pushpop 仿函数结合优先级队列的优势 优先级队列的使用 优先级队列本质是就是完全二叉树,是个堆.我们可以用优先级队列来取出一段序列中的前N个最大值. priority_queue…

【k8s多集群管理平台开发实践】十二、开发总结及注意事项【完结】

文章目录 简介总结前面11章节所实现的功能&#xff1a; 一.完善集群更多功能1.1.可以扩展更多的功能 二.该系列课程代码地址三.技术栈及开发经验3.1.开发过程中所使用到的一些技术栈 四.开发过程中需要注意的事项五.反馈与交流 简介 该系列文章主要是介绍了多k8s集群平台开发的…