二分查找(Binary Search)

devtools/2024/9/22 18:37:43/

二分查找(Binary Search)是一种在有序数组或有序区间中查找特定元素的高效算法。其基本思想是每次都通过与区间的中间元素比较,将待查找的区间缩小为之前的一半,直到找到目标值或区间被缩小为零。以下是二分查找的基本步骤:

  1. 初始化:确定待查找的有序数组或区间,设其起始索引为low,终止索引为high

  2. 计算中间索引:将区间[low, high]的中间索引mid设为 (low + high) // 2

  3. 比较中间元素与目标值

    • 如果中间元素等于目标值,查找结束,返回mid
    • 如果中间元素小于目标值,说明目标值可能在中间元素的右侧,将查找区间缩小为[mid + 1, high]
    • 如果中间元素大于目标值,说明目标值可能在中间元素的左侧,将查找区间缩小为[low, mid - 1]
  4. 判断是否查找完毕:如果low大于等于high,说明区间已被缩小为零,目标值不存在于数组中,返回特定的“未找到”标记(如-1None)。

时间复杂度

  • 最好情况(目标值位于数组中间位置):查找过程可能需要比较 log_2(n) 次(向上取整),时间复杂度为 O(logn)。
  • 最坏情况(目标值位于数组的第一个或最后一个位置):查找过程同样需要比较 log_2(n) 次,时间复杂度为O(logn)。
  • 平均情况查找过程需要比较约 log_2(n) 次,时间复杂度为O(logn)。

空间复杂度二分查找仅需要常数级别的额外空间,用于存储中间索引等临时变量,因此空间复杂度为O(1)。

二分查找要求数据结构为有序且支持随机访问(如数组),在数据规模较大时具有较高的查找效率。以下是二分查找的Python实现:

 

Python

1def binary_search(arr, target):
2    low = 0
3    high = len(arr) - 1
4
5    while low <= high:
6        mid = (low + high) // 2
7        mid_value = arr[mid]
8
9        if mid_value == target:
10            return mid  # 目标值找到,返回其索引
11        elif mid_value < target:
12            low = mid + 1  # 目标值可能在中间元素的右侧,缩小查找区间
13        else:
14            high = mid - 1  # 目标值可能在中间元素的左侧,缩小查找区间
15
16    return -1  # 目标值未找到,返回特定标记
17
18# 示例
19data = [1, 2, 3, 4, 5, 6, 7, 8, 9]
20target = 4
21result = binary_search(data, target)
22if result != -1:
23    print(f"Target found at index {result}")
24else:
25    print("Target not found")

通过不断比较中间元素与目标值,调整查找区间,找到目标值时返回其索引,未找到时返回-1


http://www.ppmy.cn/devtools/39175.html

相关文章

[性能优化] ScrollView视图优化为循环列表

问题描述&#xff1a; 原先商城的物品栏中的item 是load在一个scrollView 下&#xff0c;用于滑动查看。仅仅在父级panel下是使用了NGUI原生的scrollview 组件&#xff0c;随着商场物品列表中新物品的增多。panel下加载的实例也非常庞大。而大部分的实例用户也无法看到&#x…

泰迪科技2024中职大数据实训室方案解读

中职在大数据专业建设所遇到的困难 数据、信息安全、人工智能等新信息技术产业发展迅猛&#xff0c;人才极其匮乏&#xff0c;各个中职院校纷纷开设相应的专业方向。但是&#xff0c;绝大多数院校因为师资和积累问题&#xff0c;在专业建设规划、办学特色提炼、创新教学模…

61-ARM与FPGA间SPI通信电路设计

视频链接 ARM与FPGA间SPI通信电路设计01_哔哩哔哩_bilibili ARM与FPGA间SPI通信电路设计 第22课&#xff1a;SPI Flash 电路设计 第65课&#xff1a;实战S1-FPGA板级实战导学 1、SPI简介 1.1、SPI概述 SPI是(Serial Peripheral Interface) 串行外设接口&#xff0c;由Mot…

Linux -- 日志

一 日志的重要性 在之前的编程经历中&#xff0c;如果我们的程序运行出现了问题&#xff0c;都是通过 标准输出 或 标准错误 将 错误信息 直接输出到屏幕上&#xff0c;以此来排除程序中的错误。 这在我们以往所写的程序中使用没啥问题&#xff0c;但如果出错的是一个不断在运行…

101_Linux文件挂载系统相关

一、文件系统简介 传统的磁盘与文件系统应用中,一个分区就只能够被格式化成为一个文件系统,所以我们可以说一个文件系统就是一个硬盘分区。 随着新技术的出现如LMM与软件磁盘阵列software raid),这些技术可以将一个分区格式化为多个文件系统(例如LWM),也能够将多个分区合成一…

新能源 锂电池行业创业的财富方案,锂电池回收实战攻略课(36节课)

实战攻略 12年锂电池回收行业经验与坑全收录 课程内容&#xff1a; 001-课程介绍.mp4 002-锂电池的全种类认识.mp4 003-废品锂电池到级片粉末价值估算,mp4 004-锂电池的生产应用回收,mp4 005-梯次回收到粉未提纯全流程,mp4 006-锂电池行业术语,mp4 007-回收所需必备工具…

台服dnf局域网搭建,学习用笔记

台服dnf局域网搭建 前置条件虚拟机初始化上传安装脚本以及其他文件至虚拟机密钥publickey.pem客户端配置如果IP地址填写有误&#xff0c;批量修改IP地址 前置条件 安装有vmvarecentos7.6镜像&#xff1a;https://mirrors.tuna.tsinghua.edu.cn/centos-vault/7.6.1810/isos/x86…

在spring中使用bytebuddy 对bean做Aop拦截

背景 拦截spring 中的某个bean拦截其方法的调用。在其前后做一些类似于aop的操作 拦截bean MyBeanDefinitionRegistryPostProcessor import lombok.extern.slf4j.Slf4j; import net.bytebuddy.ByteBuddy; import net.bytebuddy.asm.Advice; import org.springframework.bea…