6.二分算法

二分

二分算法,也称为二分查找或折半查找,是一种在有序数组中查找特定元素的高效算法。以下是 C++ 中二分算法的相关内容:

算法原理

  • 二分算法的基本思想是将有序数组分成两部分,然后将目标值与中间元素进行比较。如果目标值等于中间元素,则查找成功;如果目标值小于中间元素,则在数组的左半部分继续查找;如果目标值大于中间元素,则在数组的右半部分继续查找。重复这个过程,直到找到目标值或者确定目标值不存在于数组中。
  • 通过 不断折半缩小搜索范围 的查找方式,时间复杂度为 O(log n),需满足:
    1. 数据存储在 线性结构(如数组)
    2. 数据必须 有序(升序/降序)

代码实现

以下是一个使用 C++ 实现二分算法的示例代码:

#include <iostream>
#include <vector>using namespace std;// 二分查找函数
int binarySearch(vector<int>& nums, int target) {int left = 0;int right = nums.size() - 1;while (left <= right) {// 避免溢出int mid = left + (right - left) / 2;if (nums[mid] == target) {return mid;}else if (nums[mid] < target) {left = mid + 1;}else {right = mid - 1;}}// 目标值不存在于数组中return -1;
}int main() {vector<int> nums = {1, 3, 5, 7, 9, 11, 13, 15, 17, 19};int target = 7;int result = binarySearch(nums, target);if (result!= -1) {cout << "目标值 " << target << " 在数组中的索引为:" << result << endl;}else {cout << "目标值 " << target << " 不存在于数组中。" << endl;}return 0;
}

复杂度分析

  • 时间复杂度:二分算法每次迭代都将搜索区间减半,因此时间复杂度为O(log n),其中 是n数组的长度。这使得二分算法在处理大规模数据时非常高效。
  • 空间复杂度:在上述代码中,除了输入的数组外,只使用了几个额外的变量,如leftrightmid,它们的数量不随输入规模增长,所以空间复杂度为O(1)。

应用场景

  • 数据查找:在有序数组或有序列表中快速查找特定元素,如在电话号码簿、字典等数据结构中查找特定的记录。
  • 求解方程:可以用于数值计算中求解方程的根。例如,对于一个单调递增或单调递减的函数,可以通过二分算法来逼近方程的解。
  • 优化问题:在一些优化问题中,二分算法可以用于搜索最优解的范围。例如,在寻找最小化或最大化某个目标函数的参数时,可以利用二分算法来缩小搜索空间。

注意事项

  • 二分算法要求数据必须是有序的。如果数据是无序的,需要先进行排序操作,这可能会增加额外的时间复杂度。
  • 在实现二分算法时,需要注意边界条件的处理,以确保算法的正确性和稳定性。

在库中

C++在STL库中已经封装好了二分算法,我们只需要引入调用即可。

<algorithm> 头文件中提供以下关键函数:

函数作用返回值
std::binary_search(beg, end, val)检查元素是否存在bool
std::lower_bound(beg, end, val)返回第一个 ≥val 的迭代器迭代器
std::upper_bound(beg, end, val)返回第一个 >val 的迭代器迭代器
#include <algorithm>
#include <vector>int main() {std::vector<int> nums = {1, 3, 5, 7, 9};// 查找是否存在bool exists = std::binary_search(nums.begin(), nums.end(), 5); // true// 查找插入位置auto lower = std::lower_bound(nums.begin(), nums.end(), 6); // 指向7int pos = lower - nums.begin(); // 插入位置索引为3// 统计元素出现次数auto upper = std::upper_bound(nums.begin(), nums.end(), 5);int count = upper - lower; // 1次
}

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

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

相关文章

大模型GUI系列论文阅读 DAY4续:《Large Language Model Agent for Fake News Detection》

摘要 在当前的数字时代&#xff0c;在线平台上虚假信息的迅速传播对社会福祉、公众信任和民主进程构成了重大挑战&#xff0c;并影响着关键决策和公众舆论。为应对这些挑战&#xff0c;自动化假新闻检测机制的需求日益增长。 预训练的大型语言模型&#xff08;LLMs&#xff0…

