Java 与查找算法(2)二分查找
一、二分查找
二分查找,也称折半查找,是一种常见的查找算法。它的思想是将有序数组分成两部分,取中间位置的值与目标值进行比较,如果相等则返回该位置,如果目标值小于中间值,则在左半部分继续查找,否则在右半部分继续查找,直到找到目标值或者数组被遍历完。
二分查找的时间复杂度为 O(log n),是一种高效的查找算法。但是它要求数组必须是有序的,因此在某些情况下,为了使用二分查找,需要先对数组进行排序。
二分查找的实现有两种方式:
- 递归实现
递归实现二分查找的核心思想是将数组不断地分成两半,直到找到目标值或者数组被遍历完。具体实现可以参考以下代码:
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); // 在右半部分继续查找}
}
- 非递归实现
非递归实现二分查找的核心思想是使用循环不断地将数组分成两半,直到找到目标值或者数组被遍历完。具体实现可以参考以下代码:
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
}
需要注意的是,二分查找只适用于静态数组,即数组不会频繁地进行插入、删除等操作。如果需要频繁地进行这些操作,可以考虑使用其他数据结构,如平衡二叉树、哈希表等。
二、二分查找的性质
二分查找也称为折半查找,是一种在有序数组中查找特定元素的算法。它具有以下性质:
-
二分查找要求数组必须是有序的,如果数组无序,则需要先进行排序操作。
-
二分查找的时间复杂度为O(log n),其中n为数组的长度。这是一种非常高效的查找算法,适用于大型数据集。
-
二分查找只适用于静态数据集,即数据集不会频繁地插入、删除或修改。如果数据集经常变化,则需要使用其他算法。
-
二分查找是一种分治算法,它将问题分成两个子问题进行解决。每次比较都可以将搜索范围缩小一半,直到找到目标元素或搜索范围为空。
-
二分查找可以使用递归或迭代的方式实现。递归实现代码简单,但可能会导致栈溢出。迭代实现代码稍微复杂一些,但不会出现栈溢出的问题。
-
二分查找只能用于查找单个元素,无法用于查找多个元素。如果需要查找多个元素,可以使用二分查找的变体,如二分查找第一个出现的元素、二分查找最后一个出现的元素、二分查找第一个大于等于目标元素的元素、二分查找最后一个小于等于目标元素的元素等。
三、二分查找的变种
除了基本的二分查找外,还有以下几种常见的二分查找变种:
- 查找第一个值等于给定值的元素
在基本的二分查找中,当找到目标元素时就返回。但是,如果数组中存在多个值等于目标元素的元素,则基本的二分查找无法确定哪一个是第一个。因此,需要对基本的二分查找进行修改,使其能够查找第一个值等于给定值的元素。
具体实现方式如下:
- 如果mid指向的元素等于目标元素,判断mid是否为第一个元素或者mid前一个元素不等于目标元素,如果是,则mid就是第一个值等于给定值的元素;否则,继续在左半部分查找。
- 如果mid指向的元素大于目标元素,则在左半部分查找。
- 如果mid指向的元素小于目标元素,则在右半部分查找。
- 查找最后一个值等于给定值的元素
与查找第一个值等于给定值的元素类似,查找最后一个值等于给定值的元素也需要对基本的二分查找进行修改。
具体实现方式如下:
- 如果mid指向的元素等于目标元素,判断mid是否为最后一个元素或者mid后一个元素不等于目标元素,如果是,则mid就是最后一个值等于给定值的元素;否则,继续在右半部分查找。
- 如果mid指向的元素大于目标元素,则在左半部分查找。
- 如果mid指向的元素小于目标元素,则在右半部分查找。
- 查找第一个大于等于给定值的元素
查找第一个大于等于给定值的元素也需要对基本的二分查找进行修改。
具体实现方式如下:
- 如果mid指向的元素大于等于目标元素,判断mid是否为第一个元素或者mid前一个元素小于目标元素,如果是,则mid就是第一个大于等于给定值的元素;否则,继续在左半部分查找。
- 如果mid指向的元素小于目标元素,则在右半部分查找。
- 查找最后一个小于等于给定值的元素
查找最后一个小于等于给定值的元素也需要对基本的二分查找进行修改。
具体实现方式如下:
- 如果mid指向的元素小于等于目标元素,判断mid是否为最后一个元素或者mid后一个元素大于目标元素,如果是,则mid就是最后一个小于等于给定值的元素;否则,继续在右半部分查找。
- 如果mid指向的元素大于目标元素,则在左半部分查找。
四、二分查找的应用场景
二分查找的应用场景包括但不限于以下几个方面:
-
查找有序数组中的元素:二分查找是一种高效的查找算法,适用于有序数组中查找特定元素。例如,在一个数值递增的数组中查找某个数值是否存在。
-
查找最大值或最小值:如果一个数组是单调递增或递减的,可以使用二分查找来查找最大值或最小值。例如,在一个升序数组中查找最小值,或者在一个降序数组中查找最大值。
-
查找数据范围:如果一个数组中的元素满足某种特定的条件,可以使用二分查找来查找数据范围。例如,在一个有序数组中查找某个数值出现的次数,或者在一个升序数组中查找第一个大于等于某个值的元素。
-
查找旋转数组中的元素:如果一个数组是旋转有序的,可以使用二分查找来查找特定元素。例如,在一个旋转有序数组中查找某个数值是否存在。
-
查找数学函数的零点:如果一个数学函数是单调递增或递减的,可以使用二分查找来查找函数的零点。例如,在一个单调递增的函数中查找函数f(x)=0的解。
二分查找是一种高效的查找算法,适用于有序数组中查找特定元素或查找数据范围。它的时间复杂度为O(log n),适用于大型数据集。
五、二分查找在spring 中的应用
在Spring框架中,二分查找算法主要应用于Bean的查找和排序。Spring的Bean容器是一个包含多个Bean的容器,当需要获取某个Bean时,Spring框架会根据Bean的名称或类型进行查找。在查找时,Spring框架使用二分查找算法来提高查找效率。
Spring框架中的二分查找算法主要应用于以下两个方面:
-
Bean的查找:Spring框架中的Bean容器是一个Map类型的容器,其中Bean的名称作为Map的Key,Bean实例作为Map的Value。当需要获取某个Bean时,Spring框架会根据Bean的名称或类型进行查找。在查找时,Spring框架使用二分查找算法来提高查找效率。
-
Bean的排序:Spring框架中的Bean容器可以对Bean进行排序。在排序时,Spring框架使用二分查找算法来查找插入位置,从而提高排序效率。
Spring框架中的二分查找算法主要应用于Bean的查找和排序,可以提高查找和排序的效率。
相关文章:
Java 与查找算法(2)二分查找
一、二分查找 二分查找,也称折半查找,是一种常见的查找算法。它的思想是将有序数组分成两部分,取中间位置的值与目标值进行比较,如果相等则返回该位置,如果目标值小于中间值,则在左半部分继续查找…...
Java程序设计入门教程--原始类与包装类
包装类 Java语言是一个面向对象的语言,但是Java中的基本数据类型却是不面向对象的,这在实际使用时存在很多的不便。 为了解决这个不足,在设计类时为每个基本数据类型设计了一个对应的类进行代表,这样八个和基本数据类型对应的类统…...

