二分查找算法(1) _二分查找_模板

个人主页:C++忠实粉丝
欢迎 点赞👍 收藏✨ 留言✉ 加关注💓本文由 C++忠实粉丝 原创

二分查找算法(1) _二分查找模板

收录于专栏【经典算法练习
本专栏旨在分享学习算法的一点学习笔记,欢迎大家在评论区交流讨论💌

1. 二分查找算法简介

二分查找是一种在已排序数组中高效查找目标值的算法。其核心思想是通过不断将查找范围分成两部分,利用中间元素与目标值的比较来缩小范围。具体步骤如下:

1. 初始设定:设定两个指针,分别指向数组的起始和结束位置。
2. 计算中间位置:计算中间索引,并与目标值进行比较。
3. 比较结果:
        如果中间元素等于目标值,查找成功。
        如果目标值小于中间元素,调整结束指针,缩小到左半部分。
        如果目标值大于中间元素,调整起始指针,缩小到右半部分。
4. 重复:重复上述步骤,直到找到目标值或范围为空。
这种方法的时间复杂度为O(log n),使其在大数据集中非常高效。

2. 题目链接:

OJ链接:二分查找

3. 题目描述 :

给定一个 n 个元素有序的(升序)整型数组 nums 和一个目标值 target  ,写一个函数搜索 nums 中的 target,如果目标值存在返回下标,否则返回 -1
示例 1:

输入: nums = [-1,0,3,5,9,12], target = 9输出: 4
解释: 9 出现在 nums中并且下标为 4

示例 2:

输入: nums= [-1,0,3,5,9,12], target= 2输出: -1
解释: 2 不存在 nums中因此返回 -1

提示:

  1. 你可以假设 nums 中的所有元素是不重复的。
  2. n 将在 [1, 10000]之间。
  3. nums 的每个元素都将在 [-9999, 9999]之间。

注意:

我们这道题的二分查找中的数据都是不重复的且有序 

4. 解法 :

    解法一:暴力枚举遍历:

    算法思路 :

遍历整个数组寻找target

    代码展示 :

class Solution {
public:int search(vector<int>& nums, int target) {int ret = -1;auto i = nums.begin();for(i = nums.begin(); i < nums.end(); i++)if(*i == target) ret = i - nums.begin();return ret;}
};

 

    结果分析 :

用vector的迭代器直接遍历整个数组,我们的时间复杂度为O(N) 

    对暴力算法的反思与优化 :

我们的暴力算法虽然容易想,但是时间复杂度不是很好,而且我们的暴力算法完全没有利用题目中数组是有序的这一个条件,所以我们可以进一步优化.

 

这里假设我们先从4开始查找,假设我们的target比4大,那4的左边不就都可以舍去吗?这不就让我们简化了一些不必要的遍历吗? 

    解法二: 二分查找 :

    算法思路 :

a.定义 left , right 指针,分别指向数组的左右区间。
b.找到待查找区间的中间点 mid ,找到之后分三种情况讨论:
        i.arr[mid] == target 说明正好找到,返回 mid 的值;
        ii.arr[mid] > target 说明[mid, right] 这段区间都是⼤于 target 的,因此舍
去右边区间,在左边[left, mid - 1] 的区间继续查找,即让 right = mid -
1 ,然后重复 2 过程;
        iii.arr[mid] < target 说明[left, mid] 这段区间的值都是⼩于 target 的,因
    此舍去左边区间,在右边[mid + 1, right] 区间继续查找,即让 left = mid +
    1 ,然后重复 2 过程;
c.当 left 与 right 错开时,说明整个区间都没有这个数,返回 - 1 。

注意:

这里其实我们找三等分点也可以成功,我们的二分查找其实就是利用数组的二段性,将一个数组分成两部分,然后舍去其中一部分,然后在另一部分中查找

之所以叫二分查找,是因为找二等分点的时间复杂度最低

    代码展示 :

