二分查找 【模板+中间值问题】

news2024/11/25 14:45:08

全文目录

  • 😃前言
  • 😕二分查找动图演示
  • 😴代码模板
  • ❗️ 使用哪个模板问题 ❗️
  • 💢 mid为何+1问题 💢

😃前言

二分查找也称折半查找(Binary Search),它是一种效率较高的查找方法。它要求元素具有有序性,或者具有跟有序性类似的性质,能够不断地缩小查找范围。

查找操作主要有一下几点:

1、确定需要查找的值,设立基准值(一般是中间值),设立判断条件,判断基准值是否满足某种性质

2、以基准值为边界,划分左右两个区间

3、根据判断条件是否成立,分析结果可能存在的区间,更新查找范围

4、重复以上操作,直到区间不存在(左边界大于右边界)或查找到需要的值时,查找结束


😕二分查找动图演示

在这里插入图片描述


😴代码模板

我们这里以整数的有序序列为例,演示二分查找的代码和需要注意的事项。整数二分的代码分为两种情况:

  1. 判断条件成立时新区间需要更新在左半区间,即[l, mid]
  1. 判断条件成立时新区间需要更新在右半区间,即[mid, r]

需要注意的是不管哪种情况,条件成立都需要将取到mid,因为mid可能为答案

bool check(int x) {/* ... */} // 检查答案是否满足某种性质

// 查找左区间
// 区间[l, r]被划分成[l, mid]和[mid + 1, r]时使用:条件成立,新区间在[l, mid]
int SearchLeft(int l, int r)
{
    while (l < r)
    {
        int mid = l + r >> 1;
        if (check(mid)) r = mid;    // check()判断mid是否满足性质
        else l = mid + 1;
    }
    return l;
}

// 查找右区间
// 区间[l, r]被划分成[l, mid - 1]和[mid, r]时使用:条件成立,新区间在[mid, r]
int SearchRight(int l, int r)
{
    while (l < r)
    {
        int mid = l + r + 1 >> 1;
        if (check(mid)) l = mid;
        else r = mid - 1;
    }
    return l;
}

❗️ 使用哪个模板问题 ❗️

决定使用哪个模板,是根据check(mid)来决定的:

check(mid)就是判断答案在左半区间还是右半区间

1、如果check(mid)是判断答案在左半区间,使用SearchLeft模板(mid不需要+1):

如果在条件成立,说明答案在左半区间,也就是[l, mid],新区间为[l, mid],区间更新方式为r = mid
如果条件不成立,说明答案在右半区间,也就是[mid + 1, r],新区间为[mid + 1, r],区间更新方式为l = mid + 1

2、如果check(mid)是判断答案在右半区间,使用第二个模板(mid需要+1):

如果在条件成立,说明答案在右半区间,也就是[mid, r],新区间为[mid, r],更新条件为l = mid
如果条件不成立,说明答案在左半区间,也就是[l, mid - 1],新区间为[l, mid - 1],更新条件为r = mid - 1


💢 mid为何+1问题 💢

在这两种情况中,区间划分好理解,不就是一左一右、一加一减嘛。但是在mid为何需要加1可能会让很多人疑惑,我在学习的时候也是迷糊了好久。现在将从大佬那里总结到的经验分享一下:

1、在SearchLeftmid 为何不需要 +1

设左右两个边界只相差1,即l = r - 1时,如果 mid + 1mid 向下取整 ,即mid == r ,如果条件刚好成立的话,就会导致更新完区间后r还是等于mid,等于没有更新,这时候就是一个死循环了。所以mid 不需要 +1,进行向上取整,让mid == l,破坏死循环的条件。

2、在SearchRightmid为何需要 +1

设左右两个边界只相差1,即l = r - 1时,当mid不 +1 时mid是向上取整的,所以mid == l,如果条件刚好成立的话,就会导致更新完 区间后l还是等于mid,等于没有更新,这时候就是一个死循环了。所以需要mid+1进行向下取整,让mid == r,破坏死循环的条件。

大佬原话:

对于mid + 1与否我觉得是为了让区间平分
mid = left + right >> 1; 这里mid是上中位数
mid = left + right + 1 >> 1; 这里mid是下中位数
如果取left = mid, 即[mid, right], 则mid取下中位数才能平分区间
如果取right = mid, 即[left, mid], 则mid取上中位数才能平分区间


