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 &#…...
Lindy自动化不是IT部门的事!CIO亲述:如何用“业务-技术-合规”三权制衡模型锁定首期300万降本收益
更多请点击: https://intelliparadigm.com 第一章:Lindy自动化不是IT部门的事!CIO亲述:如何用“业务-技术-合规”三权制衡模型锁定首期300万降本收益 Lindy自动化(Lindy Effect-driven Automation)的本质&…...
CANN-ops-nn-昇腾NPU神经网络算子的积木盒子
你去超市买过那种混合装坚果吗?一袋里面核桃、腰果、巴旦木都有,打开直接吃,不用自己搭配。ops-nn 在昇腾CANN生态里就是这个角色——把神经网络最常用的算子打包好了,打开就能用。昇腾NPU跑大模型、跑视觉模型,底层都…...
SQL 数据库从免费到付费选型实战:支撑真实规模产品的能力分析与选择指南
引言:为什么 SQL 数据库选型如此重要? 在当今数据驱动的时代,数据库是任何数字产品的核心基础设施。无论是初创公司的 MVP(最小可行产品),还是日活百万的成熟应用,数据库的选择直接影响着产品的性能、成本、可扩展性和开发效率。 对于技术决策者而言,面对琳琅满目的 …...
CVE-2021-4034深度解析:pkexec权限绕过与Linux提权原理
1. 这个漏洞不是“又一个提权”,而是Linux权限模型的照妖镜你可能已经看过几十篇讲CVE-2021-4034的文章,标题都带着“高危”“远程”“一键提权”这类字眼。但实话讲,我第一次在客户环境里复现它时,手是抖的——不是因为怕搞崩系统…...
从脚本到智能体:自动化体系如何被 Agent 重新定义
从脚本到智能体:自动化体系如何被 Agent 重新定义 关键词:智能体Agent、自动化脚本、LLM原生应用、自主决策系统、RAG检索增强生成、工具调用、自动化体系演进 摘要:本文从所有开发者都熟悉的传统自动化脚本痛点切入,用奶茶店员工到金牌店长的生活化类比,一步步拆解自动化…...
5分钟掌握NoFences:告别杂乱桌面的免费桌面整理终极指南
5分钟掌握NoFences:告别杂乱桌面的免费桌面整理终极指南 【免费下载链接】NoFences 🚧 Open Source Stardock Fences alternative 项目地址: https://gitcode.com/gh_mirrors/no/NoFences 你是否每天都要面对一个布满杂乱图标的Windows桌面&#…...
Python自动化办公:批量处理Word文档的实用技巧
Python自动化办公:批量处理Word文档的实用技巧 在日常办公中,处理大量Word文档是常见任务,比如批量修改格式、提取内容或生成报告。手动操作不仅耗时,还容易出错。本文将介绍如何使用Python自动化处理Word文档,通过代码…...
告别PyTorch依赖:手把手教你用C++ CUDA实现LeNet推理,从Python模型导出到C++部署全流程
从PyTorch到C CUDA:工业级LeNet模型部署全流程实战 在深度学习模型开发中,Python生态提供了丰富的训练工具,但生产环境往往需要高性能的C实现。本文将完整演示如何将PyTorch训练的LeNet模型部署到C CUDA环境,涵盖模型导出、内存管…...
FactoryBluePrints终极指南:戴森球计划蓝图库助你轻松建造完美工厂
FactoryBluePrints终极指南:戴森球计划蓝图库助你轻松建造完美工厂 【免费下载链接】FactoryBluePrints 游戏戴森球计划的**工厂**蓝图仓库 项目地址: https://gitcode.com/GitHub_Trending/fa/FactoryBluePrints 你是否曾在戴森球计划中为复杂的工厂布局而头…...
如何快速入门Play框架:5分钟搭建你的第一个Java Web应用
如何快速入门Play框架:5分钟搭建你的第一个Java Web应用 【免费下载链接】play1 Play framework 项目地址: https://gitcode.com/gh_mirrors/pl/play1 Play框架是一个轻量级的Java Web开发框架,它采用了MVC架构模式,提供了快速开发、热…...
