java实现算法

news2024/9/23 4:38:16

一、二分法

二分法查找主要是为了快速查找给定数组内,期待值在数组中的位置(下标)

二分法查找通过对整个数组取中间值,判断期待值所在的范围并缩小范围,每次查找范围折半,直到范围的边界重合,得出期待值的位置,如果找不到返回-1

二分法有一个先决条件是:数组内元素必须是有序的

给定一个包含1,3,5,7,8,9这一个元素的有序数组,求得期待值7所在的位置,下边用绿块表示指针所在位置

若是按照直接遍历的方式,绿块会从数组的第一个下标开始比较,直到7所在的下标得到结果,遍历需要4次,下边演示下二分法的图示

第一次,取值范围为整个数组,取数组长度中间值(0+5)/2取整2作为下标

取中间值初始以数组的第一个下标与最后一个下标相加取中间值,如果不为整,舍去小数部分

比较期待值与下标为2的值大小,发现5<7,7这个值应在中间值的右侧

缩小查找范围为中间值+1与最大下标

第二次,范围缩小为原数组的一半,下标不变,取中间值(3+5)/2=4

下标4对应的值8,大于7,所以向左取范围最小下标3,最大下标4-1=3

第三次,取中间值(3+3)/2=3,下标3上的值恰好与期待值相等,返回下标3

虽然看起来只少了一次,原因在数组的长度小,另外就是期待值设置的小,

再举个长一点的例子,这里有1-100的数组,100个元素,期待值为100

简单遍历次数最大为元素的个数n次,本例中100次

使用二分查找只需要log2n次,本例中7次!

 代码实现

package binarysearch;
 
/**
 * 二分查找:求得期待值在有序数组中的位置
 * @author hellxz
 */
public class MyBinarySearch {
 
	/**
	 * 二分查找算法实现
	 * @param orderedArray 有序数组
	 * @param expect 期待数值
	 * @return 期待值在数组中的下标,如果期待数值不在数组中,返回-1
	 */
	public static Integer binarySearch(int[] orderedArray, int expect) {
        if(orderedArray.length==0){
            return -1;
        }   
		//low与high构成动态的数组下标范围
		//初始low下标为0,high为数组长度-1
		int low = 0;
		int high = orderedArray.length - 1;
 
		//当数组范围存在时,有两种情况:最小边界值小于最大边界值 或 两个边界值相等;
		//最小边界值不大于最大边界值是有意义的,表示范围的存在,如果范围不存在了,说明数组中无此元素
		while (low <= high) {
			//取两个边界下标的中间下标与中间值,作为下标时会自动取整
			int middle = (low + high) / 2;
			int middleVal = orderedArray[middle];
			//中间值与期待值相等,说明中间值的下标就是我们要找的期待数的下标
			if (middleVal == expect) {
				return middle;
			}
			//中间值小于期待值,我们需要将最小边界下标移到中间下标的下一位
			//此时,最大边界不变,最小边界变大,范围缩小原来一半
			if (middleVal < expect) {
				low = middle + 1;
			}
			//中间值大于期待值,说明最大边界应小于中间下标
			if (middleVal > expect) {
				high = middle - 1;
			}
		}
 
		//循环结束未返回下标说明数组中不存在期待元素,返回-1
		return -1;
	}
 
	public static void main(String[] args) {
		int[] arr = { 2, 4, 5, 6, 10, 18, 19,22, 25, 70};
		int expectVal = 25;
		System.out.printf("当前期待的值为%d,其所在的下标为%d", expectVal, binarySearch(arr, expectVal));
	}
}

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

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

相关文章

终端命令提示符:如何查看我们电脑端口是否被占用和处理方式

文章目录 端口信息查看1、Windows:2、Linux/macOS: 使用 netstat使用 lsof 端口信息查看 在不同的操作系统中&#xff0c;查看端口是否被占用的指令有所不同。以下是一些常见的指令&#xff1a; 1、Windows: 使用命令行工具 netstat 来查看端口占用情况。 电脑键盘按住 win…