完结散花🌈🌈🌈
在这里插入图片描述

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

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

相关文章

[解决]github上传大文件卡住

0x00 需求 github目前的策略是超过50M的文件不允许上传&#xff0c;推荐使用lfs。 0x01 操作 再把之前提交的commit 回滚&#xff1a; git reset --hard commitId 在配置lfs&#xff1a; git lfs install git lfs track "*.zip" git lfs track "*.jar" git…

【K8S】亲和、反亲和、污点、容忍

文章目录【K8S】亲和、反亲和、污点、容忍K8s调度亲和与反亲和Pod和Node硬亲和和软亲和requiredDuringSchedulingIgnoredDuringExecution&#xff1a;硬策略preferredDuringSchedulingIgnoredDuringExecution&#xff1a;软策略污点与容忍污点&#xff08;Taint&#xff09;污点…

Python学习----基础语法2

布尔类型 布尔本质上是 1 和 0 if 基本语法格式 语法还是比较简单的 , 需要注意的是 , Python是通过空格缩进来判断代码块归属的 ( 不像java这么通过 花括号进行区分 ) , 默认是四个空格 , 你也可以使用两个或者三个等 , 只要全部统一即可 , 但是编辑器会有提示 , 规范是四…

一文带你快速了解ptrdiff_t

简介 ptrdiff_t是C/C标准库中定义的一个与机器相关的数据类型。ptrdiff_t类型变量通常用来保存两个指针减法操作的结果。 ptrdiff_t定义在stddef.h&#xff08;cstddef&#xff09;这个文件内。 ptrdiff_t通常被定义为long int类型。 ptrdiff_t定义在C99标准中。 标准库类…

【前端】Vue+Element UI案例:通用后台管理系统-用户管理:Form表单填写、Dialog对话框弹出

文章目录目标代码0.页面结构1.新增按钮和弹出表单&#xff1a;结构2.新增按钮和弹出表单&#xff1a;点击新增弹出表单3.表单样式4.表单验证5.表单的提交和取消功能&#xff1a;接口、mock相关准备6.表单的提交和取消功能提供的数据和接口1-operateFormLabel.js5-user.js效果总…

小程序转App最便捷的方法,附实操

Flutter是谷歌的移动UI框架&#xff0c;可以快速在iOS和Android上构建高质量的原生用户界面。 Flutter可以与现有的代码一起工作。在全世界&#xff0c;Flutter正在被越来越多的开发者和组织使用&#xff0c;并且Flutter是完全免费、开源的。 它也是构建未来的Google Fuchsia应…

计算机网络(一)网络体系结构

layout: post title: 计算机网络&#xff08;一&#xff09;网络体系结构 description: 计算机网络&#xff08;一&#xff09;网络体系结构 tag: 计算机网络 计算机网络计算机网络体系基本概念网络性能指标数据量与数据速率&#xff08;比特率&#xff09;带宽吞吐量时延时延带…

Python入门自学进阶-Web框架——25、DjangoAdmin项目应用-分页与过滤

对于数据很多&#xff0c;就需要将数据进行分页显示&#xff0c;同时还要提供过滤功能。 当配置文件中配置了过滤条件&#xff0c;那就要在显示表信息的时候&#xff0c;显示过滤条件选择项&#xff0c;选择后进行过滤&#xff0c;然后下面显示过滤后的数据&#xff0c;如果数…

数据结构(单链表)

前沿&#xff1a; 在前面总结的顺序表的时候&#xff0c;最后也说出了他的一些缺点&#xff0c;例如头插/中间插的时候的时间复杂度是O(n)&#xff0c;这个效率并不高&#xff0c;而如何提高效率的实现呢&#xff0c;这里我们可以通过单链表来简单的提高这个效率。 思维导图&am…

java计算机毕业设计springboot+vue在线投票系统

项目介绍 随着科学技术的飞速发展&#xff0c;各行各业都在努力与现代先进技术接轨&#xff0c;通过科技手段提高自身的优势&#xff1b;对于在线投票系统当然也不能排除在外&#xff0c;随着网络技术的不断成熟&#xff0c;带动了在线投票系统的发展&#xff0c;它彻底改变了…

