大厂高级程序员必备算法,看似简单的二分查找,您了解多少?( 二 )

  • 搜索条件需要访问元素的直接左右邻居
  • 使用元素的邻居来确定它是向右还是向左
  • 保证查找空间在每个步骤中至少有3个元素
  • 需要进行后处理 。当剩下2个元素,循环/递归结束 。
  • 2.4、模版分析:
    大厂高级程序员必备算法,看似简单的二分查找,您了解多少?

    文章插图
     
    这三个模版的不同之处在于:
    • 左、中、右索引的分配
    • 循环或递归终止条件
    • 后处理的必要性
    其中模版一和模版三是最常用的,几乎所有二分查找问题都可以用其中之一亲送实现 。模版二更高级一些,用于解决某些类型的问题 。
    这 3 个模板中的每一个都提供了一个特定的用例:
    模板 1 (left <= right)
    • 二分查找的最基础和最基本的形式 。
    • 查找条件可以在不与元素的两侧进行比较的情况下确定(或使用它周围的特定元素) 。
    • 不需要后处理,因为每一步中,你都在检查是否找到了元素 。如果到达末尾,则知道未找到该元素 。
    模板 2 (left < right)
    • 一种实现二分查找的高级方法 。
    • 查找条件需要访问元素的直接右邻居 。
    • 使用元素的右邻居来确定是否满足条件,并决定是向左还是向右 。
    • 保证查找空间在每一步中至少有 2 个元素 。
    • 需要进行后处理 。当你剩下 1 个元素时,循环 / 递归结束 。需要评估剩余元素是否符合条件 。
    模板 3 (left + 1 < right)
    • 实现二分查找的另一种方法 。
    • 搜索条件需要访问元素的直接左右邻居 。
    • 使用元素的邻居来确定它是向右还是向左 。
    • 保证查找空间在每个步骤中至少有 3 个元素 。
    • 需要进行后处理 。当剩下 2 个元素时,循环 / 递归结束 。需要评估其余元素是否符合条件 。
    三、复杂度计算3.1、时间复杂度
    O(log n) :
    因为二分查找是通过对查找空间中间的值应用一个条件来操作的,并因此将查找空间折半,在更糟糕的情况下,我们将不得不进行O(log n) 次比较,其中n是集合中元素的数目 。
    为什么是log n?
    • 二分查找是通过将现有数组一分为二来执行的
    • 因此,每次调用子例程(或完成一次迭代)时,其大小都会减少到现有部分的一半 。
    • 首先N变成 N/2,然后又变成N/4,然后继续下去,直到找到元素或尺寸变为1 。
    • 迭代的最大次数是log N(base2) 。
    第一次: n/2第二次: n/2^2第三次: n/2^3...第k次: n/2^k
    大厂高级程序员必备算法,看似简单的二分查找,您了解多少?

    文章插图
     

    大厂高级程序员必备算法,看似简单的二分查找,您了解多少?

    文章插图
     
    3.2、空间复杂度
    O(1)
    虽然二分查找确实需要跟踪 3 个指标,但迭代解决方案通常不需要任何其他额外空间,并且可以直接应用于集合本身,因此需要 O(1) 或常量空间 。
    四、二分查找的应用
    • 二分调试法
    把所有潜在的问题都用类似“数组二分查找”的方式把代码遍历一遍,不断缩小问题的范围,最终找到问题原因 。
    通过二分法,我们可以快速缩小问题范围,这样一来调试的效率也就上去了 。
    • Kafka 采用二分法找数据
    二分查找相关系列题:
    大厂高级程序员必备算法,看似简单的二分查找,您了解多少?

    文章插图
     

    【大厂高级程序员必备算法,看似简单的二分查找,您了解多少?】


    推荐阅读