LevelDB 源码阅读:写入键值的工程实现和优化细节

读、写键值是 KV 数据库中最重要的两个操作&#xff0c;LevelDB 中提供了一个 Put 接口&#xff0c;用于写入键值对。使用方法很简单&#xff1a; leveldb::Status status leveldb::DB::Open(options, "./db", &db); status db->Put(leveldb::WriteOptions…

【Proteus仿真】【51单片机】多功能计算器系统设计

目录 一、主要功能 二、使用步骤 三、硬件资源 四、软件设计 五、实验现象 联系作者 一、主要功能 1、LCD1602液晶显示 2、矩阵按键​ 3、加减乘除&#xff0c;开方运算 4、带符号运算 5、最大 999*999 二、使用步骤 基于51单片机多功能计算器 包含&#xff1a;程序&…

利用Manim库结合`matplotlib`、`numpy`和`scipy`来制作工作流程动画

以下是一个利用Manim库结合matplotlib、numpy和scipy来制作工作流程动画&#xff0c;展示流场速度分布计算模型&#xff0c;以及三流喷嘴的速度场和主要参数分布的可视化图形与动画的示例代码。这个示例将模拟一个简化的三流喷嘴速度场&#xff0c;通过计算速度分布并将其可视化…

origin调整图像的坐标轴,修改坐标轴起始点,增量

接上一篇帖子&#xff0c;如果再修改数据之后或者当前的数据之间差距较小&#xff0c;怎么通过调整坐标轴来使数据之间的差距更明显&#xff0c;举个例子&#xff0c; 像下面这个图的entropy指标&#xff0c;都是介于6到9之间&#xff0c;如果y轴坐标都从0开始&#xff0c;使用…

Redis_Redission的入门案例、多主案例搭建、分布式锁进行加锁、解锁底层源码解析

目录 ①. Redis为什么选择单线程&#xff1f; ②. 既然单线程这么好,为什么逐渐又加入了多线程特性&#xff1f; ③. redis6的多线程和IO多路复用入门篇 ④. Redis6.0默认是否开启了多线程&#xff1f; ⑤. REDIS多线程引入总结 ①. Redis为什么选择单线程&#xff1f; ①…

集合的奇妙世界:Python集合的经典、避坑与实战

集合的奇妙世界&#xff1a;Python集合的经典、避坑与实战 内容简介 本系列文章是为 Python3 学习者精心设计的一套全面、实用的学习指南&#xff0c;旨在帮助读者从基础入门到项目实战&#xff0c;全面提升编程能力。文章结构由 5 个版块组成&#xff0c;内容层层递进&#x…

2025年1月个人工作生活总结

本文为 2025年1月工作生活总结。 研发编码 使用sqlite3命令行查询表数据 可以直接使用sqlite3查询数据表&#xff0c;不需进入命令行模式。示例如下&#xff1a; sqlite3 database_name.db "SELECT * FROM table_name;"linux shell使用read超时一例 先前有个编译…

ARM嵌入式学习--第十一天(中断处理 , ADC)

--中断的概念 中断是指计算机运行过程中&#xff0c;出现某些意外情况需主机干预时&#xff0c;机器能自动停止正在运行的程序并转入处理新情况的程序&#xff0c;处理完毕后又返回被暂停的程序继续运行 --CPU处理事情的方式 -轮询方式 不断查询是否有事情需要处理&#xff0c…

android Camera 的进化

引言 Android 的camera 发展经历了3个阶段 &#xff1a; camera1 -》camera2 -》cameraX。 正文 Camera1 Camera1 的开发中&#xff0c;打开相机&#xff0c;设置参数的过程是同步的&#xff0c;就跟用户实际使用camera的操作步骤一样。但是如果有耗时情况发生时&#xff0c;会…

JavaScript原型链与继承:优化与扩展的深度探索