第九个知识点:内部对象

Date对象: <script>var date new Date();date.getFullYear();//年date.getMonth();//月date.getDate();//日date.getDay();//星期几date.getHours();//时date.getMinutes();//分date.getSeconds();//秒date.getTime();//获取时间戳&#xff0c;时间戳时全球统一&#x…

[计算机提升] 备份系统:系统映像

6.3 备份系统&#xff1a;系统映像 备份系统和还原系统是一套互补的操作。 操作系统的备份就是将操作系统当前的所有数据复制到硬盘的一个空闲区域&#xff0c;以防止系统崩溃或数据丢失。还原操作则是将先前备份的数据恢复到操作系统中&#xff0c;使系统回到之前的样子&…

Python进程之串行与并行

串行和并行 串行指的是任务的执行方式。串行在执行多个任务时&#xff0c;各个任务按顺序执行&#xff0c;完成一个之后才能进行下一个。&#xff08;早期单核CPU的情况下&#xff09; 并行指的是多个任务在同一时刻可以同时执行&#xff08;前提是多核CPU&#xff09;&#…

蓝桥杯备赛Day9——链表进阶

给你一个链表,删除链表的倒数第 n 个结点,并且返回链表的头结点。 示例 1: 输入:head = [1,2,3,4,5], n = 2 输出:[1,2,3,5]示例 2: 输入:head = [1], n = 1 输出:[]示例 3: 输入:head = [1,2], n = 1 输出:[1]提示: 链表中结点的数目为 sz1 <= sz <= 300 &l…

2024-02-07(Sqoop,Flume)

1.Sqoop的增量导入 实际工作中&#xff0c;数据的导入很多时候只需要导入增量的数据&#xff0c;并不需要将表中的数据每次都全部导入到hive或者hdfs中&#xff0c;因为这样会造成数据重复问题。 增量导入就是仅导入新添加到表中的行的技术。 sqoop支持两种模式的增量导入&a…

sqli.labs靶场(41-53关)

