蓝桥杯备考随手记: 二分查找

二分查找(Binary Search)是一种在有序数组中查找目标值的算法,也称为折半查找。它通过将目标值与数组的中间元素进行比较,来确定目标值在数组的哪一部分,然后将搜索范围缩小一半,再次比较,直到找到目标值或者确定目标值不存在。

1. 基本思想

  1. 首先,将数据集合按照某种顺序(通常是升序或降序)排列。
  2. 然后,选择数据集合的中间元素进行比较,若目标值等于中间元素,则查找成功;若目标值小于中间元素,则在左半部分继续查找;若目标值大于中间元素,则在右半部分继续查找。
  3. 重复以上步骤,直到找到目标值或者确定目标值不存在为止。

2. 算法步骤

二分查找的实现步骤如下:

  1. 定义搜索范围的起始位置 left 和结束位置 right,初始时 left = 0right = n-1,其中 n 是数组的长度。
  2. 计算中间元素的位置 mid,即 mid = (left + right) / 2
  3. 将目标值与中间元素进行比较:
    • 如果目标值等于中间元素,则找到了目标值,返回其索引。
    • 如果目标值小于中间元素,则目标值可能在左侧,更新 right = mid - 1
    • 如果目标值大于中间元素,则目标值可能在右侧,更新 left = mid + 1
  4. 重复步骤2和3,直到找到目标值或者搜索范围缩小为空。

3. 代码实现

下面是使用Java编写的二分查找算法示例:

public class BinarySearch {// 二分查找算法public static int binarySearch(int[] arr, int target) {int left = 0; // 左边界初始化为数组第一个元素的下标int right = arr.length - 1; // 右边界初始化为数组最后一个元素的下标// 当左边界小于等于右边界时,继续查找while (left <= right) {int mid = left + (right - left) / 2; // 计算中间位置的下标// 如果目标元素等于中间位置的元素,则返回中间位置if (arr[mid] == target) {return mid;} else if (arr[mid] < target) { // 如果目标元素大于中间位置的元素,更新左边界left = mid + 1;} else { // 如果目标元素小于中间位置的元素,更新右边界right = mid - 1;}}return -1; // 目标元素不存在于数组中}public static void main(String[] args) {int[] arr = {1, 3, 5, 7, 9, 11, 13, 15}; // 有序数组int target = 7; // 目标元素int index = binarySearch(arr, target); // 调用二分查找算法// 输出查找结果if (index != -1) {System.out.println("目标元素 " + target + " 在数组中的索引位置为 " + index);} else {System.out.println("目标元素 " + target + " 不存在于数组中");}}
}

4. 复杂度分析

  • 时间复杂度:𝑂(log⁡𝑛),每次查找都将数据量减半。
  • 空间复杂度:𝑂(1),只需要常数级别的额外空间。

5. 优缺点

  • 优点:效率高,适用于有序数据集合的查找。
  • 缺点:要求数据集合必须有序;不适用于动态数据集合。

6. 应用场景

  • 静态数据集合的查找,如数组、有序列表等。
  • 需要快速定位元素位置的场景。
  • 数据集合较大且有序的情况下,可以大幅减少查找时间。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/802220.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

使用串口给ESP8266发送AT指令无反应解决

解决方法&#xff1a;重新烧录固件 设置PC机波特率 设置PC机上的端口波特率和flash下载工具中的波特率一致&#xff0c;否则flash下载工具会一直提示串口连接失败。我这里将PC机上的串口波特率设置为115200&#xff0c;然后flash下载工具波特率也设置为115200 Windows系统上…

电脑远程控制esp32上的LED

1、思路整理 首先esp32需要连接上wifi 然后创建udp socket 接受udp数据 最后解析数据&#xff0c;控制LED 2、micropython代码实现 import network from socket import * from machine import Pin p2Pin(2,Pin.OUT)def do_connect(): #连接wifi wlan network.WLAN(network.…

