当前位置: 首页 > news >正文

Java 与查找算法(2)二分查找

一、二分查找

二分查找,也称折半查找,是一种常见的查找算法。它的思想是将有序数组分成两部分,取中间位置的值与目标值进行比较,如果相等则返回该位置,如果目标值小于中间值,则在左半部分继续查找,否则在右半部分继续查找,直到找到目标值或者数组被遍历完。

二分查找的时间复杂度为 O(log n),是一种高效的查找算法。但是它要求数组必须是有序的,因此在某些情况下,为了使用二分查找,需要先对数组进行排序。

二分查找的实现有两种方式:

  1. 递归实现

递归实现二分查找的核心思想是将数组不断地分成两半,直到找到目标值或者数组被遍历完。具体实现可以参考以下代码:

int binarySearchRecursive(int arr[], int left, int right, int target) {if (left > right) {return -1;  // 没有找到目标值,返回 -1}int mid = left + (right - left) / 2;  // 计算中间位置if (arr[mid] == target) {return mid;  // 找到目标值,返回位置} else if (arr[mid] > target) {return binarySearchRecursive(arr, left, mid - 1, target);  // 在左半部分继续查找} else {return binarySearchRecursive(arr, mid + 1, right, target);  // 在右半部分继续查找}
}
  1. 非递归实现

非递归实现二分查找的核心思想是使用循环不断地将数组分成两半,直到找到目标值或者数组被遍历完。具体实现可以参考以下代码:

int binarySearchIterative(int arr[], int left, int right, int target) {while (left <= right) {int mid = left + (right - left) / 2;  // 计算中间位置if (arr[mid] == target) {return mid;  // 找到目标值,返回位置} else if (arr[mid] > target) {right = mid - 1;  // 在左半部分继续查找} else {left = mid + 1;  // 在右半部分继续查找}}return -1;  // 没有找到目标值,返回 -1
}

需要注意的是,二分查找只适用于静态数组,即数组不会频繁地进行插入、删除等操作。如果需要频繁地进行这些操作,可以考虑使用其他数据结构,如平衡二叉树、哈希表等。

二、二分查找的性质

二分查找也称为折半查找,是一种在有序数组中查找特定元素的算法。它具有以下性质:

  1. 二分查找要求数组必须是有序的,如果数组无序,则需要先进行排序操作。

  2. 二分查找的时间复杂度为O(log n),其中n为数组的长度。这是一种非常高效的查找算法,适用于大型数据集。

  3. 二分查找只适用于静态数据集,即数据集不会频繁地插入、删除或修改。如果数据集经常变化,则需要使用其他算法。

  4. 二分查找是一种分治算法,它将问题分成两个子问题进行解决。每次比较都可以将搜索范围缩小一半,直到找到目标元素或搜索范围为空。

  5. 二分查找可以使用递归或迭代的方式实现。递归实现代码简单,但可能会导致栈溢出。迭代实现代码稍微复杂一些,但不会出现栈溢出的问题。

  6. 二分查找只能用于查找单个元素,无法用于查找多个元素。如果需要查找多个元素,可以使用二分查找的变体,如二分查找第一个出现的元素、二分查找最后一个出现的元素、二分查找第一个大于等于目标元素的元素、二分查找最后一个小于等于目标元素的元素等。

三、二分查找的变种

除了基本的二分查找外,还有以下几种常见的二分查找变种:

  1. 查找第一个值等于给定值的元素

在基本的二分查找中,当找到目标元素时就返回。但是,如果数组中存在多个值等于目标元素的元素,则基本的二分查找无法确定哪一个是第一个。因此,需要对基本的二分查找进行修改,使其能够查找第一个值等于给定值的元素。

具体实现方式如下:

  • 如果mid指向的元素等于目标元素,判断mid是否为第一个元素或者mid前一个元素不等于目标元素,如果是,则mid就是第一个值等于给定值的元素;否则,继续在左半部分查找。
  • 如果mid指向的元素大于目标元素,则在左半部分查找。
  • 如果mid指向的元素小于目标元素,则在右半部分查找。
  1. 查找最后一个值等于给定值的元素

与查找第一个值等于给定值的元素类似,查找最后一个值等于给定值的元素也需要对基本的二分查找进行修改。

具体实现方式如下:

  • 如果mid指向的元素等于目标元素,判断mid是否为最后一个元素或者mid后一个元素不等于目标元素,如果是,则mid就是最后一个值等于给定值的元素;否则,继续在右半部分查找。
  • 如果mid指向的元素大于目标元素,则在左半部分查找。
  • 如果mid指向的元素小于目标元素,则在右半部分查找。
  1. 查找第一个大于等于给定值的元素

查找第一个大于等于给定值的元素也需要对基本的二分查找进行修改。

具体实现方式如下:

  • 如果mid指向的元素大于等于目标元素,判断mid是否为第一个元素或者mid前一个元素小于目标元素,如果是,则mid就是第一个大于等于给定值的元素;否则,继续在左半部分查找。
  • 如果mid指向的元素小于目标元素,则在右半部分查找。
  1. 查找最后一个小于等于给定值的元素

查找最后一个小于等于给定值的元素也需要对基本的二分查找进行修改。

具体实现方式如下:

  • 如果mid指向的元素小于等于目标元素,判断mid是否为最后一个元素或者mid后一个元素大于目标元素,如果是,则mid就是最后一个小于等于给定值的元素;否则,继续在右半部分查找。
  • 如果mid指向的元素大于目标元素,则在左半部分查找。

四、二分查找的应用场景

二分查找的应用场景包括但不限于以下几个方面:

  1. 查找有序数组中的元素:二分查找是一种高效的查找算法,适用于有序数组中查找特定元素。例如,在一个数值递增的数组中查找某个数值是否存在。

  2. 查找最大值或最小值:如果一个数组是单调递增或递减的,可以使用二分查找来查找最大值或最小值。例如,在一个升序数组中查找最小值,或者在一个降序数组中查找最大值。

  3. 查找数据范围:如果一个数组中的元素满足某种特定的条件,可以使用二分查找来查找数据范围。例如,在一个有序数组中查找某个数值出现的次数,或者在一个升序数组中查找第一个大于等于某个值的元素。

  4. 查找旋转数组中的元素:如果一个数组是旋转有序的,可以使用二分查找来查找特定元素。例如,在一个旋转有序数组中查找某个数值是否存在。

  5. 查找数学函数的零点:如果一个数学函数是单调递增或递减的,可以使用二分查找来查找函数的零点。例如,在一个单调递增的函数中查找函数f(x)=0的解。

二分查找是一种高效的查找算法,适用于有序数组中查找特定元素或查找数据范围。它的时间复杂度为O(log n),适用于大型数据集。

五、二分查找在spring 中的应用

在Spring框架中,二分查找算法主要应用于Bean的查找和排序。Spring的Bean容器是一个包含多个Bean的容器,当需要获取某个Bean时,Spring框架会根据Bean的名称或类型进行查找。在查找时,Spring框架使用二分查找算法来提高查找效率。

Spring框架中的二分查找算法主要应用于以下两个方面:

  1. Bean的查找:Spring框架中的Bean容器是一个Map类型的容器,其中Bean的名称作为Map的Key,Bean实例作为Map的Value。当需要获取某个Bean时,Spring框架会根据Bean的名称或类型进行查找。在查找时,Spring框架使用二分查找算法来提高查找效率。

  2. Bean的排序:Spring框架中的Bean容器可以对Bean进行排序。在排序时,Spring框架使用二分查找算法来查找插入位置,从而提高排序效率。

Spring框架中的二分查找算法主要应用于Bean的查找和排序,可以提高查找和排序的效率。

相关文章:

Java 与查找算法(2)二分查找

一、二分查找 二分查找&#xff0c;也称折半查找&#xff0c;是一种常见的查找算法。它的思想是将有序数组分成两部分&#xff0c;取中间位置的值与目标值进行比较&#xff0c;如果相等则返回该位置&#xff0c;如果目标值小于中间值&#xff0c;则在左半部分继续查找&#xf…...

Java程序设计入门教程--原始类与包装类

包装类 Java语言是一个面向对象的语言&#xff0c;但是Java中的基本数据类型却是不面向对象的&#xff0c;这在实际使用时存在很多的不便。 为了解决这个不足&#xff0c;在设计类时为每个基本数据类型设计了一个对应的类进行代表&#xff0c;这样八个和基本数据类型对应的类统…...

pip安装python库速度慢、失败及超时报错解决办法

背景&#xff1a; 随着人工智能的不断兴起&#xff0c;python作为最接近人工智能的语言&#xff0c;变得越来越流行&#xff0c;人生苦短&#xff0c;python要学起来。之所以越来用的人喜欢学习python和研究Python&#xff0c;除了python本身便于学些、语法简短、面向对象等特点…...

向量数据库

向量数据库可以做哪些事情 存储和索引向量检索相似向量&#xff0c;还具有过滤功能自动将文档转变成向量&#xff0c;所以会自动化分词、向量化、索引等操作 目前存在的向量数据库&#xff1a; 名称github开源协议chromahttps://github.com/chroma-core/chromaApache 2.0Mil…...

leetcode 11.盛最多水的容器

题目描述 跳转到leetocde题目 给定一个长度为 n 的整数数组 height 。有 n 条垂线&#xff0c;第 i 条线的两个端点是 (i, 0) 和 (i, height[i]) 。 找出其中的两条线&#xff0c;使得它们与 x 轴共同构成的容器可以容纳最多的水。 返回容器可以储存的最大水量。 说明&#xff…...

都说00后已经躺平了,但是有一说一,该卷的还是卷啊。

这不&#xff0c;三月份春招我们公司来了个00后&#xff0c;工作没两年&#xff0c;跳槽到我们公司起薪20K&#xff0c;都快接近我了。 后来才知道人家是个卷王&#xff0c;从早干到晚就差搬张床到工位睡觉了。 最近和他聊了一次天&#xff0c;原来这位小老弟家里条件不太好&…...

牛客网刷题学习SQL(二)

SQL22 统计每个学校的答过题的用户的平均答题数 描述 运营想要了解每个学校答过题的用户平均答题数量情况&#xff0c;请你取出数据。 用户信息表 user_profile&#xff0c;其中device_id指终端编号&#xff08;认为每个用户有唯一的一个终端&#xff09;&#xff0c;gender指…...

深蓝学院 C++笔记 先导篇章 - 绪论

一、介绍-老师寄语 为什么选择C&#xff1f; 高性能解决问题 二、C推荐书目 1. 基础 《C Primer》&#xff0c;Stanley B. Lippman 等著&#xff0c;王刚、杨巨峰等译 2. 进阶 《Effective C》&#xff0c;Scott Meyers 著&#xff0c;侯捷译。 《More Effective C》&am…...

R7-19 天梯赛团队总分

“天梯赛”的竞赛题目一共有 15 道&#xff0c;分为 3 个梯级&#xff1a; 基础级设 8 道题&#xff0c;其中 5 分、10 分、15 分、20 分的题各 2 道&#xff0c;满分为 100 分&#xff1b;题目编号相应为L1-X&#xff0c;X取1,2,3,4,5,6,7,8&#xff0c;分别表示基础级的8道题…...

使用 Kotlin 的 Opt-in (选择加入)功能注解API提示当前非稳定API

前言 之前在给公司项目封装库的时候&#xff0c;领导告诉我封装的漂亮一点&#xff0c;等以后公司发展起来了可能需要把这个库提供给第三方接入使用。 此时&#xff0c;就有这么一个问题&#xff1a;某些功能函数使用条件比较苛刻&#xff0c;直接使用可能会出现意想不到的后…...

webpack配置排除打包

webpack配置排除打包 思路 打包时&#xff0c;不要把类似于element-ui第三方的这些包打进来 从网络上&#xff0c;通过url地址直接引入这些包 操作 &#xff08;1&#xff09;先找到 vue.config.js&#xff0c; 添加 externals 项&#xff0c;具体如下&#xff1a; config…...

HNU-操作系统OS-ucoreLab系列-感悟

谨以此片篇,献给熬夜的8个晚上,以及逝去的时光。 感悟: 今天结束了所有的Lab实验(2023.6.3),感慨万千。 喜是这个实验终于结束了,悲是其实有好多地方我都没有理解。 应该指出,由于验收的助教学长学姐们的宽容,HNU实际上在验收这一块的要求还是比较低的。 但是这个…...

MySQL运维篇(三)

五.读写分离 5.1 介绍 读写分离,简单地说是把对数据库的读和写操作分开,以对应不同的数据库服务器。主数据库提供写操作&#xff0c;从数据库提供读操作&#xff0c;这样能有效地减轻单台数据库的压力。 通过MyCat即可轻易实现上述功能&#xff0c;不仅可以支持MySQL&#x…...

Lecture 2 Text Preprocessing

目录 Some DefinitionsReasons for PreprocessingPreprocessing StepsSentence Segmentation 句子分割Binary Classifier 二元分类器Word Tokenization: English 英文词元标记化Word Tokenization: Chinese 中文词元标记化Word Tokenization: German 德语词元标记化Subword Tok…...

web练习第二周

前言&#xff1a;&#xff08;博主个人学习笔记&#xff0c;不用看&#xff09;web练习第二周&#xff0c;仅做出前3题。相比于第一周&#xff0c;难度大幅增加&#xff0c;写题时就算看了wp还是像个无头苍蝇一样到处乱创&#xff0c;大多都是陌生知识点&#xff0c;工具的使用…...

LC-1439. 有序矩阵中的第 k 个最小数组和(二分答案、多路归并)

1439. 有序矩阵中的第 k 个最小数组和 难度困难120 给你一个 m * n 的矩阵 mat&#xff0c;以及一个整数 k &#xff0c;矩阵中的每一行都以非递减的顺序排列。 你可以从每一行中选出 1 个元素形成一个数组。返回所有可能数组中的第 k 个 最小 数组和。 示例 1&#xff1a;…...

一文1000字从0到1实现Jenkins+Allure+Pytest的持续集成

一、配置 allure 环境变量 1、下载 allure是一个命令行工具&#xff0c;可以去 github 下载最新版&#xff1a;https://github.com/allure-framework/allure2/releases 2、解压到本地 3、配置环境变量 复制路径如&#xff1a;F:\allure-2.13.7\bin 环境变量、Path、添加 F:\…...

给一个有序数组生成平衡搜索二叉树(java)

给一个有序数组生成平衡搜索二叉树 给一个有序数组生成平衡搜索二叉树递归生成二叉树专题 给一个有序数组生成平衡搜索二叉树 给定一个有序的数组,用这个数组生成一个平衡搜索二叉树. 这个题还是很简单的,知道什么时平衡搜索二叉树就行了, 左边值小于头节点值,头节点值小于右边…...

【JavaSE】Java基础语法(二十二):包装类

文章目录 1. 基本类型包装类2. Integer类3. 自动拆箱和自动装箱4. int和String类型的相互转换 1. 基本类型包装类 基本类型包装类的作用 将基本数据类型封装成对象的好处在于可以在对象中定义更多的功能方法操作该数据常用的操作之一&#xff1a;用于基本数据类型与字符串之间的…...

javascript基础十八:说说你对JavaScript中事件循环的理解​

一、是什么 JavaScript 在设计之初便是单线程&#xff0c;即指程序运行时&#xff0c;只有一个线程存在&#xff0c;同一时间只能做一件事 为什么要这么设计&#xff0c;跟JavaScript的应用场景有关 JavaScript 初期作为一门浏览器脚本语言&#xff0c;通常用于操作 DOM &#…...

大数据学习栈记——Neo4j的安装与使用

本文介绍图数据库Neofj的安装与使用&#xff0c;操作系统&#xff1a;Ubuntu24.04&#xff0c;Neofj版本&#xff1a;2025.04.0。 Apt安装 Neofj可以进行官网安装&#xff1a;Neo4j Deployment Center - Graph Database & Analytics 我这里安装是添加软件源的方法 最新版…...

调用支付宝接口响应40004 SYSTEM_ERROR问题排查

在对接支付宝API的时候&#xff0c;遇到了一些问题&#xff0c;记录一下排查过程。 Body:{"datadigital_fincloud_generalsaas_face_certify_initialize_response":{"msg":"Business Failed","code":"40004","sub_msg…...

CVPR 2025 MIMO: 支持视觉指代和像素grounding 的医学视觉语言模型

CVPR 2025 | MIMO&#xff1a;支持视觉指代和像素对齐的医学视觉语言模型 论文信息 标题&#xff1a;MIMO: A medical vision language model with visual referring multimodal input and pixel grounding multimodal output作者&#xff1a;Yanyuan Chen, Dexuan Xu, Yu Hu…...

DeepSeek 赋能智慧能源:微电网优化调度的智能革新路径

目录 一、智慧能源微电网优化调度概述1.1 智慧能源微电网概念1.2 优化调度的重要性1.3 目前面临的挑战 二、DeepSeek 技术探秘2.1 DeepSeek 技术原理2.2 DeepSeek 独特优势2.3 DeepSeek 在 AI 领域地位 三、DeepSeek 在微电网优化调度中的应用剖析3.1 数据处理与分析3.2 预测与…...

mongodb源码分析session执行handleRequest命令find过程

mongo/transport/service_state_machine.cpp已经分析startSession创建ASIOSession过程&#xff0c;并且验证connection是否超过限制ASIOSession和connection是循环接受客户端命令&#xff0c;把数据流转换成Message&#xff0c;状态转变流程是&#xff1a;State::Created 》 St…...

ssc377d修改flash分区大小

1、flash的分区默认分配16M、 / # df -h Filesystem Size Used Available Use% Mounted on /dev/root 1.9M 1.9M 0 100% / /dev/mtdblock4 3.0M...

大数据零基础学习day1之环境准备和大数据初步理解

学习大数据会使用到多台Linux服务器。 一、环境准备 1、VMware 基于VMware构建Linux虚拟机 是大数据从业者或者IT从业者的必备技能之一也是成本低廉的方案 所以VMware虚拟机方案是必须要学习的。 &#xff08;1&#xff09;设置网关 打开VMware虚拟机&#xff0c;点击编辑…...

DIY|Mac 搭建 ESP-IDF 开发环境及编译小智 AI

前一阵子在百度 AI 开发者大会上&#xff0c;看到基于小智 AI DIY 玩具的演示&#xff0c;感觉有点意思&#xff0c;想着自己也来试试。 如果只是想烧录现成的固件&#xff0c;乐鑫官方除了提供了 Windows 版本的 Flash 下载工具 之外&#xff0c;还提供了基于网页版的 ESP LA…...

Python Ovito统计金刚石结构数量

大家好,我是小马老师。 本文介绍python ovito方法统计金刚石结构的方法。 Ovito Identify diamond structure命令可以识别和统计金刚石结构,但是无法直接输出结构的变化情况。 本文使用python调用ovito包的方法,可以持续统计各步的金刚石结构,具体代码如下: from ovito…...

CppCon 2015 学习:REFLECTION TECHNIQUES IN C++

关于 Reflection&#xff08;反射&#xff09; 这个概念&#xff0c;总结一下&#xff1a; Reflection&#xff08;反射&#xff09;是什么&#xff1f; 反射是对类型的自我检查能力&#xff08;Introspection&#xff09; 可以查看类的成员变量、成员函数等信息。反射允许枚…...