二分查找入门教学(动态讲解图、模拟示例、二分查找代码讲解)

这篇具有很好参考价值的文章主要介绍了二分查找入门教学(动态讲解图、模拟示例、二分查找代码讲解)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

博客昵称:吴NDIR
个人座右铭:得之淡然,失之坦然
作者简介:喜欢轻音乐、象棋,爱好算法、刷题
其他推荐内容:计算机导论速记思维导图
其他内容推荐:五种排序算法


在这个愉快的周末让我们聊一下二分查找吧!二分查找是一种很常用的算法,可帮助我们在有序数组中快速查找元素。

概念

  1. 问题:想象一下,你有一堆按升序排列的数字,并且你需要在其中查找一个对应的数字。
  • 如果你采用线性查找方式,即从数组的首个元素开始遍历,一直到找到对应数字为止。

二分查找入门教学(动态讲解图、模拟示例、二分查找代码讲解)

  • 显然,采用这种方法你可能需要遍历整个数组。如果数组很大,则这种线性查找方式会变得很慢。让我们看看二分查找吧!
  • 当我们需要在一个有序数组中查找某个值的位置时,二分查找是一个高效的算法。这个算法的核心思想是将数组一分为二,然后判断目标值可能存在于数组的哪一个半边,不断缩小范围,最终找到目标位置或者确定目标值不存在于数组中。

二分查找入门教学(动态讲解图、模拟示例、二分查找代码讲解)下面是二分查找的一般步骤:

  1. 首先确定目标值在数组的哪个区间内。将目标值和数组的中间值进行比较,如果目标值等于中间值,那么我们已经找到了目标,在中间值的位置返回。如果目标值小于中间值,那么我们将在左半边查找目标,否则我们将在右半边查找目标。

  2. 分别使用上一步中的方式在左半边或右半边递归查找,直到找到目标或者确定目标不存在于数组中。

  3. 如果我们发现要查找的目标值不在数组中,那么我们可以返回 -1 表示未找到目标。

二分查找的时间复杂度为 O(log n),其中 n 表示数组长度。这是因为每次比较可以将查找范围减半,而在最坏情况下需要进行的比较次数是 log n。在使用二分查找时,需要注意一些细节,首先数组必须是已经排序好的,查找范围的左右边界需要正确设置,一些边界条件需要特殊处理等。同时,二分查找并不适用于所有场景,例如数据量很小时使用暴力搜索会更加有效。

引例

现在让我们看看一道有关二分查找的题目吧!

题目描述:

  • 给定一个 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.首先将数组分为左右两个区间
2.将中间数与待查找目标比较

  • 在查找范围区间[left, right]中取中点 mid,比较 nums[mid] 和 target 的大小。
    如果 nums[mid] = target,则mid即为要寻找的下标,返回 mid。
    如果 nums[mid] < target,则target只可能在mid的右侧,更新区间[mid+1,right]。
    如果 nums[mid] > target,则target只可能在mid的左侧,更新区间[left,mid-1]。

3.重复步骤1和2,直到找到目标target或者未找到目标但left=right
4.最终返回下标,或返回-1表示 target 不存在于 nums 数组中。
二分查找入门教学(动态讲解图、模拟示例、二分查找代码讲解)

  • 示例代码
int search(int nums[], int numsSize, int target){
    int left=0,right=numsSize-1,mid;
    while(left<=right){
   		mid=left+(right-left)/2;//根据新区间定义中间数下标
   		//比较判断
        if(nums[mid]<target){
            left=mid+1;//定义区间[mid+1,right]
        }
        else if(nums[mid]>target){
            right=mid-1;//定义区间[left,mid-1]
        }
        else{
            return mid;//找到target并返回下标
        }
    }
    return -1;//未找到返回-1
}

讲解

  • 在上述代码中,我们首先初始化左右两个指针。**left 和 right 分别指向数组的第一位和最后一位。**然后,我们在循环中计算中间指针 mid 的位置,再将中间指针的值与要查找的值进行比较,以确定在哪一侧继续搜索。如果找到匹配值,则返回其下标;否则,如果整个数组都已搜索完毕,则返回 -1。
  • 那么,我们要如何保证它的正确性和性能呢?
  1. 首先,我们需要确保我们的算法是正确的。在二分查找中,正确性在于确定中间元素是否是我们正在寻找的值,而不是中间位置是否已经被检查过。因此,我们可以通过在每个循环中将查找范围的一半排除来保证其正确性。
  • 其次,我们需要考虑性能问题。在最坏情况下,遍历整个数组的时间复杂度为 O ( l o g n ) O(log n) O(logn)。但是,由于此算法可以轻松地丢弃一半的数据,因此在一些特殊情况下,我们可以获得更快的执行速度。

总而言之,二分查找是一种非常有效的算法,特别是在大型数据集上查找单个值时。通过理解二分查找算法的工作原理,我们可以更好地掌握它并将其用于实际开发中。文章来源地址https://www.toymoban.com/news/detail-417345.html

