【基础算法】二分算法详解

news2025/4/22 8:18:22

🎯 前言:二分不是找某个数,而是找一个满足条件的位置/值
所以最关键的是:找到单调性,写好 check() 函数,剩下交给模板!

什么是二分算法

二分算法是一种在有序区间中查找答案的方法,时间复杂度:O(log n)。核心思想是:

  • 每次把搜索区间分成两半,只保留可能存在答案的那一半,直到找到目标或搜索区间为空。

二分算法的种类

常见的二分算法就只有两种:

  1. 经典二分 (二分搜索)
  2. 二分答案 (二分答案 + check)

使用二分的特征 && 使用二分的条件

有序就能二分,单调就能逼近 (总结这一块,爆爆的)

使用二分的条件

使用二分需要问题的解具有“二段性”(True/False分界):
若某个值满足条件,则所有更大的值也满足(或反之)
这时就可以用二分在这个“分界点”上逼近最优解

这个二段性可以理解成单调性,也就是可以将结果以目标值为界限分割成两段,一段大于等于target,另一段小于target;或者一段大于target,另一段小于等于target。具体根据题目要求来规划。

使用二分的特征

如何判断一个问题是否需要二分算法来解决,这也是初学者最关心的问题。

  • 查找某个数是否存在
  • 查找第一个/最后一个符合条件的位置
  • 在问题的答案具有“二段性”时,搜索最优解
    这类题目通常是求:最小值、最大值、最短时间、最小代价……
    而且我们不难发现,这类问题的某些条件之间是有相互制约的线性关系的,比如某个变量随另一个变量的增长而增长,

于是在这道题的“解空间”中,整道题的答案序列是具有“二段性”的。

二分模板

二分查找 符合条件的区间 的左端点(起始位置)

给出条件:整个序列长度为 n (1-based序列)。
二段性体现:整个序列被分为 >= t 和 < t 两部分。

要查找 >= t 的最小值,也就是查找 >= t 区间的左端点。
请添加图片描述
整个查找过程是怎样的呢?先根据 l 和 r 求出中间值 mid,判断 mid 和 t 的大小关系(二分答案就是通过 check 函数去判断 mid 所指向的位置在线性关系中的值与 t 的大小关系)

  • 如果 >= t 那么 mid (二分答案就是 check(mid) ) 就落在 >= t 的区间上,下一步就是调整 r 的位置,缩小范围进一步查找。因为此时 mid 指向的位置可能是结果,所以就将 r 调整到 mid 的位置。
  • 如果 < t 那么 mid (二分答案就是 check(mid) ) 就落在 < t 的区间上,下一步就是调整 l 的位置,缩小范围进一步查找。此时 mid 指向的位置不可能是结果,因为 < t 区间是取不到 t 的,所以即使 l 在及其靠近 t 的位置,也取不到 t ,那么我们就可以将 l 更新到 mid + 1 的位置。 mid + 1 的位置有可能是结果。
int l = 1, r = n;
while(l < r)
{
   
	int mid = (l + r) / 2;
	if(check(mid)) r = mid;
	else l = mid + 1;
}
//二分结束之后还需要判断结果是否存在,如果存在,二分停下的位置就是结果

二分查找 符合条件的区间 的右端点(终止位置)请添加图片描述

查找中止位置,要找的就是 <= t 的区间的右端点

注意!!!找右端点时要注意求中间值是要+1的
小窍门:也可以先分析出l、r是怎么更新的,然后看l、r的更新有没有出现 -1,如果出现了 -1,求中间值时就要 +1 中和一下。

int l = 1, r = n;
while(l < r)
{
   
 int mid = (l + r + 1) / 2; //注意这里求中间值是要+1的
 if(check(mid)) l = mid;
 else r = mid - 1;
}
//别忘了判断结果

二分细节处理

细节部分想知道为什么会进入死循环的自己举个简单的例子画图理解就能明白了。我懒得画了。。。

求中间值

对于中间值 mid 的计算方式是有两种的:

  1. int mid = (l + r) / 2; 当序列个数是偶数个时,得到中点位于中间偏左;奇数个均相同。
  2. int mid = (l + r + 1) / 2; 当序列个数是偶数个时,得到中点位于中间偏右

在找起始位置的时候,求中间值要用方式1,用方式2会死循环。
在找中止位置的时候,求中间值要用方式2,用方式1会死循环。

求中间值防溢出写法

  1. int mid = l + (r - l) / 2; 中间偏左
  2. int mid = l + (r - l + 1) / 2; 中间偏右

循环条件

