二分法binary search

 

欢迎来到@一夜看尽长安花 博客,您的点赞和收藏是我持续发文的动力

对于文章中出现的任何错误请大家批评指出,一定及时修改。有任何想要讨论的问题可联系我:3329759426@qq.com 。发布文章的风格因专栏而异,均自成体系,不足之处请大家指正。

    专栏:

  • java全栈
  • C&C++
  • PythonAI
  • PCB设计

文章概述:ACM算法 ——二分查找

关键词:ACM  二分法  整数二分  浮点数二分

本文目录

二分法binary search

整数二分

原理:

步骤

示例:

浮点数二分

原理:

算法特性:

优点与局限性

 

 

二分法binary search

是一种基于分治策略的高效搜索算法。它利用数据的有序性,每轮缩小一半搜索范围,直至找到目标元素或搜索区间为空为止。

整数二分

原理:

一定要保证mid 在区间内

强调边界问题:计算mid时要不要加1

定义了某种性质,使左半边不满足,右半边满足

分别找到对应的红色边界点和绿色边界点,对应两种模版:

步骤

1.如果二分出红色点

mid =(l+r+1) >> 2

if(check(mid))

{

true mid<=target   target在 [mid,r]之间         更新 l=mid;

false mid>target     target在 [l,mid-1 ]之间     更新 r=mid-1;

}

2.如果二分出绿色点

mid =(l+r) >> 2

if(check(mid))

{

true mid>=target   target在[l,mid ] 之间       更新 r=mid;

false mid<target   target在 [mid+1,r]之间     更新 l=mid+1;

}

示例:

#include <iostream>
#include <cstring>
#include <algorithm>using namespace std;const int N = 100010;
int n, m;
int q[N];int main()
{// 读取n和m的值scanf("%d%d",&n,&m);// 读取长度为n的数组for (int i = 0; i < n; i++)  scanf("%d", &q[i]);// 处理m个查询while (m--){int x;// 读取查询值xscanf("%d", &x);int l = 0, r = n - 1;// 二分查找左边界while (l < r){int mid = (l + r) >> 1; // 等价于(l + r) / 2if (q[mid] >= x) r = mid;else l = mid + 1;}// 如果没有找到xif (q[l] != x) cout << "-1 -1" << endl;else{// 输出左边界cout << l << ' ';l = 0; r = n - 1;// 二分查找右边界while (l < r){int mid = (l + r + 1) >> 1; // 等价于(l + r + 1) / 2if (q[mid] <= x) l = mid;else r = mid - 1;}// 输出右边界cout << l << endl;}}return 0;
}

浮点数二分

原理:

不需要考虑过多边界问题

因为浮点数二分就是确切的一半

类似整数二分

#include <iostream>
#include <cstdio>using namespace std;int main()
{double x;// 使用cin读取输入cin >> x;// 初始化二分法的左右边界double l = -10000, r = 10000; // 范围足够大,可以包含所有可能的浮点数值// 经验值:当误差小于1e-8时停止迭代while (r - l > 1e-8){double mid = (l + r) / 2;if (mid * mid * mid >= x)r = mid;elsel = mid;}// 输出计算结果,保留6位小数printf("%.6lf\n", l);return 0;
}

算法特性:

时间复杂度为 𝑂(log⁡𝑛) :在二分循环中,区间每轮缩小一半,因此循环次数为 log2⁡𝑛 。

空间复杂度为 𝑂(1) :指针 𝑖 和 𝑗 使用常数大小空间。

优点与局限性

二分查找在时间和空间方面都有较好的性能。

  • 二分查找的时间效率高。在大数据量下,对数阶的时间复杂度具有显著优势。例如,当数据大小 𝑛=220 时,线性查找需要 220=1048576 轮循环,而二分查找仅需 log2⁡220=20 轮循环。
  • 二分查找无须额外空间。相较于需要借助额外空间的搜索算法(例如哈希查找),二分查找更加节省空间。