到了这里,关于二分查找入门教学(动态讲解图、模拟示例、二分查找代码讲解)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

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

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

相关文章

  • 【动态规划】【二分查找】【C++算法】730. 统计不同回文子序列

    视频算法专题 动态规划汇总 二分查找算法合集 给你一个字符串 s ,返回 s 中不同的非空回文子序列个数 。由于答案可能很大,请返回对 109 + 7 取余 的结果。 字符串的子序列可以经由字符串删除 0 个或多个字符获得。 如果一个序列与它反转后的序列一致,那么它是回文序列

    2024年01月19日
    浏览(39)
  • 代码随想录 LeetCode数组篇 二分查找

    # (简单)704. 二分查找 题目链接 代码随想录 - 二分查找思路 二分查找,思路很简单,但是在while循环left和right的比较是写=还是,还有right=mid还是right=mid-1容易混淆 需要想清楚对区间的定义,是[left,right],还是[left,right) (版本一,左闭右闭版本) (版本二,左闭右开) 题目

    2024年02月02日
    浏览(33)
  • 【算法】【Python3、动态规划、贪心、二分查找】力扣1671. 得到山形数组的最少删除次数

    1671. 得到山形数组的最少删除次数 给定一个整数数组 nums ,我们定义该数组为山形数组当且仅当: nums 的长度至少为 3。 存在一个下标 i 满足 0 i len(nums) - 1 且: nums[0] nums[1] ... nums[i - 1] nums[i] nums[i] nums[i + 1] ... nums[len(nums) - 1] 现在,给定整数数组 nums ,我们的目标是将其变为

    2024年01月18日
    浏览(44)
  • 代码随想录算法练习Day1:二分查找

    题目链接:704. 二分查找 卡哥视频讲解:手把手带你撕出正确的二分法 | 二分查找法 | 二分搜索法 | LeetCode:704. 二分查找 二分法概述: 二分法(Binary Search)是一种在有序数组或列表中查找目标元素的算法。 二分法使用前提 : 有序数组或列表 :二分法要求在查找的数据结

    2024年04月23日
    浏览(32)
  • 看完这篇文章你就彻底懂啦{保姆级讲解}-----(LeetCode刷题704、35、34数组二分查找) 2023.4.17

    本文章一部分内容参考于《代码随想录》----如有侵权请联系作者删除即可,撰写本文章主要目的在于记录自己学习体会并分享给大家,全篇并不仅仅是复制粘贴,更多的是加入了自己的思考,希望读完此篇文章能真正帮助到您!!! 数组是由n(n=1)个 相同类型 的数据元素

    2024年02月05日
    浏览(37)
  • 代码随想录Python:704. 二分查找,27. 移除元素

    数组是非常基础的数据结构。 数组是存放在连续内存空间上的相同类型数据的集合。 题目: 给定一个  n  个元素有序的(升序)整型数组  nums  和一个目标值  target   ,写一个函数搜索  nums  中的  target ,如果目标值存在返回下标,否则返回  -1 。 题目链接:. - 力扣

    2024年02月13日
    浏览(40)
  • LeetCode-1483. 树节点的第 K 个祖先【树 深度优先搜索 广度优先搜索 设计 二分查找 动态规划】

    给你一棵树,树上有 n 个节点,按从 0 到 n-1 编号。树以父节点数组的形式给出,其中 parent[i] 是节点 i 的父节点。树的根节点是编号为 0 的节点。 树节点的第 k 个祖先节点是从该节点到根节点路径上的第 k 个节点。 实现 TreeAncestor 类: TreeAncestor(int n, int[] parent) 对树和父

    2024年04月16日
    浏览(28)
  • 【代码随想录算法第一天| 704.二分查找 27.移除元素】

    题目链接:二分查找 文章讲解:代码随想录.二分查找 视频讲解:手把手带你撕出正确的二分法 | 二分查找法 | 二分搜索法 | LeetCode:704. 二分查找_哔哩哔哩_bilibili 二分前提:有序数组,数组中无重复元素 方法:结合数组的特征,可以为左闭右闭区间[0, 数组长度-1],或者左

    2024年02月16日
    浏览(33)
  • 代码随想录day1 | 704.二分查找 27.移除元素

    1、循环变量 2、判断条件 当时左闭右闭时,while循环里面的条件,我们可以先假设,有等号即有left=right的情况,例如[1,1]这个区间,那么循环是要进入里面的,所以要取得等号。 判断的时候,nums[mid]tar,那么必然tar不在右半区间,所以right=mid-1 nums[mid]tar,那么必然tar不在左半

    2024年02月15日
    浏览(52)
  • 【Python从入门到人工智能】详解 PyTorch数据读取机制 DataLoader & Dataset(以人民币-RMB二分类实战 为例讲解,含完整源代码+问题解决)| 附:文心一言测试

      我想此后只要能以工作赚得生活费,不受意外的气,又有一点自己玩玩的余暇,就可以算是万分幸福了。                                                              ———《两地书》   🎯作者主页: 追光者♂🔥          🌸个人简介:

    2024年02月11日
    浏览(39)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包