在 JavaScript 的世界里&#xff0c;万物皆对象&#xff0c;而每个对象都有一个与之关联的原型对象&#xff0c;这就构成了原型链的基础。原型链&#xff0c;简单来说&#xff0c;是一个由对象的原型相互连接形成的链式结构 。每个对象都有一个内部属性[[Prototype]]&#xff0…

vue2项目(一)

项目介绍 电商前台项目 技术架构&#xff1a;vuewebpackvuexvue-routeraxiosless.. 封装通用组件登录注册token购物车支付项目性能优化 一、项目初始化 使用vue create projrct_vue2在命令行窗口创建项目 1.1、脚手架目录介绍 ├── node_modules:放置项目的依赖 ├──…

分层多维度应急管理系统的设计

一、系统总体架构设计 1. 六层体系架构 #mermaid-svg-QOXtM1MnbrwUopPb {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-QOXtM1MnbrwUopPb .error-icon{fill:#552222;}#mermaid-svg-QOXtM1MnbrwUopPb .error-text{f…

350.两个数组的交集 ②

目录 题目过程解法 题目 给你两个整数数组 nums1 和 nums2 &#xff0c;请你以数组形式返回两数组的交集。返回结果中每个元素出现的次数&#xff0c;应与元素在两个数组中都出现的次数一致&#xff08;如果出现次数不一致&#xff0c;则考虑取较小值&#xff09;。可以不考虑…

sublime_text的快捷键

sublime_text的快捷键 向下复制, 复制光标所在整行并插入到下一行&#xff1a;通过 CtrlShiftD 实现快速复制当前行的功能。 可选多行, 不选则复制当前行 ctrl Shift D 删除当前行&#xff1a;通过 CtrlShiftK 实现快速删除当前行的功能。 可选多行, 不选则删当前行 ctrl S…

[ACTF2020 新生赛]BackupFile1

题目 翻译&#xff0c;尝试找出源文件&#xff01; 扫目录使用参数-e * python dirsearch.py -u http://0c3b21c0-d360-4baa-8b97-aa244f4c4825.node5.buuoj.cn:81/ -e * 最终扫描到一个文件名为&#xff1a;/index.php.bak的文件&#xff0c;把备份文件下载下来 源码 <?…

OPENPPP2 —— VMUX_NET 多路复用原理剖析

在阅读本文之前&#xff0c;必先了解以下几个概念&#xff1a; 1、MUX&#xff08;Multiplexer&#xff09;&#xff1a;合并多个信号到单一通道。 2、DEMUX&#xff08;Demultiplexer&#xff09;&#xff1a;从单一通道分离出多个信号。 3、单一通道&#xff0c;可汇聚多个…

DeepSeek-R1大模型本地部署及简单测试

目录 DeepSeek-R1大模型本地部署及简单测试背景我的测试环境模型参数选择适用场景参数规模 本地部署安装 DeepSeek-R1大模型本地部署及简单测试 背景 最近deepseek非常火, 要说2025年震惊科技圈的事件要数DeepSeek这个国产AI的横空出世&#xff0c;这是一款免费、开源且隐私优…

C# 数组和列表的基本知识及 LINQ 查询

数组和列表的基本知识及 LINQ 查询 一、基本知识二、引用命名空间声明三、数组3.1、一维数组3.2、二维数组3.3、不规则数组 Jagged Array 四、列表 List4.1、一维列表4.2、二维列表 五、数组和列表使用 LINQ的操作和运算5.1、一维 LIST 删除所有含 double.NaN 的行5.2、一维 LI…

C++计算给定序列在多次修改前后满足特定条件的极大匹配方案的大小

给定长度为n的整数序列 a 1 , a 2 , . . . , a n a_1,a_2,...,a_n a1​,a2​,...,an​和长度为n的01序列 b 1 , b 2 , . . . , b n b_1,b_2,...,b_n b1​,b2​,...,bn​。 对于 1 ≤ i < j ≤ n 1\leq i<j\leq n 1≤i<j≤n&#xff0c;称二元组 ( i , j ) (i,j) (i,j)…