pip安装python库速度慢、失败及超时报错解决办法
背景: 随着人工智能的不断兴起,python作为最接近人工智能的语言,变得越来越流行,人生苦短,python要学起来。之所以越来用的人喜欢学习python和研究Python,除了python本身便于学些、语法简短、面向对象等特点…...
向量数据库
向量数据库可以做哪些事情 存储和索引向量检索相似向量,还具有过滤功能自动将文档转变成向量,所以会自动化分词、向量化、索引等操作 目前存在的向量数据库: 名称github开源协议chromahttps://github.com/chroma-core/chromaApache 2.0Mil…...

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

都说00后已经躺平了,但是有一说一,该卷的还是卷啊。
这不,三月份春招我们公司来了个00后,工作没两年,跳槽到我们公司起薪20K,都快接近我了。 后来才知道人家是个卷王,从早干到晚就差搬张床到工位睡觉了。 最近和他聊了一次天,原来这位小老弟家里条件不太好&…...
牛客网刷题学习SQL(二)
SQL22 统计每个学校的答过题的用户的平均答题数 描述 运营想要了解每个学校答过题的用户平均答题数量情况,请你取出数据。 用户信息表 user_profile,其中device_id指终端编号(认为每个用户有唯一的一个终端),gender指…...
深蓝学院 C++笔记 先导篇章 - 绪论
一、介绍-老师寄语 为什么选择C? 高性能解决问题 二、C推荐书目 1. 基础 《C Primer》,Stanley B. Lippman 等著,王刚、杨巨峰等译 2. 进阶 《Effective C》,Scott Meyers 著,侯捷译。 《More Effective C》&am…...
R7-19 天梯赛团队总分
“天梯赛”的竞赛题目一共有 15 道,分为 3 个梯级: 基础级设 8 道题,其中 5 分、10 分、15 分、20 分的题各 2 道,满分为 100 分;题目编号相应为L1-X,X取1,2,3,4,5,6,7,8,分别表示基础级的8道题…...

使用 Kotlin 的 Opt-in (选择加入)功能注解API提示当前非稳定API
前言 之前在给公司项目封装库的时候,领导告诉我封装的漂亮一点,等以后公司发展起来了可能需要把这个库提供给第三方接入使用。 此时,就有这么一个问题:某些功能函数使用条件比较苛刻,直接使用可能会出现意想不到的后…...

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

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

