C++算法————二分查找

news/2024/7/10 4:33:01 标签: 算法, c++, 二分, 数据结构, 优化, 性能优化, 二分查找

又是鸽了三千万年

马上要打csp了,开始回流学j组的知识了,浅说一下二分吧()

---------------------------------------------------------------------------------------------------------------------------------

二分查找

二分查找,是一种极其高效的算法。它适用于在一个有序数组中找一个元素。注意:一定是有序,无序数组的查找答案是无意义的

假设在一个升序数组里寻找一个数字,定义一个区间,两个变量,表示区间的起始和终止坐标。每次去寻找这个区间内的中间值,分为三种可能性:

(1)这个数就是要找的,那么结束搜索。

(2)这个数比要找的小,那么改变区间的起始坐标,将区间整体右移。

 

 

(3)这个数比要找的大,那么改变区间的终止坐标,将区间整体左移。

那么我们定义一个循环,且区间的起始坐标默认为1,终止坐标默认为n,只要起始坐标小于等于终止坐标(意思是说,这个区间还存在)循环中每次去取这个区间的中间坐标,再按照刚才的步骤去对比,不断调整,直到跳出循环。

以上是升序数组的方法,降序则相反

核心代码:

其中left,right代表区间起始终止坐标,a代表原数组值,mid代表每次取的中间值

 在STL中,给出了三个有关二分查找的函数:upper_bound,lower_bound,binary_search,这三个函数使用前都需引用<algorithm>

1.upper_bound:返回序列中第一个大于等于此元素的值。运用形式:upper_bound(a,a+1+n,x),其中a与代码中的意思一样,都是目标数组,x为此元素。

2.lower_bound:返回序列中第一个大于此元素的值。运用形式:lower_bound(a,a+1+n,x),其中a与代码中的意思一样,都是目标数组,x为此元素。

3.binary_search:二分模版,输入一个元素,输出位置。binary_search(a,a+1+n,x),其中a与代码中的意思一样,都是目标数组,x为此元素。

需要注意的是:以上三个函数如果在序列中找不到目标元素(即大于目前元素或大于等于目前元素),那么就会返回a+1+n,是无效值。

以上三个函数默认是对升序数组进行排序,如果想要更改排序准则,需自写函数。如果想要对降序数组排序,可以这样:

先自写一个cmp排序数组

然后在函数的最后加上cmp,如:upper_bound(a,a+1+n,x,cmp)

二分查找例题: 

题目描述

输入 n 个不超过 10^9 的单调不减的(就是后面的数字不小于前面的数字)非负整数 a1​,a2​……,an​,然后进行 m 次询问。对于每次询问,给出一个整数 q,要求输出这个数字在序列中第一次出现的编号,如果没有找到的话输出 −1 。

输入格式

第一行 2 个整数n 和 m,表示数字个数和询问次数。

第二行 n 个整数,表示这些待查询的数字。

第三行 m 个整数,表示询问这些数字的编号,从 1开始编号。

输出格式

输出一行,m 个整数,以空格隔开,表示答案。

输入 #1
11 3
1 3 3 3 5 7 9 11 13 15 15
1 3 6
输出 #1
1 2 -1 

 题目中明确说“单调不减”,很明显的提示了不降序数列,直接套一下二分查找模版即可。

这道题就留给大家了,在这里不过多讲解了~

分析优劣性:

优点:高效,省时省力,算下来只有O(log n)的时间复杂度

缺点:不同的题目在判断情况时容易混淆“<"和“<="或者“>"和">="。

---------------------------------------------------------------------------------------------------------------------------------

今天对于二分查找的讲解就到这里,大家有问题随时评论区提问~~

 


http://www.niftyadmin.cn/n/437943.html

相关文章

影像组学技术的基础和应用

一、概述 1. 影像组学足迹史 2003年&#xff0c;Mark A. Kriegsman和Randy L. Buckner发表的关于视觉系统空间组织的研究文章The genetic and functional basis of the spatial organization of the visual system&#xff0c;为影像组学领域提供了先驱性思路&#xff0c;奠定…

python 嵌入式部署的知识点,嵌入式部署实例,常见框架

一、python嵌入式部署指什么 Python嵌入式部署是指将Python解释器和相关库嵌入到其他应用程序中&#xff0c;使其能够在目标设备上独立运行&#xff0c;而无需在该设备上预先安装Python解释器。这种部署方式可以简化目标设备上的安装过程&#xff0c;减少依赖项和安装步骤&…

如何在一台或多台电脑上禁用和管理USB接口的方法

如何在一台或多台电脑上禁用和管理USB接口的方法。 一、在WindowsXP中禁用和管理USB接口 1. 计算机未安装USB设备 这种情况可以采取将%SystemRoot%\Inf下的Usbstor.pnf和Usbstor.inf两个文件设置其用户的控制权限。 Step1&#xff1a;右击这两个文件&#xff0c;选择“属性→安…

ffmpeg 3.4 windows编译安装

准备工作: msys2安装 官网 MSYS2 下载完成后一直下一步即可&#xff0c;安装完成后windows搜索 MSYS2 启动MSYS2 MINGW64 打开窗口后运行以下命令 下载一些编译需要的东西 #修改源 sed -i "s#mirror.msys2.org/#mirrors.ustc.edu.cn/msys2/#g" /etc/pacman.d/mirr…

XSS注入——反射性XSS

xss注入的攻击步骤&#xff1a; 1.查找可能存在的注入点&#xff08;搜索框&#xff0c;留言板&#xff0c;注册&#xff09; 2.观察输出显示位置&#xff1a; html&#xff1a; 尖括号外部&#xff0c; 尖括号内部: 引号内部》闭合&#xff0…

MySQL中的锁(表锁、行锁)

锁是计算机协调多个进程或纯线程并发访问某一资源的机制。在数据库中&#xff0c;除传统的计算资源&#xff08;CPU、RAM、I/O&#xff09;的争用以外&#xff0c;数据也是一种供许多用户共享的资源。如何保证数据并发访问的一致性、有效性是所在有数据库必须解决的一个问题&am…

DJ2-5 内容分发网络 CDN

目录 单一的大规模数据中心 内容分发网络 CDN 单一的大规模数据中心 存在三个问题&#xff1a; ① 如果客户远离数据中心&#xff0c;服务器到客户的分组将跨越许多通信链路并很可能通过许多 ISP&#xff0c;给用户带来恼人的时延。 ② 流行的视频很可能经过相同的通信链路…

C++入门,一些C++基本概念介绍

文章目录 目录 前言 1.C关键字 1.1命名空间 1.2命名空间定义 1.3命名空间的使用 2.C输入&输出 3.缺省参数 3.1缺省参数的概念 3.2缺省参数分类 4.函数重载 4.1函数重载的概念 5.引用 5.1 引用特性 5.2 常引用 5.3引用的使用场景 5.4引用和指针 6.内联函数…