java算法篇之二分查找的公共函数

Arrays.binarySearch 方法的底层实现是使用经过优化的二分查找算法。以下是大致的二分查找算法实现步骤:

  1. 首先,确定搜索范围的起始索引 low 和结束索引 high,它们分别初始化为数组的起始位置和结束位置。
  2. 在每一轮循环中,计算中间元素的索引 mid,通过 (low + high) / 2 计算得到。如果目标元素等于中间元素,则返回中间元素的索引。
  3. 如果目标元素小于中间元素,则更新 high = mid - 1,即将搜索范围缩小到左半部分;如果目标元素大于中间元素,则更新 low = mid + 1,即将搜索范围缩小到右半部分。
  4. 不断重复步骤 2 和步骤 3,直到找到目标元素或者搜索范围为空(即 low > high),此时返回一个负数值,表示目标元素应该插入的位置的负数形式减一(即 -(low + 1))。

在实际实现中,Arrays.binarySearch 方法还会考虑一些边界情况,比如输入数组为空、目标元素小于数组第一个元素或大于数组最后一个元素等情况。此外,对于基本数据类型的数组和对象数组,其比较方式可能略有不同。

总体而言,Arrays.binarySearch 方法采用了高效的二分查找算法来在已排序的数组中搜索目标元素,以实现快速查找的目的。

函数的源码如下:

 /***      public static int binarySearch(int[] a, int key) {*         return binarySearch0(a, 0, a.length, key);*     }*      private static int binarySearch0(int[] a, int fromIndex, int toIndex,*                                      int key) {*         int low = fromIndex;*         int high = toIndex - 1;**         while (low <= high) {*             int mid = (low + high) >>> 1;*             int midVal = a[mid];**             if (midVal < key)*                 low = mid + 1;*             else if (midVal > key)*                 high = mid - 1;*             else*                 return mid; // key found*         }*         return -(low + 1);  // key not found.*     }*     */

会返回两种int属性的值,负数代表所查找的数组中没有目标数,并且该负数变成正数后,是该目标数应该插入数组的下标。另一种情况是返回目标数在数组的位置。

优缺点:

        优点:程序员可以直接使用该函数,并不需要再次手写。

        缺点:缺点非常明显,内存消耗会比较大。因为调用时需要将整个数组进行拷贝,如果数组很大,内存消耗很明显。

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

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

相关文章

node-mysql中占位符?的使用

要mysql执行的命令串如果是固定的&#xff0c;那么不需要使用占位符&#xff0c;如果其中的一些参数允许在执行前可自由设定&#xff0c;那么使用占位符就很必要&#xff0c;这样你可以不需要由自己来拼接出一个完整的执行串&#xff0c;只需要在执行串模板上将占位符的参数设置…

新型数据库技术一览

新型数据库技术是信息技术领域中不断发展和创新的一部分&#xff0c;它们旨在解决传统数据库系统面临的挑战&#xff0c;如大数据量的处理、实时分析、云服务集成、数据安全性和多模型支持等。以下是一些当前备受关注的新型数据库技术&#xff1a; NoSQL数据库&#xff1a; 非…

USB (2)

USB transaction 以2.0的枚举过程为例。 首先是TOKEN TRANSACTION&#xff0c;其次是DATA TRANSACTION&#xff0c;再次是Handshake Transaction。 上面的SETUP TRANSACTION是TOKEN TRANSACTION的一种。另外三种是OUT, IN, SOF。 在每个TRANSACTION中又包含了3个STAGE&#x…

在Windows中安装MinGW-w64

在Windows中安装MinGW-w64 总共两步&#xff1a; 下载mingw文件&#xff0c;官网较慢&#xff0c;有国内镜像解压下载的文件&#xff0c;放到想要安装的位置&#xff0c;然后在环境变量里面新建一个值&#xff0c;添加/bin目录 以前安装mingw是可以直接下载一个.exe安装文件…

如何在恢复出厂设置后从 Android 恢复照片

在某些情况下&#xff0c;您可能会考虑将 Android 设备恢复出厂设置。需要注意的是&#xff0c;恢复出厂设置后&#xff0c;所有设置、用户数据甚至应用程序数据都将被清除。因此&#xff0c;如果您将 Android 设备恢复出厂设置&#xff0c;甚至在里面留下了一些珍贵的照片&…

Debian13将正式切换到基于内存的临时文件系统

以前的内存很小&#xff0c;旅行者一号上的计算机内存只有68KB&#xff0c;现在的内存可以几十G&#xff0c;上百G足够把系统全部装载在内存里运行&#xff0c;获得优异的性能和极速响应体验。 很多小型系统能做到这一点&#xff0c;Linux没有那么激进&#xff0c;不过Debian …

java判断对象是否还在被引用

1、代码取消强引用后&#xff0c;gc回收对象 public static void main(String[] args) {Object obj new Object();WeakReference<Object> weakRef new WeakReference<>(obj);System.out.println(weakRef.get());obj null; // 取消强引用,后续gc会被回收,如果不…