MySQL运维篇(三)
五.读写分离 5.1 介绍 读写分离,简单地说是把对数据库的读和写操作分开,以对应不同的数据库服务器。主数据库提供写操作,从数据库提供读操作,这样能有效地减轻单台数据库的压力。 通过MyCat即可轻易实现上述功能,不仅可以支持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练习第二周
前言:(博主个人学习笔记,不用看)web练习第二周,仅做出前3题。相比于第一周,难度大幅增加,写题时就算看了wp还是像个无头苍蝇一样到处乱创,大多都是陌生知识点,工具的使用…...
LC-1439. 有序矩阵中的第 k 个最小数组和(二分答案、多路归并)
1439. 有序矩阵中的第 k 个最小数组和 难度困难120 给你一个 m * n 的矩阵 mat,以及一个整数 k ,矩阵中的每一行都以非递减的顺序排列。 你可以从每一行中选出 1 个元素形成一个数组。返回所有可能数组中的第 k 个 最小 数组和。 示例 1:…...

一文1000字从0到1实现Jenkins+Allure+Pytest的持续集成
一、配置 allure 环境变量 1、下载 allure是一个命令行工具,可以去 github 下载最新版:https://github.com/allure-framework/allure2/releases 2、解压到本地 3、配置环境变量 复制路径如:F:\allure-2.13.7\bin 环境变量、Path、添加 F:\…...
给一个有序数组生成平衡搜索二叉树(java)
给一个有序数组生成平衡搜索二叉树 给一个有序数组生成平衡搜索二叉树递归生成二叉树专题 给一个有序数组生成平衡搜索二叉树 给定一个有序的数组,用这个数组生成一个平衡搜索二叉树. 这个题还是很简单的,知道什么时平衡搜索二叉树就行了, 左边值小于头节点值,头节点值小于右边…...

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

javascript基础十八:说说你对JavaScript中事件循环的理解
一、是什么 JavaScript 在设计之初便是单线程,即指程序运行时,只有一个线程存在,同一时间只能做一件事 为什么要这么设计,跟JavaScript的应用场景有关 JavaScript 初期作为一门浏览器脚本语言,通常用于操作 DOM &#…...
java调用dll出现unsatisfiedLinkError以及JNA和JNI的区别
UnsatisfiedLinkError 在对接硬件设备中,我们会遇到使用 java 调用 dll文件 的情况,此时大概率出现UnsatisfiedLinkError链接错误,原因可能有如下几种 类名错误包名错误方法名参数错误使用 JNI 协议调用,结果 dll 未实现 JNI 协…...
linux 下常用变更-8
1、删除普通用户 查询用户初始UID和GIDls -l /home/ ###家目录中查看UID cat /etc/group ###此文件查看GID删除用户1.编辑文件 /etc/passwd 找到对应的行,YW343:x:0:0::/home/YW343:/bin/bash 2.将标红的位置修改为用户对应初始UID和GID: YW3…...

DBAPI如何优雅的获取单条数据
API如何优雅的获取单条数据 案例一 对于查询类API,查询的是单条数据,比如根据主键ID查询用户信息,sql如下: select id, name, age from user where id #{id}API默认返回的数据格式是多条的,如下: {&qu…...
鱼香ros docker配置镜像报错:https://registry-1.docker.io/v2/
使用鱼香ros一件安装docker时的https://registry-1.docker.io/v2/问题 一键安装指令 wget http://fishros.com/install -O fishros && . fishros出现问题:docker pull 失败 网络不同,需要使用镜像源 按照如下步骤操作 sudo vi /etc/docker/dae…...

html-<abbr> 缩写或首字母缩略词
定义与作用 <abbr> 标签用于表示缩写或首字母缩略词,它可以帮助用户更好地理解缩写的含义,尤其是对于那些不熟悉该缩写的用户。 title 属性的内容提供了缩写的详细说明。当用户将鼠标悬停在缩写上时,会显示一个提示框。 示例&#x…...

NXP S32K146 T-Box 携手 SD NAND(贴片式TF卡):驱动汽车智能革新的黄金组合
在汽车智能化的汹涌浪潮中,车辆不再仅仅是传统的交通工具,而是逐步演变为高度智能的移动终端。这一转变的核心支撑,来自于车内关键技术的深度融合与协同创新。车载远程信息处理盒(T-Box)方案:NXP S32K146 与…...
动态 Web 开发技术入门篇
一、HTTP 协议核心 1.1 HTTP 基础 协议全称 :HyperText Transfer Protocol(超文本传输协议) 默认端口 :HTTP 使用 80 端口,HTTPS 使用 443 端口。 请求方法 : GET :用于获取资源,…...
省略号和可变参数模板
本文主要介绍如何展开可变参数的参数包 1.C语言的va_list展开可变参数 #include <iostream> #include <cstdarg>void printNumbers(int count, ...) {// 声明va_list类型的变量va_list args;// 使用va_start将可变参数写入变量argsva_start(args, count);for (in…...
Docker拉取MySQL后数据库连接失败的解决方案
在使用Docker部署MySQL时,拉取并启动容器后,有时可能会遇到数据库连接失败的问题。这种问题可能由多种原因导致,包括配置错误、网络设置问题、权限问题等。本文将分析可能的原因,并提供解决方案。 一、确认MySQL容器的运行状态 …...
vue3 daterange正则踩坑
<el-form-item label"空置时间" prop"vacantTime"> <el-date-picker v-model"form.vacantTime" type"daterange" start-placeholder"开始日期" end-placeholder"结束日期" clearable :editable"fal…...