芒果YOLOv8改进组合157:动态标签分配ATSS+新颖高效AsDDet检测头组合改进,共同助力VisDrone涨点1.8%,小目标高效涨点

💡本篇内容:【芒果YOLOv8改进ATSS标签分配策略|第三集】芒果YOLOv8改进组合157:动态标签分配ATSS+新颖高效AsDDet检测头组合改进,共同助力VisDrone涨点1.8%,小目标高效涨点 💡🚀🚀🚀本博客 标签分配策略ATSS改进+ 新颖高效AsDDet检测头组合改进,适用于 YOLOv8 …

超详细解读Transformer框架

Transformer是由谷歌大脑2017年在论文《Attention is All You Need》中提出的一种序列到序列(Seq2Seq)模型。自提出伊始&#xff0c;该模型便在NLP和CV界大杀四方&#xff0c;多次达到SOTA效果。NLP领域中&#xff0c;我们所熟知的BERT和GPT就是从Transformer中衍生出来的预训练…

使用Ollama在本地运行AI大模型gemma

1.下载&#xff1a; https://github.com/ollama/ollama/releases 2.配置环境变量 我的电脑-右键-属性-系统-高级系统设置-环境变量-【系统环境变量】新建 变量名&#xff1a;OLLAMA_MODELS &#xff08;固定变量名&#xff09; 变量值&#xff1a;E:\Ollama\Lib &#xff0…

iOS 开发中上传 IPA 文件的方法(无需 Mac 电脑)

引言 在 iOS 开发中&#xff0c;将 IPA 文件上传到苹果开发者中心是一个重要的步骤。通常情况下&#xff0c;我们需要使用 Mac 电脑上的 Xcode 或 Application Loader 工具来完成这个任务。然而&#xff0c;如果你没有 Mac 电脑&#xff0c;也没有关系&#xff0c;本文将介绍一…

Linux系统部署搭建AI私人知识库助手教程

前言 本篇文章教你如何搭建本地的私有大语言模型,和向量画数据库,实现一个本地的私有AI知识问答客服系统。需要用到的技术是开源项目由docker,fastgpt、one-api,开源LLM大模型,vllm或者ollama。 docker 是一款开源的应用容器引擎,用来快速构建服务。fastgpt 基于LLM大模型…

express里面的鉴权及express-session中间件的使用总结

了解 HTTP 协议的无状态性是进一步学习 Session 认证机制的必要前提。http 协议的无状态性&#xff0c;指的是客户端的每次 http 请求都是独立的&#xff0c;连续多个请求之间没有直接的关系&#xff0c;服务器不会主动保留每次 http 请求的状态。 什么是 Cookie Cookie 是存储…

如何在CentOS安装Nexus容器无公网IP远程管理本地仓库

文章目录 1. Docker安装Nexus2. 本地访问Nexus3. Linux安装Cpolar4. 配置Nexus界面公网地址5. 远程访问 Nexus界面6. 固定Nexus公网地址7. 固定地址访问Nexus Nexus是一个仓库管理工具&#xff0c;用于管理和组织软件构建过程中的依赖项和构件。它与Maven密切相关&#xff0c;可…

LeetCode-394. 字符串解码【栈 递归 字符串】

LeetCode-394. 字符串解码【栈 递归 字符串】 题目描述&#xff1a;解题思路一&#xff1a;辅助栈法解题思路二&#xff1a;递归法解题思路三&#xff1a;0 题目描述&#xff1a; 给定一个经过编码的字符串&#xff0c;返回它解码后的字符串。 编码规则为: k[encoded_string]…

Golang 为什么需要用反射

本质上是可以动态获取程序运行时的变量&#xff08;类型&#xff09; 比如现在我想实现一个通用的db插入函数&#xff0c;支持我传入所有类型的struct&#xff0c;每一种类型的struct是一个单独的表&#xff0c;以struct的名称作为表名&#xff0c;然后插入到不同的表中。 pa…