1.基于-LABVIEW的自动售卖机开发(前面板)

1.项目简介 随着科技的进步和人们生活节奏的加快&#xff0c;自动售卖机在日常生活中扮演着越来越重要的角色。它们不仅提高了商品购买的便捷性&#xff0c;还节省了人力成本。为了实现更加智能化和高效的售卖服务&#xff0c;本项目旨在开发一款基于LabVIEW平台的自动售卖机系…

SpringBoot+Vue免税商品优选购物商城(前后端分离)

技术栈 JavaSpringBootMavenMySQLMyBatisVueShiroElement-UI 角色对应功能 用户商家 功能截图

Mysql学习(六)——函数

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 三、函数3.1 字符串函数3.2 数值函数3.3 日期函数3.4 流程函数 三、函数 函数是指一段可以直接被另一段程序调用的程序或代码。 3.1 字符串函数 MySQL中内置了很…

论文浅尝 | THINK-ON-GRAPH:基于知识图谱的深层次且可靠的大语言模型推理方法...

笔记整理&#xff1a;刘佳俊&#xff0c;东南大学硕士&#xff0c;研究方向为知识图谱 链接&#xff1a;https://arxiv.org/pdf/2307.07697.pdf 1. 动机 本文是IDEA研究院的工作&#xff0c;这篇工作将知识图谱的和大语言模型推理进行了结合&#xff0c;在每一步图推理中利用大…

Y2期末测试

目录 总结&#xff1a;题目1.划分区间2.序列操作题目描述&#xff1a;题解&#xff1a;代码&#xff1a; 3.划分区间题目描述&#xff1a;题解&#xff1a;代码&#xff1a; 4.数字匹配题目描述&#xff1a;题解&#xff1a;代码&#xff1a; 总结&#xff1a; 本次模拟未达到…

[图解]建模相关的基础知识-06

1 00:00:00,790 --> 00:00:03,480 下一个概念&#xff0c;就是基数的概念 2 00:00:04,390 --> 00:00:11,560 cardinality&#xff0c;表示有限集合中元素的数量 3 00:00:12,200 --> 00:00:14,790 我们可以用一个井号 4 00:00:14,800 --> 00:00:18,320 在前面表示…

数据结构--递归和数组

个人介绍 hello hello~ &#xff0c;这里是 code袁~&#x1f496;&#x1f496; &#xff0c;欢迎大家点赞&#x1f973;&#x1f973;关注&#x1f4a5;&#x1f4a5;收藏&#x1f339;&#x1f339;&#x1f339; &#x1f981;作者简介&#xff1a;一名喜欢分享和记录学习的…

10.邮票问题

上海市计算机学会竞赛平台 | YACSYACS 是由上海市计算机学会于2019年发起的活动,旨在激发青少年对学习人工智能与算法设计的热情与兴趣,提升青少年科学素养,引导青少年投身创新发现和科研实践活动。https://www.iai.sh.cn/problem/625 题目描述 有四种面值的邮票,分别是 …

使用 Django 创建 App

文章目录 步骤 1&#xff1a;创建 Django 项目步骤 2&#xff1a;创建 App步骤 3&#xff1a;配置 App步骤 4&#xff1a;编写代码步骤 5&#xff1a;运行服务器 在 Django 中&#xff0c;App 是组织代码的基本单元&#xff0c;它可以包含模型、视图、模板等组件&#xff0c;帮…

树1----7-3 列出叶结点

对于给定的二叉树&#xff0c;本题要求你按从上到下、从左到右的顺序输出其所有叶结点。 输入格式&#xff1a; 首先第一行给出一个正整数 n&#xff08;≤10&#xff09;&#xff0c;为树中结点总数。树中的结点从 0 到 n−1 编号。随后 n 行&#xff0c;每行给出一个对应结…

Web前端编程网站:探索编程世界的新窗口

Web前端编程网站&#xff1a;探索编程世界的新窗口 在数字化时代的浪潮中&#xff0c;Web前端编程网站如雨后春笋般涌现&#xff0c;为编程爱好者们打开了一扇探索编程世界的新窗口。这些网站不仅提供了丰富的学习资源&#xff0c;还搭建了一个交流与分享的平台&#xff0c;让…

git版本控制工具常用命令

一、本地仓库管理 push 向远程推送代码 pulll 拉取代码 二、远程仓库管理 三、分支操作 本地主分支master 远程主分支main head指向当前分支 查看&#xff1a;git branch 创建分支: git branch 名字 切换分支&#xff1a;git checkout 名字 合并分支&#xff1a;git…

FPGA SPI采集ADC7606数据

一,SPI总线的构成及信号类型 SPI总线只需四条线(如图1所示)就可以完成MCU与各种外围器件的通讯: 1)MOSI – Master数据输出,Slave数据输入 2)MISO – Master数据输入,Slave数据输出 3)SCK – 时钟信号,由Master产生 4)/CS – Slave使能信号,由Master控制。 在一个SPI时…