class Solution {
public:int search(vector<int>& nums, int target) {int left= 0, right = nums.size() - 1;while(left <= right){//防溢出int mid = left + (right - left) / 2;if(nums[mid] > target) right = mid - 1;else if(nums[mid] < target) left = mid + 1;else return mid;}return -1;}
};

 

三等分点查找

class Solution {
public:int search(vector<int>& nums, int target) {int left= 0, right = nums.size() - 1;while(left <= right){//防溢出int mid = left + (right - left) / 3;if(nums[mid] > target) right = mid - 1;else if(nums[mid] < target) left = mid + 1;else return mid;}return -1;}
};

 

    结果分析 :

二分查找时间复杂度分析:   

 二分查找的时间复杂度可以通过分析其每一步操作来证明。具体分析如下:

    初始条件:二分查找在一个已排序的数组中进行搜索,假设数组长度为n

    每次操作:在每一次迭代中,算法都会计算中间索引 mid,并根据与目标值的比较来决定下一步搜索的范围。每次迭代都将当前搜索范围减半。

    减半过程:

    首先,搜索的范围是n(整个数组)。
    第一次迭代后,范围缩小到n / 2。
    第二次迭代后,范围缩小到n / 4。
    第三次迭代后,范围缩小到n / 8。
    ...
    这个过程会一直持续,直到范围缩小到 1。
    结束条件:当搜索范围缩小到 0(即 left > right)时,算法结束。每次迭代都将问题规模减半,因此我们可以得到以下关系:

        n, n/2, n/4, n/8, ......, 1;

    数学推导:设迭代次数为k,那么在第k 次迭代时,范围大小为:

        n/2^k = 1

    解这个方程,可以得到:

        n = 2^k ----> k = log2(n)

    时间复杂度:因此,二分查找的时间复杂度是O(logn),因为它的迭代次数与输入规模的对数成正比。

    总结:二分查找在每一步中通过将搜索范围减半,有效地减少了需要检查的元素数量,因此其时间复杂度为O(logn)。

5. 二分算法模板总结

while(left <= right)
{int mid = left + (right - left) / 2;if (....)left = mid + 1;else if (....)right = mid - 1;elsereturn ...;
}

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

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

相关文章

Redis——持久化策略

Redis持久化 Redis的读写操作都是在内存上&#xff0c;所以Redis性能高。 但是当重启的时候&#xff0c;或者因为特殊情况导致Redis崩了&#xff0c;就可能导致数据的丢失。 所以Redis采取了持久化的机制&#xff0c;重启的时候利用之间持久化的文件实现数据的恢复。 Redis提…

[Matplotlib教程] 02 折线图、柱状图、散点图教程

基于MFCC和CNN的语音情感识别 2 折线图、柱状图、散点图2.1 折线图2.1.1 简单折线图2.1.1 线形和Markevery2.1.2 带误差棒的折线图2.1.3 区间填充和透明度 2.2 柱状图2.2.1 分组柱状图2.2.2 堆叠柱状图2.2.3 横向柱状图 2.3 散点图 我们的网站是 菜码编程&#xff0c;我们的q群…

django项目添加测试数据的三种方式

文章目录 自定义终端命令Faker添加模拟数据基于终端脚本来完成数据的添加编写python脚本编写shell脚本执行脚本需要权限使用shell命令来完成测试数据的添加 添加测试数据在工作中一共有三种方式&#xff1a; 可以根据django的manage.py指令进行[自定义终端命令]可以采用第三方…

2024华为杯数学建模研赛F题建模代码思路文章研究生数学建模

截止2024.8.21 12点 已更新F全部小问的建模和问题一的代码 #### https://docs.qq.com/doc/DVVBUREF2SmFhRUl3F题: 问题1&#xff1a;卫星轨道根数与运动学关系的数学模型 从卫星的轨道根数计算出它在特定时刻的三维位置和速度。轨道根数包括&#xff1a; 1.计算卫星的轨道半径…

Android Studio开发发布教程

本文讲解Android Studio如何发布APP。 在Android Studiobuild菜单栏下点击Generate Singed Bundle/APK…打开对话框。 选择APK点击Next 点击Create New...进行创建

【赵渝强老师】K8s的DaemonSets控制器

DaemonSet控制器相当于在节点上启动了一个守护进程。通过使用DaemonSet可以确保一个Pod的副本运行在 Node节点上。如果有新的Node节点加入集群&#xff0c;DaemonSet也会自动给新加入的节点增加一个Pod的副本&#xff1b;反之&#xff0c;当有Node节点从集群中移除时&#xff0…

KMP整理+个人推导+快速上手理解

整理了一下KMP的写法&#xff1a; 这个是我自己写的&#xff08;个人推导&#xff0c;可能在时间复杂度上表现较弱&#xff0c;但是非常帮助初学者进行理解&#xff01;&#xff09; 下面是代码&#xff0c; ne 是next数组。我这个next数组表示的是&#xff1a; ne[i] : 当s…

Spring Boot框架在高校心理辅导中的实践

2 相关技术简介 2.1Java技术 Java是一种非常常用的编程语言&#xff0c;在全球编程语言排行版上总是前三。在方兴未艾的计算机技术发展历程中&#xff0c;Java的身影无处不在&#xff0c;并且拥有旺盛的生命力。Java的跨平台能力十分强大&#xff0c;只需一次编译&#xff0c;任…

独立站内容营销SOP 1.0 丨出海笔记

提到内容营销&#xff0c;可能很多朋友都听过但没深入做&#xff0c;国内跨境独立站通过内容营销做的大流量的目前不多&#xff0c;哪怕大如 Shein, Anker&#xff0c;大部分时候还是在买量获客的阶段。 但大家只要明白一点即可&#xff1a;内容做得好不好&#xff0c;直接影响…

AD中的PCB的原点怎么设置?

在AD中&#xff0c;可以通过编辑元件的属性或者直接在PCB编辑器中设置原点来设置PCB或元件的原点。 对于PCB设计&#xff0c;你可以在PCB编辑器中直接设置原点。首先&#xff0c;你需要打开你的PCB设计文件。然后&#xff0c;在PCB编辑器中&#xff0c;选择“编辑”菜单下的“原…

在JSP环境配置中遇到的一些问题

本人使用eclipse进行开发&#xff0c;在eclipse中配置环境。 1.安装Tomcat 下载版本为tomcat-9.0.95&#xff1b; 详见教程&#xff1a;tomcat下载安装及配置教程_tomcat安装-CSDN博客 遇到的问题&#xff1a;运行startup.bat会闪退&#xff0c; 解决办法&#xff1a;tomcat…

UI自动化测试(python)Web端4.0

✨博客主页&#xff1a; https://blog.csdn.net/m0_63815035?typeblog &#x1f497;《博客内容》&#xff1a;.NET、Java.测试开发、Python、Android、Go、Node、Android前端小程序等相关领域知识 &#x1f4e2;博客专栏&#xff1a; https://blog.csdn.net/m0_63815035/cat…

众数信科 | CrowdAgents 企业级AI智能体平台

AI大模型在企业落地 还存在很多问题 企业需要什么样的大模型产品 众数信科 CrowdAgents企业级AI智能体平台 平台亮点 01 02 03 核心功能 AI智能体 AI企业智脑 Agent引擎 关于我们 众数信科成立于2021年&#xff0c;由云从科技联合厦门火炬集团、民生电商作为创始股东发起成…

智能仓库|基于springBoot的智能无人仓库管理设计与实现(附项目源码+论文+数据库)

私信或留言即免费送开题报告和任务书&#xff08;可指定任意题目&#xff09; 目录 一、摘要 二、相关技术 三、系统设计 四、数据库设计 五、核心代码 六、论文参考 七、源码获取 一、摘要 互联网发展至今&#xff0c;无论是其理论还是技术都已经成熟&#xf…

【24华为杯数模研赛赛题思路已出】国赛B题思路丨附参考代码丨免费分享

2024年华为杯研赛B题解题思路 B题 WLAN组网中网络吞吐量建模 问题1 请根据附件WLAN网络实测训练集中所提供的网络拓扑、业务流量、门限、节点间RSSI的测试基本信息&#xff0c;分析其中各参数对AP发送机会的影响&#xff0c;并给出影响性强弱的顺序。通过训练的模型&#xff…

数值计算 --- 平方根倒数快速算法(0x5f3759df,这是什么鬼!!!)

平方根倒数快速算法 --- 向Greg Walsh致敬&#xff01; 1&#xff0c;牛顿拉夫逊 已知x&#xff0c;要计算&#xff0c;假设的值为a&#xff0c;则&#xff1a; &#xff0c;&#xff08;式1&#xff09; 如果定义一个自变量为a的函数f(a): 则&#xff0c;令函数f(a)等于0的a就…

高算力芯片的发展

最近参与了2024年北京AI芯片峰会&#xff0c;虽然是讲AI芯片&#xff0c;但因为目前算力主要讲的是智能算力&#xff0c;所以&#xff0c;针对高算力芯片的发展趋势有重点的讲解。之前没有很系统关注这块&#xff0c;这次算是做了全面了解。下面&#xff0c;借用峰会的一些内容…

XXl-SSO分布式单点登录框架

概述 下载地址&#xff1a;https://gitee.com/xuxueli0323/xxl-sso 文档地址&#xff1a;https://www.xuxueli.com/xxl-sso/ 概述 XXL-SSO 是一个分布式单点登录框架。只需要登录一次就可以访问所有相互信任的应用系统。 拥有"轻量级、分布式、跨域、CookieToken均支持…

基于SpringBoot+Vue的时尚美妆电商网站系统

作者&#xff1a;计算机学姐 开发技术&#xff1a;SpringBoot、SSM、Vue、MySQL、JSP、ElementUI、Python、小程序等&#xff0c;“文末源码”。 专栏推荐&#xff1a;前后端分离项目源码、SpringBoot项目源码、SSM项目源码 精品专栏&#xff1a;Java精选实战项目源码、Python精…

Adobe出现This unlicensed Photoshop app has been disabled

Adobe Acrobat或Photoshop软件突然出现This unlicensed Photoshop app has been disabled 症状 解决方法 删除软件安装目录下的AcroCEF和acrocef_1l两个子文件夹。主要是为了删除AcroCEF.exe。 如果存在复发&#xff0c;则删除xxxxxxx\AdobeGCClient\AdobeGCClient.exe。 不…