41、第四十一关 -1 union select 1,2,3-- -1 union select 1,database(),(select group_concat(table_name) from information_schema.tables where table_schemadatabase()) -- -1 union select 1,2,(select group_concat(column_name) from information_schema.columns wher…

2024年【天津市安全员B证】模拟试题及天津市安全员B证模拟考试题库

题库来源&#xff1a;安全生产模拟考试一点通公众号小程序 天津市安全员B证模拟试题是安全生产模拟考试一点通生成的&#xff0c;天津市安全员B证证模拟考试题库是根据天津市安全员B证最新版教材汇编出天津市安全员B证仿真模拟考试。2024年【天津市安全员B证】模拟试题及天津市…

零基础学Python之Unitest模块

1.unittest简介及入门案例 &#xff08;1&#xff09;什么是Unitest Unittest是Python自带的单元测试框架&#xff0c;不仅适用于单元测试&#xff0c;还可用于Web、Appium、接口自动化测试用例的开发与执行。该测试框架可组织执行测试用例&#xff0c;并且提供丰富的断言方法…

如何使用CLZero对HTTP1.1的请求走私攻击向量进行模糊测试

关于CLZero CLZero是一款功能强大的模糊测试工具&#xff0c;该工具可以帮助广大研究人员针对HTTP/1.1 CL.0的请求走私攻击向量进行模糊测试。 工具结构 clzero.py - 工具主脚本&#xff1b; default.py - 包含了大多数标准攻击测试方法和字符&#xff1b; exhaustive.py - 包…

Git介绍和常用命令说明

目录 一、Git概述 1.1 Git是什么 1.2 Git有什么用 1.3 Git仓库介绍 二、Git下载与安装 三、Git代码托管服务&#xff08;远程仓库&#xff09; 四、Git常用命令 4.1 设置用户信息 4.2 获取Git仓库 4.2.1 本地初始化Git仓库 4.2.2 从远程仓库克隆 4.3 本地仓库操作 …

navigator.mediaDevices.getUserMedia获取本地音频/麦克权限并提示用户

navigator.mediaDevices.getUserMedia获取本地音频/麦克权限并提示用户 效果获取权限NotFoundErrorNotAllowedError 代码 效果 获取权限 NotFoundError NotAllowedError 代码 // 调用 captureLocalMedia()// 方法 function captureLocalMedia() {console.warn(Requesting lo…

Mac 下JDK环境变量配置 及 JDK多版本切换

一、推荐官网下载&#xff1a; 二、环境变量配置 1、查看JDK地址&#xff0c;在终端输入以下命令&#xff1a; /usr/libexec/java_home -V 我的路径&#xff1a; /Library/Java/JavaVirtualMachines/jdk-17.jdk/Contents/Home /Library/Java/JavaVirtualMachines/zulu-11.j…

MGIE官网体验入口 苹果多模态大语言模型AI图像编辑工具在线使用地址

MGIE是一项由苹果开源的技术&#xff0c;利用多模态大型语言模型&#xff08;MLLMs&#xff09;生成图像编辑指令&#xff0c;通过端到端训练&#xff0c;捕捉视觉想象力并执行图像处理操作&#xff0c;使图像编辑更加智能、直观。 MGIE官网体验入口https://github.com/apple/M…

Python进行AI声音克隆的端到端指南

人工智能语音克隆是一种捕捉声音的独特特征&#xff0c;然后准确性复制它的技术。这种技术不仅可以让我们复制现有的声音&#xff0c;还可以创造全新的声音。它是一种彻底改变内容创作的工具&#xff0c;从个性化歌曲到自定义画外音&#xff0c;开辟了一个超越语言和文化障碍的…

异常统一处理:MissingServletRequestParameterException(遗漏Servlet请求参数异常)

一、引言 本篇内容是“异常统一处理”系列文章的重要组成部分&#xff0c;主要聚焦于对 MissingServletRequestParameterException 的原理解析与异常处理机制&#xff0c;并给出测试案例。 关于 全局异常统一处理 的原理和完整实现逻辑&#xff0c;请参考文章&#xff1a; 《S…

Linux基础I/O(中)——重定向

重定向 根据上一篇的文章我们知道&#xff0c;文件描述符是什么。 0->stdin; 1->stdout; 2->stderr; 如果我们新打开一个文件的话&#xff0c;该文件描述符为3&#xff0c;如下图&#xff1a; &#xff1a;&#xff1a;“ 如果我先close(1),再打开一个文件,根据之前的…

for循环的多重跳出

for的多重跳出 1.前言2.标签使用3.使用异常的方式 本文在jdk17中测试通过 1.前言 前段时间面试时&#xff0c;面试官问我多重for循环如何跳出&#xff0c;我懵了&#xff0c;今天特别的研究了一下 本文主要说的不是continue与break&#xff0c;而是少用的另类操作 1.continue:…

三维可视化助力船舶制造:大数据处理、实时协作更高效!

随着科技的不断发展&#xff0c;船舶制造行业也在不断寻求创新和提高效率的途径。其中&#xff0c;HOOPS技术作为一种先进的三维可视化和工程协作技术&#xff0c;正逐渐成为船舶制造领域的关键工具。 本文将深入探讨HOOPS技术在船舶制造行业的应用&#xff0c;探讨其带来的优…

(2)llvm ir某些细节

&#xff08;1&#xff09;为什么需要llvm ir 也就是说&#xff0c;一个需求是解耦&#xff0c;一个需求是进行大家都需要的平台无关优化。 &#xff08;2&#xff09;llvm ir形式 &#xff08;3&#xff09;llvm结构 结构一个文件是module&#xff0c;里面可以有函数&#x…