首页 > 编程语言 >浅谈二分算法

浅谈二分算法

时间:2024-08-27 09:27:17浏览次数:9  
标签:二分 浅谈 算法 查找 区间 100 示意图

浅谈二分算法

二分

首先知道一下二分是什么。

二分,是一种快速处理大型数据的方法。基本逻辑是折半查找。

设有一个共有 \(n\) 个数字的数组,要从中查询某个元素,就可以用二分查找。

注:这里的数组默认其成员数值具有单调性。这个点十分重要。

还记得小时候(我现在才新初一)跟同学玩过一个游戏(数字炸弹),当时玩得可欢了,一直以为是一个概率小游戏(其实确实有概率的成分),每局能玩上十几分钟。

但是现在学完信息学后,特别是学完二分后,对它有了一种快速解决的方法。

首先我们知道,设出题者所想的这个数字为 \(x\),则 \(x\in[1,100]\),这是我们玩的规则,不过大差不差。

那么很显然,因为 \(1\sim 100\) 具有单调上升的性质,而我们又只需要查找一个数,暴力的求解方法是从 \(1\) 尝试到 \(100\),最坏情况下需要枚举 \(100\) 次,十分漫长。

而我们可以想到,每次说出一个数 \(y\),只要不是 \(y=x\),就可以排除 \(100-y+1\) 或 \(y\)​​ 个数(这取决于你猜的这个数是大了还是小了)。

那么我们就可以利用这个特性,假设共有 \(n\) 个数字,每次都排除 \(n\div2\) 个数字,这样最多经过 \(\log_2^n\) 次后就可以结束游戏。

其实小学课本里就有类似的例子,是数学书里一个单元叫做 “ 找次品 ” 的数学问题(不知道的自己查),但那里是用 \(\log _3^n\) 的时间,这里不再赘述。

双指针

双指针,顾名思义,就是运用两个变量 \(l,r\)​ 表示所求区间的左右端点,可以更加轻松地控制对答案有贡献的区间。

设所求元素为 \(p\),序列为 \(a\)。

比如每次取个中点 \(mid=\frac{(l+r)}{2}\),若 \(p<a_{mid}\),则 \(r\leftarrow mid\),左端点 \(l\) 不变。将区间控制为 \([l,mid]\)。

否则 \(l\leftarrow mid+1\),将区间控制为 \([mid+1,r]\)。

但这里问题就来了,区间为空的判定条件是 \(l=r\) 还是 \(l>r\) 呢?

二分查找的边界条件

枚举以下情况

  • 闭区间

若你用的是闭区间,即 \([l,r]\),则判断条件即为 \(l=r\),因为若 \(l=r\),则 \([l,r]\) 其实就是 \([l,l]\) 或 \([r,r]\) ,就是一个数,答案也显然即为 \(a_l\)​。

示意图:

  • 开区间

开区间,是 \((l,r)\),不包括 \(l,r\) 。所以有效区间为 \([l+1,r-1]\)。判断条件即为 \(l+1=r-1\)​。

示意图:

  • 左开右闭

左开右闭,即 \((l,r]\) 有效区间为 \([l+1,r]\),边界条件即为 \(l+1=r\)​,还是就剩下一个数为止。

示意图:

  • 左闭右开

左闭右开,\([l,r)\),有效区间为 \([l,r-1]\),边界条件为 \(l=r-1\)​。

示意图:

所以可以总结一下,不管你的 \(l,r\) 都表示什么意思,重点就是四个字,有效区间

大概大家也注意到了,我在解释除了闭区间其他情况的时候,有效区间的左右端点都是用闭区间来表示,为什么呢?当然是因为我个人喜欢用闭区间啦。

标签:二分,浅谈,算法,查找,区间,100,示意图
From: https://www.cnblogs.com/Atserckcn/p/18381990

相关文章

  • 结构化克隆算法是啥?
    结构化克隆算法(StructuredCloneAlgorithm)是一种用于在Web浏览器中复制复杂数据类型的方法,主要用于postMessageAPI。它允许从一个环境(如一个窗口或Worker)向另一个环境发送消息,而这些消息可以是复杂的JavaScript对象。基本原理结构化克隆算法的基本思想是在发送方创建一......
  • LeetCode 算法:爬楼梯 c++
    原题链接......
  • 浅谈AI--我们为什么要学会用AI
    为什么要用AI人工成本低、为工作提高效率。了解AIAI入门工具要数ChatGPT,无奈在国内打不开,要用它得通过科学上网或者调用代理商接口。但是今年3月份,百度也发布了免费产品——文心一言,对标ChatGPT3.5。虽然刚开始文心一言给的问答效果不如人意,尤其是答非所问的情况比较多,而且......
  • 字符串压缩算法
    目录RLE(游程长度编码)算法原理步骤说明示例说明代码示例python语言:C语言:优缺点Huffman编码基本原理构造Huffman树编码与解码过程代码示例python语言:C语言:优缺点LZW压缩字典构建与压缩过程步骤说明代码示例python语言:C语言:优缺点字符串压缩算法用于减......
  • 基于A*算法、Dijkstra算法的路径规划研究(Matlab代码实现)
      ......
  • 机器学习之 贝叶斯算法 及朴素贝叶斯分类器的代码实现(给我点赞的都发财,谢谢)
    贝叶斯算法简介贝叶斯算法是一种基于概率论的统计学方法,广泛应用于机器学习领域。它基于贝叶斯定理,用于计算后验概率。贝叶斯定理可以表述为:其中:P(A∣B) 表示在事件B发生的情况下事件A发生的概率,称为后验概率。P(B∣A) 表示在事件A发生的情况下事件B发生的概率,称......
  • STC89C52 定时器浅谈
    文章目录1、定时器1.1定时器简介1.2定时器构成1.2.1系统时钟1.2.2计数单元1.2.3中断系统1.2定时器0/1的相关寄存器1.2.1TMOD1.2.2TCON1.3初始化定时器01、定时器1.1定时器简介定时器,又称为计数器,是51单片机的内部资源,即电路的连接和运转都在单片机内部......
  • 乘法逆元 + 扩展欧几里得定理/算法
    数学之乘法逆元Part1:逆元是什么一个东西的逆元,就是指在一种运算/操作下能够抵消这个东西所带来影响的东东举个例子4的加法逆元就是-4​ 2在普通乘法中的逆元就是\(2^{-1}\)而乘法逆元指的是在模意义下的乘法逆元设原式为​\(1*a\equiva\modp\)那么......
  • 8.26下午二分与深搜测试
    8.26下午二分与深搜测试比赛传送门分数情况P2249【深基13.例1】查找P1706全排列问题P8647[蓝桥杯2017省AB]分巧克力P2440木材加工B3624猫粮规划P2105K皇后P3853路标设置P3743小鸟的设备01001210000015T1.P2249【深基13.例1】查找题......
  • 机器学习:svm算法原理的优缺点和适应场景
    1、概述:基本原理:间隔(Margin):SVM试图找到一个超平面,这个超平面不仅能够区分不同的类别,而且具有最大的间隔。间隔是数据点到超平面的最近距离。支持向量(SupportVectors):这些是距离超平面最近的数据点,它们决定了超平面的位置和方向。        支持向量机(SVM)是一种在机器......