Java初识:类和对象(上)

文章目录学习目标1.面向对象的初步认识1.1认识面向对象1.2 区分面向对象和面向过程2.类当定义与使用2.1认识简单类2.2 类的定义格式2.3 小试身手-定义类的小练习3.类的实例化3.1 什么是实例化3.2 实例化注意事项&#xff1a;3.3 类和对象说明4. this 引用4.1为什么要用this4.2 …

小程序意见反馈界面(简洁版代码)

在开发个人中心页面时&#xff0c;意见反馈功能是必不可少的&#xff0c;下面介绍该功能的具体开发流程 1、首先看一下效果图&#xff1a; 2、WXML代码&#xff0c;分为三个部分&#xff0c;文本域&#xff08;TextArea&#xff09;、输入框&#xff08;Input)、按钮&#xff…

程序员日常|为什么我在开发工作中偏爱这款键盘?

前言 最近一直不断地有粉丝朋友们私信我&#xff0c;问我该如何给自己挑选一款适合程序员工作的键盘&#xff0c;于是今天来给大家介绍下我用的键盘。 文章目录前言我的键盘亲身经历使用体验视频展示我的键盘 程序员作为一个需要长时间敲代码的职业&#xff0c;没有一个趁手的…

html静态网页设计制作 HTML我的家乡沧州网页代码 dw静态网页成品模板素材网页 web前端网页设计与制作 div静态网页设计

家乡旅游景点网页作业制作 网页代码运用了DIV盒子的使用方法&#xff0c;如盒子的嵌套、浮动、margin、border、background等属性的使用&#xff0c;外部大盒子设定居中&#xff0c;内部左中右布局&#xff0c;下方横向浮动排列&#xff0c;大学学习的前端知识点和布局方式都有…

uint 与 int 相加,事与愿违?

#include <iostream> using namespace std; int main() { uint32_t uint_data -22; int int_data 0; if (uint_data int_data < 0) { cout <<"uint int负数小于0: "; } else { cout <<"…

ARM编程环境搭建教程

随着移动互联网的繁荣发展&#xff0c;物联网人工智能的兴起&#xff0c;嵌入式开发成为了越来越多IT人必须学习的内容&#xff0c;而在嵌入式芯片领域&#xff0c;ARM具有无可撼动的市场占有率&#xff0c;所以说&#xff0c;学习嵌入式不学ARM&#xff0c;不如回家卖红薯。 接…

C++ Reference: Standard C++ Library reference: C Library: cwctype: iswblank

C官网参考链接&#xff1a;https://cplusplus.com/reference/cwctype/iswblank/ 函数 <cwctype> iswblank int iswblank (wint_t c); 检查宽字符是否为空白 检查c是否为空字符。 空白字符是用于分隔一行文本中的单词的空格&#xff08;space character&#xff09;字符…

用色彩活出彩,能率Color Run上海之旅圆满结束

11月8日&#xff0c;以“用色彩&#xff0c;活出彩”为主题的能率|苏宁 Color Run活动&#xff0c;于上海圆满结束。此次活动由燃热领域代表品牌能率与苏宁易购集团联合举办&#xff0c;旨在通过有效户外运动&#xff0c;提倡健康快乐的生活方式&#xff0c;悦享多彩人生。 能率…

摄影网页设计制作 简单静态HTML网页作品 WEB静态摄影网站作业成品 学生DW摄影网站模板

&#x1f389;精彩专栏推荐&#x1f447;&#x1f3fb;&#x1f447;&#x1f3fb;&#x1f447;&#x1f3fb; ✍️ 作者简介: 一个热爱把逻辑思维转变为代码的技术博主 &#x1f482; 作者主页: 【主页——&#x1f680;获取更多优质源码】 &#x1f393; web前端期末大作业…

C++语言基础篇

✅作者简介&#xff1a;CSDN内容合伙人&#xff0c;全栈领域新星创作者&#xff0c;阿里云专家博主&#xff0c;华为云云享专家博主&#xff0c;掘金后端评审团成员 &#x1f495;前言&#xff1a; 学长出的这一系列专栏适合有⼀点 C 基础&#xff0c…