对于循环条件,无论是求起始位置还是求中止位置,统一要使用while(l < r),而不能写成while(l <= r),这样会死循环。

二分答案

通过题目来理解二分答案

P2440 木材加工

洛谷:P2440 木材加工
在这里插入图片描述

分析

这道题目难的在于思路,我们根据题意可得:木头切割的段数 k 和每段小木头的长度 l 是存在反比关系的。题目要求没小段木头的长度越大越好,并且要求出最大的长度,但是题目同时又给出了需要得到小段木头的数量。那么此时,题目就变成了在解空间有“二段性”的性质下,求最大值的问题。那么这题就是很明显的二分答案。ps:你总不能是看到我二分答案的tag就知道这题要用二分答案吧🤡。
其实这题我刚开始看到想到的是直接从大到小枚举所有的长度,但是分析数据范围就知道,暴力枚举肯定是超时的。于是在此基础上我们就要想优化办法,于是才得到的二分方案。解题思路是有个分析过程的,从暴力到优化。

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

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

相关文章

mysql——基础知识

关键字大小写不敏感 查看表结构中的 desc describe 描述 降序中的 desc descend 1. 数据库的操作 1. 创建数据库 create database 数据库名;为防止创建的数据库重复 CREATE DATABASE IF NOT EXISTS 数据库名;手动设置数据库采用的字符集 character set 字符集名;chars…

OOA-CNN-LSTM-Attention、CNN-LSTM-Attention、OOA-CNN-LSTM、CNN-LSTM四模型多变量时序预测一键对比

OOA-CNN-LSTM-Attention、CNN-LSTM-Attention、OOA-CNN-LSTM、CNN-LSTM四模型多变量时序预测一键对比 目录 OOA-CNN-LSTM-Attention、CNN-LSTM-Attention、OOA-CNN-LSTM、CNN-LSTM四模型多变量时序预测一键对比预测效果基本介绍程序设计参考资料 预测效果 基本介绍 基于OOA-CN…

PCIE Spec ---Base Address Registers

7.5.1.2.1 Base Address Registers (Offset 10h - 24h) 在 boot 到操作系统之前&#xff0c;系统软件需要生产一个内存映射的 address map &#xff0c;用于告诉系统有多少内存资源&#xff0c;以及相应功能需要的内存空间&#xff0c;所以在设备的 PCI 内存空间中就有了这个 …

Spring如何通过XML注册Bean

在上一篇当中我们完成了对三种资源文件的读写 上篇内容&#xff1a;Spring是如何实现资源文件的加载 Test public void testClassPathResource() throws IOException { DefaultResourceLoader defaultResourceLoader new DefaultResourceLoader(); Resource resource …

基于Java的不固定长度字符集在指定宽度和自适应模型下图片绘制生成实战

目录 前言 一、需求介绍 1、指定宽度生成 2、指定列自适应生成 二、Java生成实现 1、公共方法 2、指定宽度生成 3、指定列自适应生成 三、总结 前言 在当今数字化与信息化飞速发展的时代&#xff0c;图像的生成与处理技术正日益成为众多领域关注的焦点。从创意设计到数…

【版本控制】idea中使用git

大家好&#xff0c;我是jstart千语。接下来继续对git的内容进行讲解。也是在开发中最常使用&#xff0c;最重要的部分&#xff0c;在idea中操作git。目录在右侧哦。 如果需要git命令的详解&#xff1a; 【版本控制】git命令使用大全-CSDN博客 一、配置git 要先关闭项目&#xf…

Linux——入门常用基础指令

文章目录 Linux入门常用基础指令使用工具介绍基础指令clear指令pwd指令ls指令cd指令Linux系统下的文件路径及文件存储结构文件结构家目录绝对路径和相对路径tree工具 stat指令which指令alias指令touch指令mkdir指令cat指令rm指令man指令cp指令通配符 * Linux入门常用基础指令 …

【技术追踪】Differential Transformer(ICLR-2025)

Differential Transformer&#xff1a;大语言模型新架构&#xff0c; 提出了 differential attention mechanism&#xff0c;Transformer 又多了一个小 trick~ 论文&#xff1a;Differential Transformer 代码&#xff1a;https://github.com/microsoft/unilm/tree/master/Diff…

【Linux网络】应用层自定义协议与序列化

&#x1f308;个人主页&#xff1a;秦jh__https://blog.csdn.net/qinjh_?spm1010.2135.3001.5343 &#x1f525; 系列专栏&#xff1a;https://blog.csdn.net/qinjh_/category_12891150.html 目录 应用层 再谈 "协议" 网络版计算器 序列化 和 反序列化 重新理解…