ios swift5 “Sign in with Apple“(使用苹果登录)怎样接入(第三方登录)集成AppleID登录

文章目录 截图1.在开发者网站的app id中添加Sign in with Apple功能2.在Xcode中添加Sign in with Apple功能3.代码&#xff1a;只有第一次登录的时候可以获取到用户名参考博客chatGPT答案 截图 1.在开发者网站的app id中添加Sign in with Apple功能 1.1 如果你新建app id,记得在…

Spring事务简介,事务角色,事务属性

1.Spring事务简介 事务作用&#xff1a;在数据层保障一系列的数据库操作同成功同失败Spring事务作用&#xff1a;在数据层或业务层保障一系列的数据操作同成功同失败 public interface PlatformTransactionManager{void commit(TransactionStatus status) throws TransactionE…

Qt 翻译工具:使用 tr() 函数实现多语言支持

引言 在开发跨平台应用程序时&#xff0c;支持多语言是一个常见需求。Qt 提供了一套完整的国际化工具&#xff0c;帮助开发者轻松实现应用程序的本地化。本文将介绍如何在 Qt 中使用 tr() 函数进行翻译&#xff0c;并总结一些常见的困难和解决方法。 使用 tr() 函数进行翻译 …

CSS中的类命名

CSS类名在开发中一般都是简单的命名一下&#xff0c;例如 nav、title、menu 等等&#xff0c;但是这也带来了问题&#xff0c;出现命名冲突的时候不知道是哪里引起的&#xff0c;加上 CSS 本身权重的问题就更加棘手。如果是小项目&#xff0c;代码不多、开发人员较少还可以控制…

plasmo开发浏览器插件动态setIcon修改插件图标和setBadgeText显示徽标

动态修改图标和设置徽标主要用到action这个api&#xff0c;官网地址&#xff1a;https://developer.chrome.com/docs/extensions/reference/api/action?hlzh-cn#method-setIcon 如果你使用官方原生的方式开发&#xff0c;加载和修改图标应该是比较简单的&#xff0c;但是如果…

2024.4.7力扣每日一题——王位继承顺序

2024.4.7 题目来源我的题解方法一 哈希表多叉树的前序遍历 题目来源 力扣每日一题&#xff1b;题序&#xff1a;1600 我的题解 方法一 哈希表多叉树的前序遍历 发现继承顺序的生成与多叉树的前序遍历一致&#xff0c;只需要在遍历过程中将已经去世的给排除就可以了。 如何存…

Ubuntu系统中,使用`nohup`命令启动Java程序。nohup参数说明、验证启动、停止程序详细教程

在Ubuntu系统中&#xff0c;使用nohup命令启动Java程序可以实现在后台运行程序&#xff0c;即使终端关闭或用户注销&#xff0c;程序也会继续运行。以下是使用nohup启动Java程序的步骤&#xff1a; 打开终端。 进入到你的Java程序所在的目录&#xff0c;或者确保JAVA_HOME环境…

valgrind 是个啥?

最近在看PG代码时&#xff0c;看到许多VALGRIND相关的宏&#xff0c;例如 VALGRIND_MAKE_MEM_DEFINED、 VALGRIND_MAKE_MEM_NOACCESS&#xff0c;特别是移植PG的某模块到OG时&#xff0c;由于OG中没有定义这些宏&#xff0c;遇到这些宏&#xff0c;一开始我也不知道该怎么办了。…

C语言面试题之合并排序的数组

合并排序的数组 实例要求 1、给定两个排序后的数组 A 和 B&#xff0c;其中 A 的末端有足够的缓冲空间容纳 B&#xff1b; 2、编写一个方法&#xff0c;将 B 合并入 A 并排序&#xff1b; 3、初始化 A 和 B 的元素数量分别为 m 和 n&#xff1b; 示例: 输入: A [1,2,3,0…