首页 > 其他分享 >深入二分思想

深入二分思想

时间:2024-12-15 21:53:18浏览次数:2  
标签:二分 arr 思想 bound mid 查找 深入 judge

深入二分思想

二分在实际使用中常常会出现死循环的问题

这是因为我们对二分临界状态的不熟悉而导致的,这里介绍一种通用的分界想法:

整数二分:

int l = begin - 1, r = end + 1;
while (l + 1 != r) {
	int mid = l + r >> 1;
	if (judge(mid)) l = mid;
	else r = mid;
}

规定当 l + 1 == r 时,退出二分查找,因为在对整数区间进行二分时,最终状态的 lr 是紧密相邻的

judge 函数同样需要进行设计:

1 2 3 4 4 4 5 6 

针对以上序列,我们如果想查找:(下标从1开始)

<4 <=4 >4 >=4 

的元素下标,那么我们二分的 judge 和 返回的值就不同:

//查找 <4 <=4 时:
bool judge(int x){
	if (arr[x] < 4) return 1;
	return 0;
}
//最终状态的边界线处在3和4之间(下标)
//二分最后的l就是3,r就是4(下标)

这样的judge函数,我们可以查找出 <<= 的位置

同样的:

//查找 >4 >=4 时:
bool judge(int x){
	if (arr[x] <= 4) return 1;
	return 0;
}
//最终状态的边界线处在6和7之间(下标)
//二分最后的l就是6,r就是7(下标)

这样的judge函数,我们可以查找出 >>= 的位置


在上述的judge函数中,我们不难写出lr 的位置关系,但是为什么只用在judge中,添加一个=就能改变查找的方向呢?

还是以这段序列为例:

1 2 3 4 4 4 5 6 

查找 <<=时,我们目标是把边界线定位在34之间

if (arr[x] < 4) return 1;//(l=mid)
else return 0;//(r=mid)

因此,当我们的arr[mid]==4时,我们就要将右边界移动到mid

反之:

查找 >>=时,我们目标是把边界线定位在45之间

if (arr[x] < 4) return 1;//(l=mid)
else return 0;//(r=mid)

因此,当我们的arr[mid]==4时,我们就要将左边界移动到mid


也可以使用stl库内的 upper_bound()lower_bound()函数进行二分查找

需要提前对查找的序列进行有序化处理

用法如下:x为需要查找的元素

//对于静态数组
upper_bound(arr+begin,arr+len,x)
lower_bound(arr+begin,arr+len,x)
//对于stl容器
upper_bound(arr.begin(),arr.end(),x)
lower_bound(arr.begin(),arr.end(),x)

其中,在对静态数组进行查找时,arr+begin为从第几个元素开始查找,len为需要查找的区间长度,arr+len则表示查找到第几个元素停止

upper_bound()返回的是第一个 大于 x迭代器lower_bound()返回的是第一个 大于等于 x迭代器

对于同样的序列:arr[]={1 2 3 4 4 4 5 6 }

upper_bound(arr, arr+8, 4);
lower_bound(arr, arr+8, 4);
//通过*解引用处理
cout << *upper_bound(arr, arr + 8, 4) <<' ' << *lower_bound(arr, arr + 8, 4);
//输出的结果为 5 4

注意upper_bound()lower_bound()返回的是迭代器,可以通过 - 操作计算他们的绝对距离(大于0),就是等于4的元素的个数

标签:二分,arr,思想,bound,mid,查找,深入,judge
From: https://www.cnblogs.com/dianman/p/18608786

相关文章

  • 深入详细分析Skyworks 78113 PAMiD射频方案图
    深入详细分析Skyworks78113PAMiD(功率放大器模块及集成滤波器)需要分解图中各个部分的功能和设计思路,探讨其技术架构、应用背景以及设计原理。以下是我对这张图的详细讲解与分析,内容包含专业解读、实际应用背景及系统性观点,力求全面、深入,展现行业理解及专业见解。一、PA......
  • 深入理解 HTTP 协议:从基础到实践全解析
    在当今数字化时代,HTTP协议如同互联网世界的“语言”,支撑着无数网页浏览、数据传输和在线交互。无论你是初涉编程的新手,还是经验丰富的开发者,深入掌握HTTP协议都至关重要。今天,就让我们一起揭开HTTP协议的神秘面纱,从基础知识到实际应用,全面深入地理解这一互联网基石。一、HTT......
  • 深入理解 Virtual Threads(虚拟线程)
    Java作为一种流行的编程语言,其生态系统在不断进化,尤其是在最新的版本中引入了许多令人兴奋的功能。本文将为您深入讲解Java的最新技术之一——VirtualThreads(虚拟线程),并探讨其在实际项目中的应用价值。什么是VirtualThreads?VirtualThreads是Java平台为解决高并发问......
  • React 进阶深入理解核心概念与高阶实践
    在上一节中,我们学习了React的基础知识,包括组件、状态管理和基本操作。接下来,我们将进一步探索React的高级功能和实战技巧,例如组件间通信、高阶组件、ContextAPI、ReactRouter等。这些内容将帮助你构建更复杂、功能更丰富的应用。一、组件间通信React的组件树是单......
  • 愤怒的牛/好斗的奶牛[二分答案]
    题目来源USACO2005Feb.Gold题面题目描述农夫约翰建造了一座有$n$间牛舍的小屋,牛舍排在一条直线上,第$i$间牛舍在$x_i$​的位置,但是约翰的$m$头牛对小屋很不满意,因此经常互相攻击。约翰为了防止牛之间互相伤害,因此决定把每头牛都放在离其它牛尽可能远的牛舍。也就是......
  • 【算法一周目】数据深处的舞者:二分查找的优雅与力量
    文章目录1.二分查找2.在排序数组中查找元素的第一个和最后一个位置3.搜索插入位置4.x的平方根5.山峰数组的峰顶6.寻找峰值7.搜索旋转排序数组中的最小值8.0~n-1中缺失的数字1.二分查找题目链接:704.二分查找题目描述:给定一个升序排列的整数数组nums,和一个目标值......
  • 深入详解机器学习基础中的模型评估方法
    引言        机器学习正在快速改变我们的世界,从自动驾驶汽车到个性化推荐系统,其应用无处不在。然而,一个成功的机器学习项目不仅依赖于强大的算法和丰富的数据,还需要精确的模型评估方法。模型评估是机器学习过程中不可或缺的环节,它通过衡量模型对新数据的预测能力,来指......
  • 深入浅出HTML
    HTML全套基础教程-html实战开发-深入浅出HTMLhttps://www.bilibili.com/video/BV11t411K74QP1001-老杜-HTML-课程内容概述P2002-老杜-HTML-BS结构介绍ui美术psHTML1、系统结构:B/s架构:(以后主要走的方向是这个。)Browser/Server(浏览器/服务器的交互形式。)Browser支持哪......
  • 深入浅出Laravel 框架,快速网站开发热门技能
    PHPweb开发教程4天深入浅出Laravel框架,快速网站开发热门技能P101.laravel介绍laravel来我2017官网:https://laravel.com/中文官网:http://www.golaravel.com/中文社区:https://laravel-china.org/目前大部分的框架公共的特点(了解)(1)单入口,所有的请求必须从单入口开始,主要是......
  • Vue.js 源码全方位深入解析
    Vue.js源码全方位深入解析https://ustbhuangyi.github.io/vue-analysis/https://ustbhuangyi.github.io/vue-analysis/v2/prepare/F:\Vue教程\Vue.js源码全方位深入解析\第1章准备工作第1章准备工作1-2准备工作.mp41-3认识Flow.docx1-4认识Flow.mp4服漏npmi-......