Vue接口平台学习十——接口用例页面2

效果图及简单说明 左边选择用例&#xff0c;右侧就显示该用例的详细信息。 使用el-collapse折叠组件&#xff0c;将请求到的用例详情数据展示到页面中。 所有数据内容&#xff0c;绑定到caseData中 // 页面绑定的用例编辑数据 const caseData reactive({title: "",…

目标检测中的损失函数(二) | BIoU RIoU α-IoU

BIoU来自发表在2018年CVPR上的文章&#xff1a;《Improving Object Localization With Fitness NMS and Bounded IoU Loss》 论文针对现有目标检测方法只关注“足够好”的定位&#xff0c;而非“最优”的框&#xff0c;提出了一种考虑定位质量的NMS策略和BIoU loss。 这里不赘…

Linux 入门十一:Linux 网络编程

一、概述 1. 网络编程基础 网络编程是通过网络应用编程接口&#xff08;API&#xff09;编写程序&#xff0c;实现不同主机上进程间的信息交互。它解决的核心问题是&#xff1a;如何让不同主机上的程序进行通信。 2. 网络模型&#xff1a;从 OSI 到 TCP/IP OSI 七层模型&…

沐渥氮气柜控制板温湿度氧含量氮气流量四显智控系统

氮气柜控制板通常用于实时监控和调节柜内环境参数&#xff0c;确保存储物品如电子元件、精密仪器、化学品等&#xff0c;处于低氧、干燥的稳定状态。以下是沐渥氮气柜控制板核心参数的详细介绍及控制逻辑&#xff1a; 一、控制板核心参数显示模块 1&#xff09;‌温度显示‌&am…

[c语言日寄]免费文档生成器——Doxygen在c语言程序中的使用

【作者主页】siy2333 【专栏介绍】⌈c语言日寄⌋&#xff1a;这是一个专注于C语言刷题的专栏&#xff0c;精选题目&#xff0c;搭配详细题解、拓展算法。从基础语法到复杂算法&#xff0c;题目涉及的知识点全面覆盖&#xff0c;助力你系统提升。无论你是初学者&#xff0c;还是…

QtCreator的设计器、预览功能能看到程序图标,编译运行后图标消失

重新更换虚拟机&#xff08;Vmware Kylin&#xff09;&#xff0c;重新编译和配置了很多第三方库后&#xff0c;将代码跑到新的这个虚拟机环境中&#xff0c;但是出现程序图标不可见&#xff0c;占位也消失&#xff0c;后来继续检查ui文件&#xff0c;ui文件图标也异常&#x…

面试常用基础算法

目录 快速排序归并排序堆排序 n n n皇后问题最大和子数组爬楼梯中心扩展法求最长回文子序列分割回文串动态规划求最长回文子序列最长回文子串单调栈双指针算法修改 分割回文串滑动窗口栈 快速排序 #include <iostream> #include <algorithm>using namespace std;…

悬空引用和之道、之禅-《分析模式》漫谈57

DDD领域驱动设计批评文集 做强化自测题获得“软件方法建模师”称号 《软件方法》各章合集 “Analysis Patterns”的第5章“对象引用”原文&#xff1a; Unless you can catch all such references, there is the risk of a dangling reference, which often has painful con…

【初阶数据结构】树——二叉树(上)

文章目录 目录 前言 一、树 1.树的概念与结构 2.树相关术语 3.树的表示 二、二叉树 1.概念与结构 2.特殊的二叉树 3.二叉树存储结构 总结 前言 本篇带大家学习一种非线性数据结构——树&#xff0c;简单认识树和二叉数以及了解二叉树的存储结构。 一、树 1.树的概念与结构 树…

ECharts散点图-散点图14,附视频讲解与代码下载

引言&#xff1a; ECharts散点图是一种常见的数据可视化图表类型&#xff0c;它通过在二维坐标系或其它坐标系中绘制散乱的点来展示数据之间的关系。本文将详细介绍如何使用ECharts库实现一个散点图&#xff0c;包括图表效果预览、视频讲解及代码下载&#xff0c;让你轻松掌握…

GAIA-2:用于自动驾驶的可控多视图生成世界模型

25年3月来自英国创业公司 Wayze 的论文“GAIA-2: A Controllable Multi-View Generative World Model for Autonomous Driving”。&#xff08;注&#xff1a;23年9月其发布GAIA-1&#xff09; 生成模型为模拟复杂环境提供一种可扩展且灵活的范例&#xff0c;但目前的方法不足…