二分法查找解题原理与运用方式

简介: 二分法查找解题原理与运用方式

二分法原理


分法查找也可以叫做折半查找;它是一种高效的查找方法。但是它要求线性表必须采用顺序存储结构,而且表中元素是有序排列。

以升序数列为例,比较一个元素与数列中的中间位置的元素的大小,如果比中间位置的元素大,则继续在后半部分的数列中进行二分查找;

如果比中间位置的元素小,则在数列的前半部分进行比较;如果相等,则找到了元素的位置。

每次比较的数列长度都会是之前数列的一半,直到找到相等元素的位置或者最终没有找到要找的元素。


在二分查找中,目标元素的查找区间的定义十分重要,只找对了区间,才能够减少计算找到正确的值

简单来说二分查找有以下几个步骤:


  • 首先选择数组中间的数字和需要查找的目标值比较;如果相等最好,就可以直接返回答案了
  • 如果不相等
  • 如果中间的数字大于目标值,则中间数字向右的所有数字都大于目标值,全部排除
  • 如果中间的数字小于目标值,则中间数字向左的所有数字都小于目标值,全部排除


image.png


时间复杂度


二分查找有个很重要的特点,就是不会查找数列的全部元素,而查找的数据量其实正好符合元素的对数,正常情况下每次查找的元素都在一半一半地减少。

所以二分查找的时间复杂度为

image.png

实战实验


看的再多的理论都是纸上谈兵,我们来实战一下

在有序数组[-1,0,3,4,6,10,13,14]找到13的下标

返回值:6

说明:13 出现在nums中并且下标为 6

具体的解题步骤可以拆分为以下几步:

  • 第一步:初始化区间范围[left,right]
  • 第二步:如果左区间值left小于等于右区间值right;开始进入循环
  • 在循环体内找到中间点;判断中间点的值是不是目标值,如果是就返回
  • 如果目标值 < nums[mid],表示目标值可能在左半边,就重新赋值右区间
  • 如果目标值 > nums[mid],表示目标值可能在右半边,就重新赋值左区间
function search(nums, target) {
    // write code here
    // 在区间[left,right]中查找元素,左闭右闭
    let left = 0;
    let right = nums.length - 1;
    while (left <= right) {
        // 计算中间点
        let mid = parseInt(left + (right-left)/2);
        if (target == nums[mid]) {
            return mid;
         // 如果target < nums[mid],表示目标值可能在左半边
        } else if (target < nums[mid]){
            right = mid - 1;
        // 如果target > nums[mid],表示目标值可能在右半边
        } else if (target > nums[mid]){
            left = mid + 1;
        }
    }
    // 未找到返回-1
    return -1;
}
module.exports = {
  search: search,
};



目录
相关文章
|
2月前
|
开发框架 监控 安全
Windows Defender 导致 Web IIS 服务异常停止排查
某日凌晨IIS服务异常停止,经查为Windows Defender安全补丁KB2267602触发引擎更新,导致系统资源波动,进而引发应用池回收。确认非人为操作,系统无重启。通过分析日志与监控,定位原因为Defender更新后扫描加重负载。解决方案:将IIS及.NET相关路径添加至Defender排除列表,避免业务影响。
417 116
|
9月前
|
机器学习/深度学习 存储 算法
强化学习:蒙特卡罗求解最优状态价值函数——手把手教你入门强化学习(五)
本文介绍了强化学习中的蒙特卡罗算法,包括其基本概念、两种估值方法(首次访问蒙特卡罗与每次访问蒙特卡罗)及增量平均优化方式。蒙特卡罗法是一种基于完整回合采样的无模型学习方法,通过统计经验回报的平均值估计状态或动作价值函数。文章详细讲解了算法流程,并指出其初期方差较大、估值不稳定等缺点。最后对比动态规划,说明了蒙特卡罗法在强化学习中的应用价值。适合初学者理解蒙特卡罗算法的核心思想与实现步骤。
512 4
|
编解码 人工智能 文件存储
轻量级网络论文精度笔记(二):《YOLOv7: Trainable bag-of-freebies sets new state-of-the-art for real-time object ..》
YOLOv7是一种新的实时目标检测器,通过引入可训练的免费技术包和优化的网络架构,显著提高了检测精度,同时减少了参数和计算量。该研究还提出了新的模型重参数化和标签分配策略,有效提升了模型性能。实验结果显示,YOLOv7在速度和准确性上超越了其他目标检测器。
393 0
轻量级网络论文精度笔记(二):《YOLOv7: Trainable bag-of-freebies sets new state-of-the-art for real-time object ..》
|
机器学习/深度学习 人工智能 JSON
|
存储 NoSQL 中间件
软件体系结构 - 数据分片
【4月更文挑战第20天】软件体系结构 - 数据分片
553 15
|
SQL 消息中间件 Java
Flink报错问题之使用debezium-json format报错如何解决
Apache Flink是由Apache软件基金会开发的开源流处理框架,其核心是用Java和Scala编写的分布式流数据流引擎。本合集提供有关Apache Flink相关技术、使用技巧和最佳实践的资源。
|
分布式计算 DataWorks NoSQL
DataWorks中mongo同步到odps后时间多了8小时?
DataWorks中mongo同步到odps后时间多了8小时?
341 0
|
数据可视化 程序员 图形学
零基础新手如何自己制作游戏?
零基础新手如何自己制作游戏?
712 0