然而,二分查找并非适用于所有情况,主要有以下原因。

  • 二分查找仅适用于有序数据。若输入数据无序,为了使用二分查找而专门进行排序,得不偿失。因为排序算法的时间复杂度通常为 𝑂(𝑛log⁡𝑛) ,比线性查找和二分查找都更高。对于频繁插入元素的场景,为保持数组有序性,需要将元素插入到特定位置,时间复杂度为 𝑂(𝑛) ,也是非常昂贵的。
  • 二分查找仅适用于数组。二分查找需要跳跃式(非连续地)访问元素,而在链表中执行跳跃式访问的效率较低,因此不适合应用在链表或基于链表实现的数据结构。
  • 小数据量下,线性查找性能更佳。在线性查找中,每轮只需 1 次判断操作;而在二分查找中,需要 1 次加法、1 次除法、1 ~ 3 次判断操作、1 次加法(减法),共 4 ~ 6 个单元操作;因此,当数据量 𝑛 较小时,线性查找反而比二分查找更快。

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

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

相关文章

解决一下git clone失败的问题

1&#xff09;.不开梯子&#xff0c;我们用https克隆 git clone https://github.com 报错&#xff1a; Failed to connect to github.com port 443 after 2091 ms: Couldnt connect to server 解决办法&#xff1a; 开梯子&#xff0c;然后# 注意修改成自己的IP和端口号 gi…

Java时间练习(7) (2024.7.17)

