「算法」二分查找1:理论&细节

这篇具有很好参考价值的文章主要介绍了「算法」二分查找1:理论&细节。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

🎇个人主页:Ice_Sugar_7
🎇所属专栏:算法详解
🎇欢迎点赞收藏加关注哦!

二分查找算法简介

  • 这个算法的特点就是:细节多,出错率高,很容易就写成死循环
  • 有模板,但切记要在理解的基础上记忆,不要死记硬背。有三个模板,一个是本文要讲的简单模板,另外两个分别是查找左、右边界的模板,会在后面的文章中讲解

正文

时间复杂度的推导过程
「算法」二分查找1:理论&细节,算法详解,算法,数据结构

啥时候用二分算法?

  • 能找到某种规律,根据这个规律能找到某个点,以这个点能把区间划分为两块,其中一半区间可以舍弃掉,只需从另一半区间中继续查找

这么说肯定会觉得抽象,没事儿,后面做题慢慢体会
不过现在需要知道:不一定要数据有序才能用二分查找,只要能以某个点将区间分成两段就可以了(简称为“二段性”)

细节

循环结束的条件

  • 一开始定义两个指针 leftright ,分别指向数组的起始位置和最后一个位置
  • 在每次循环中,我们只比较区间中点值 mid 和目标值 target 的大小关系,只知道这两个值,区间中剩下的值是啥仍然未知
  • 即使这个区间只剩下一个数,也还是不知道它是谁,此时需要拿它和 target 作比较

所以,left > right 时,循环才结束

找区间的中点

由数学知识可得 mid = (left + right)/ 2
但是如果 left 和 right 很大的话,很可能会溢出,所以比较稳妥的写法是 mid = left + (right - left)/ 2,即左端点加上区间长度的一半

如果一共有奇数个元素,那么 mid 就是正中间那个;如果有偶数个,那就有两个中点,上面那两个式子算出来的是靠左边的中点

而如果要找靠右边的中点,只需加个1:mid = (left + right + 1)/ 2mid = left + (right - left + 1)/ 2


简单的二分查找模板

来道简单题,它的答案就是模板:
二分查找

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

模板为:

public int search(int[] nums, int target) {
        int left = 0,right = nums.length-1;
        while(left <= right) {
            int mid = left+(right-left)/2;
            if(...) left = mid+1;
            else if(...) right = mid - 1;
            else return ...;
        }
        return -1;
    }

使用时,把省略号处的内容填充上就ok了文章来源地址https://www.toymoban.com/news/detail-829290.html

到了这里,关于「算法」二分查找1:理论&细节的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 数据结构,查找算法(二分,分块,哈希)

    一、查找算法         1、二分查找:(前提条件: 必须有序的序列) 2、分块查找:(块间有序,块内无序)     索引表  +  源数据表     思路:     (1)先在索引表中确定在哪一块中     (2)再遍历这一块进行查找 //索引表 typedef  struct  {     int max; //块中最大值

    2024年02月11日
    浏览(59)
  • Python数据结构与算法篇(五)-- 二分查找与二分答案

    1.1 定义         二分查找又称折半查找、二分搜索、折半搜索等,是一种在静态查找表中查找特定元素的算法。         所谓静态查找表,即只能对表内的元素做查找和读取操作,不允许插入或删除元素。         使用二分查找算法,必须保证查找表中存放的是有

    2023年04月20日
    浏览(47)
  • 数据结构和算法之二分法查找

    二分法查找,也称作 二分查找 或 折半查找 ,是一种在有序数组中快速查找特定元素的算法。它采用分治法思想,通过将问题划分为规模更小的子问题,并且通过对子问题的查找来解决原问题。 二分法查找的思路是不断地将数组一分为二,然后判断目标值在哪一部分,进而

    2024年02月09日
    浏览(47)
  • 【数据结构与算法】python实现二分查找

    二分查找 又称折半查找,它是一种效率较高的查找方法 原理:首先,假设表中元素是按升序排列,将表中间位置记录的与查找比较,如果两者相等,则查找成功;否则利用中间位置记录将表分成前、后两个子表,如果中间位置记录的大于查找,则

    2024年02月05日
    浏览(40)
  • Java【数据结构】二分查找

    🌏在 有序 数组A中,查找目标值target 🌏如果找到返回索引 🌏如果找不到返回-1 算法描述 解释 前提 给定一个内含n个元素的有序数组A,满足A0=A1=A2=·······=An-1,一个待查值target 1 设置left=0;right = n - 1 2 如果left right ,结束查找,没找到 3 设置mid = (left + right )/2,mid为中间

    2024年02月12日
    浏览(48)
  • 数据结构-查找(顺序查找与二分查找的讲解与代码实现)

    顺序查找概念:从表的另一端开始,一次将记录的和给定值进行比较,若某个记录的和给定的值相等,则查找成功,反之则查找失败。 ASL:平均查找长度 pi查找概率,ci查找次数 eg:序列1,2,3 查找1的次数为1概率为1/3,2为两次概率1/3,3的次数为3概率1/3  将12

    2024年02月06日
    浏览(69)
  • 【数据结构与算法】查找(Search)【详解】

    【知识框架】 查找(Searching) :就是根据给定的某个值,在查找表中确定一个其等于给定值的数据元素( 或记录)。 查找表(Search Table) :是由同一类型的数据元素(或记录)构成的集合。 (Key):数据元素中唯一标识该元素的某个数据项的值,使用基于的查找,查

    2024年02月02日
    浏览(49)
  • 【算法与数据结构】1 算法0基础入门,详解什么是算法?什么是线性查找法?

    欢迎来到爱书不爱输的程序猿的博客, 本博客致力于知识分享,与更多的人进行学习交流 本文收录于算法与数据结构体系专栏, 本专栏 是服务于0基础者,一起完成从0到1的跨越 就是 一系列 可以解决问题的 清晰的 可执行的 计算机指令 那么生活中有哪些算法? 问路 :坐公交车到

    2023年04月09日
    浏览(53)
  • 浙大数据结构第一周01-复杂度3 二分查找

    本题要求实现二分查找算法。 函数接口定义: 其中 List 结构定义如下: L 是用户传入的一个线性表,其中 ElementType 元素可以通过、==、进行比较,并且题目保证传入的数据是递增有序的。函数 BinarySearch 要查找 X 在 Data 中的位置,即数组下标(注意:元素从下标1开始存储)

    2024年02月12日
    浏览(47)
  • 算法与人生 揭秘C语言中高效搜索的秘诀——二分查找算法详解

    引言,少年们,大家好。在这里祝大家元旦快乐,我是博主 那一脸阳光 ,今天来介绍二分查找 在计算机科学领域,搜索算法是数据处理和问题解决的重要工具之一。其中,**二分查找算法(Binary Search)**以其卓越的时间复杂度和简洁高效的实现,在众多搜索算法中脱颖而出

    2024年01月17日
    浏览(59)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包