LocalDate、LocalTime、LocalDateTime类 package LocalExercise20240717; import java.time.LocalDate; import java.time.LocalTime; import java.time.LocalDateTime; import java.time.format.DateTimeFormatter;public class LocalExercise {public static void main(Stri…

跟ChatGPT学习go语言-利用Go语言封装一个adb命令函数

问&#xff1a;在go语言中&#xff0c;根据不同的操作系统&#xff0c;选择adb文件路径来进行执行&#xff0c;封装成一个函数 package mainimport ("fmt""os/exec""runtime" )// GetADBPath 根据操作系统获取 ADB 可执行文件的路径 func GetAD…

docker搭建普罗米修斯监控gpu

ip8的服务器监控ip110和ip111的服务器 被监控的服务器110和111只需要安装node-export和nvidia-container-toolkit 下载镜像包 docker pull prom/node-exporter docker pull prom/prometheus docker pull grafana/grafana新建目录 mkdir /opt/prometheus cd /opt/prometheus/…

生信软件27 - 基于python的基因注释数据查询/检索库mygene

1. mygene库简介 MyGene.info提供简单易用的REST Web服务来查询/检索基因注释数据&#xff0c;具有以下特点&#xff1a; mygene技术文档&#xff1a; https://docs.mygene.info/en/latest/ 多物种支持: 包括人、小鼠、大鼠、斑马鱼等多个模式生物&#xff1b; 多数据源聚合…

卷积神经网络图像识别车辆类型

卷积神经网络图像识别车辆类型 1、图像 自行车: 汽车: 摩托车: 2、数据集目录 3、流程 1、获取数据,把图像转成矩阵,并随机划分训练集、测试集 2、把标签转为数值,将标签向量转换为二值矩阵 3、图像数据归一化,0-1之间的值 4、构造卷积神经网络 5、设置图像输入…

记录些MySQL题集(8)

ACID原则、事务隔离级别及事务机制原理 一、事务的ACID原则 什么是事务呢&#xff1f;事务通常是由一个或一组SQL组成的&#xff0c;组成一个事务的SQL一般都是一个业务操作&#xff0c;例如聊到的下单&#xff1a;「扣库存数量、增加订单详情记录、插入物流信息」&#xff0…

Qt5.12.2安装教程

文章目录 文章介绍下载连接安装教程 文章介绍 安装Qt5.12.2 下载连接 点击官网下载 安装包下载完毕 安装教程 点开设置&#xff0c;添加临时储存库&#xff0c;复制连接“https://download.qt.io/online/qtsdkrepository/windows_x86/root/qt/” 点击测试&#xff0…

谷歌搜索引擎:知识殿堂与全球网络连通的桥梁

谷歌搜索引擎&#xff0c;其标志性的名称已成为互联网的象征。每次启动电脑&#xff0c;我总会习惯性地在洁白的搜索框内输入疑惑。谷歌如同一位博学多才的朋友&#xff0c;总能迅捷地提供满意解答。其界面设计简约明快&#xff0c;仅有标志性的彩色"Google"字样与搜…

HDFS和ES

HDFS&#xff08;Hadoop Distributed File System&#xff09;和 Elasticsearch&#xff08;ES&#xff09;是两种不同类型的分布式系统&#xff0c;分别用于存储和搜索数据。它们在设计目标、架构、使用场景等方面有显著的区别。以下是对 HDFS 和 ES 的详细比较&#xff1a; …

孟德尔随机化——混杂SNP剔除之LDlink(1)

1、注册&#xff1a;LDlink | An Interactive Web Tool for Exploring Linkage Disequilibrium in Population Groups 邮箱会收到12个字符串的token&#xff0c;使用时需要提供token 2、包内方法 LDexpress Determine if genomic variants are associated with gene express…

352_C++_管理用户登录计数器的类,其中有定时器m_timer操作,定时修改【登录锁定时间】和【错误次数】

~~ 头文件 #pragma once#include "commonfunction.h" #include <boost/asio/steady_timer.hpp> #include <set> #include

第13章 更多的结构化命令《Linux命令行与Shell脚本编程大全笔记》

13.1 For命令 格式&#xff1a;for var in list;dofor命令默认按照空格、制表符、换行符作为字段分隔符区分单个值&#xff0c;如果某个值含有空格要使用双引号从命令中读取值列表for state in $(cat $file)更改字段分隔符IFS(internal field separator)IFS$\n可能的需求&…

set类和map类介绍和简单使用

目录 set类介绍与简单使用 set类 multiset类 map类介绍与简单使用 map类 multimap类 set类介绍与简单使用 set类是一种关联式容器&#xff0c;在数据检索时比序列式容器效率更高。本质是一个常规的二叉搜索树&#xff0c;但是为了防止出现单支树导致效率下降进行了相关优…

【Linux】将IDEA项目部署到云服务器上,让其成为后台进程(保姆级教学,满满的干货~~)

目录 部署项目到云服务器什么是部署一、 创建MySQL数据库二、 修改idea配置项三、 数据打包四、 部署云服务器五、开放端口号六 、 验证程序 部署项目到云服务器 什么是部署 ⼯作中涉及到的"环境" 开发环境:开发⼈员写代码⽤的机器.测试环境:测试⼈员测试程序使⽤…

SQL面试题-留存率计算

表定义&#xff1a; create table if not exists liuliang_detail (user_id string comment ,record_time string comment yyyymmdd hh:mi:ss ) comment 流量明细表 ; 方法一&#xff1a; 计算的是整段时间范围内&#xff0c;每一天为基准的所有的留存1、2、7天的用户数。 …

WEB前端05-JavaScrip基本对象

JavaScript对象 1.Function对象 函数的创建 //方法一&#xff1a;自定义函数 function 函数名([参数]) {函数体[return 表达式] }//方法二&#xff1a;匿名函数 (function([参数]) {函数体[return 表达式] }); **使用场景一&#xff1a;定义后直接调用使用(只使用一次) (fun…

GitHub每日最火火火项目(7.17)

项目名称&#xff1a;aider 项目介绍&#xff1a;aider 是一个在终端中实现 AI 结对编程的项目。它能够为开发者提供智能的编程辅助&#xff0c;帮助开发者更高效地完成编程任务。通过与 AI 的协作&#xff0c;开发者可以获得实时的代码建议、错误修复提示等&#xff0c;从而提…

成为git砖家(1): author 和 committer 的区别

大家好&#xff0c;我是白鱼。一直对 git author 和 committer 不太了解&#xff0c; 今天通过 cherry-pick 的例子搞清楚了区别。 原理 例如我克隆了著名开源项目 spdlog 的源码&#xff0c; 根据某个历史 commit A 创建了分支&#xff0c; 然后 cherry-pick 了这个 commit …

《系统架构设计师教程(第2版)》第11章-未来信息综合技术-06-云计算(Cloud Computing) 技术概述

文章目录 1. 相关概念2. 云计算的服务方式2.1 软件即服务 (SaaS)2.2 平台即服务 (PaaS)2.3 基础设施即服务 (IaaS)2.4 三种服务方式的分析2.4.1 在灵活性2.4.2 方便性方 3. 云计算的部署模式3.1 公有云3.2 社区云3.3 私有云3.4 混合云 4. 云计算的发展历程4.1 虚拟化技术4.2 分…