Java查找算法——(二)二分查找(完整详解,附有案例+代码)

文章目录

  • 一.二分查找
    • 1.1 概述
    • 1.2 基本版实现
    • 1.3 变动版

一.二分查找

1.1 概述

也叫折半查找

每次排除一半的查找范围

前提条件:元素必须是有序的,从小到大,或者从大到小都是可以的。

如果是无序的,也可以先进行排序。但是排序之后,会改变原有数据的顺序,查找出来元素位置跟原来的元素可能是不一样的,所以排序之后再查找只能判断当前数据是否在容器当中,返回的索引无实际的意义。

基本思想:也称为是折半查找,属于有序查找算法。用给定值先与中间结点比较。

1.2 基本版实现

public class Test01 {public static void main(String[] args) {// 基础版:二分查找算法int[] arr = { 1,2, 6,66};int i = binarySearch(arr, 6);System.out.println(i);//1}// 定义方法,查找目标数字的索引,、// 找到返回对应的索引// 没有找到返回-1public static int binarySearch(int[] arr, int target){// 起始索引int start = 0;// 末尾索引int end = arr.length-1;// start索引和end索范围内有东西执行查找while (start <= end){// 定义中间索引int mid = (start +end)/2;// int mid = (start +end)>>>1;// 目标函数 小于 中间值if (target <arr[mid]){end = mid - 1;}else if (arr[mid] < target){start = mid + 1;}else {return mid;}}return -1;}// BinarySearch()  结束
}
  • 问题1: 为什么是 i<=j 意味着区间内有未比较的元素, 而不是 i<j ?

    i==j 意味着 i,j 它们指向的元素也会参与比较
    i<j 只意味着 m 指向的元素参与比较

  • 问题2: (start + end) / 2 有没有问题?

    如果 int end = Integer.MAX_VALUE-1;在运行(start + end)会出现内存溢出。

    同一个二进制数:1011-111-1111-1111-1111-1111-1111-1110

    不把高位视为符号位,代表:3221225470

    把最高位视为符号位,代表:-1073741826

    解决办法:

    采用右移一位,右移一位的效果相当于除以2向下取整。

    只需将 int mid = (start + end) / 2 改成 int mid = (start + end) >>> 1

1.3 变动版

public class Test02 {public static void main(String[] args) {// 变动版:二分查找算法int[] arr = {1,2, 6,66};int i = binarySearch(arr, 6);System.out.println(i);//1}// 定义方法,查找目标数字的索引,、// 找到返回对应的索引// 没有找到返回-1public static int binarySearch(int[] arr, int target){// 起始索引int start = 0;// 末尾索引;// 第一处变动,end指针不参与运算,只作为边界int end = arr.length;// start索引和end索范围内有东西执行查找// 第二处变动 <= 变为 <while (start < end){// 定义中间索引// int mid = (start +end)/2;int mid = (start +end) >>> 1;// 目标函数 小于 中间值if (target <arr[mid] ){//第三变动,end = mid;}else if (arr[mid] < target){start = mid + 1;}else {return mid;}}return -1;}// BinarySearch()  结束
}

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

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

相关文章

C++速通LeetCode中等第3题-盛最多水的容器

双指针法&#xff1a;两个指针分别指向左右边界&#xff0c;记录最大面积&#xff0c;由于面积由短板决定&#xff0c;两个指针中较短的短指针向内移动一格&#xff0c;再次记录最大面积&#xff0c; 直到两指针相遇&#xff0c;得出答案。 class Solution { public:int maxAr…

spring 注解 - @NotEmpty - 确保被注解的字段不为空,而且也不是空白(即不是空字符串、不是只包含空格的字符串)

NotEmpty 是 Bean Validation API 提供的注解之一&#xff0c;用于确保被注解的字段不为空。它检查字符串不仅不是 null&#xff0c;而且也不是空白&#xff08;即不是空字符串、不是只包含空格的字符串&#xff09;。 这个注解通常用在 Java 应用程序中&#xff0c;特别是在处…

安卓13设置动态修改设置显示版本号 版本号增加信息显示 android13增加序列号

总纲 android13 rom 开发总纲说明 文章目录 1.前言2.问题分析3.代码分析4.代码修改5.编译6.彩蛋1.前言 设置 =》关于平板电脑 =》版本号 在这里显示了系统的一些信息,但是这里面的信息并不包含序列号之类的信息,我们修改下系统设置,在这里增加上相关的序列号。 2.问题分析…

打造以太坊数据监控利器:InfluxDB与Grafana构建Geth可视化分析平台

前言 以太坊客户端收集大量数据&#xff0c;这些数据可以按时间顺序数据库的形式读取。为了简化监控&#xff0c;这些数据可以输入到数据可视化软件中。在此页面上&#xff0c;将配置 Geth 客户端以将数据推送到 InfluxDB 数据库&#xff0c;并使用 Grafana 来可视化数据。 一…

Axios 封装网络请求

1 简介 通过Axios的请求拦截器和响应拦截器实现登录拦截&#xff0c;参数封装。 注意&#xff1a;前提是你的vue已经安装了Axios。 附安装代码&#xff1a; npm install axios 2 封装代码 2.1 utils文件夹下创建 request.js // 网络请求方法 import axios from axios impor…

Thinkphp5实现mysql主从复制

在使用ThinkPHP5&#xff08;TP5&#xff09;框架的项目中实现MySQL主从复制&#xff0c;主要步骤包括以下几个方面&#xff1a; 配置MySQL主从复制环境&#xff1a; 主库&#xff08;Master&#xff09;&#xff1a;负责处理写操作&#xff0c;如插入、更新和删除等。从库&…

多比特AI事业部VP程伟光受邀为第四届中国项目经理大会演讲嘉宾

全国项目经理专业人士年度盛会 武汉市多比特信息科技有限公司AI事业部VP程伟光先生受邀为PMO评论主办的全国项目经理专业人士年度盛会——2024第四届中国项目经理大会演讲嘉宾&#xff0c;演讲议题为“AI对于项目经理工作的影响和变化解析”。大会将于10月26-27日在北京举办&am…

深度学习02-pytorch-04-张量的运算函数

在 PyTorch 中&#xff0c;张量&#xff08;tensor&#xff09;运算是核心操作之一&#xff0c;PyTorch 提供了丰富的函数来进行张量运算&#xff0c;包括数学运算、线性代数、索引操作等。以下是常见的张量运算函数及其用途&#xff1a; 1. 基本数学运算 加法运算&#xff1a…

计算机组成体系与组成结构错题解析【软考】

目录 前言进制转换码制补码 CPU的组成输入/输出技术中断相关概念输入/输出技术的三种方式比较周期相关知识 主存编址计算流水线技术层次化存储体系可靠性 前言 本文专门用来记录本人在做软考中有关计算机上组成体系与组成结构的错题&#xff0c;我始终认为教学相长是最快提高的…

如何利用 opencv 进行 ROI(感兴趣)获取和实现 VR(虚拟现实) 演播室的播放

我是从事医疗软件的开发的。 经常需要从拍摄的医疗视频中获取出病理区域。并计算病理区域的周长和面积。 用 opencv 的术语,这就是感兴趣区域的获取。 (因为都是实时视频,所以速度很关键。代码效率很重要) 有时,需要标注出病理区域,并将非病理区域从视频中去除掉。 如果将…

[教程]如何在iPhone上启用中国移动/联通/电信RCS消息

目前 苹果已经在 iOS 18 中带来 RCS 富媒体消息的支持&#xff0c;该消息基于网络传递&#xff0c;用户可以通过 RCS 免费将消息发送到其他 iPhone 或 Android 设备。在苹果面向测试版用户推出的 iOS 18.1 Beta 版中&#xff0c;中国网络运营商包括中国移动、中国联通、中国电信…

STL-常用算法 遍历/查找/排序/拷贝和替换/算数生成/集合算法

STL常用算法 常用的遍历算法 for_each #define _CRT_SECURE_NO_WARNINGS #include<iostream> using namespace std; #include<vector> #include<algorithm>void myPrint(int v) {cout << v << " "; }class MyPrint { public:void op…

产品经理需要了解的AI模型

随着人工智能技术的迅猛发展&#xff0c;AI已经成为各行各业不可或缺的一部分。对于产品经理而言&#xff0c;了解AI模型不仅能促进产品的创新&#xff0c;还能帮助我们更好地理解用户需求&#xff0c;提升产品价值。 下面我将详细介绍四类重要的AI模型——自然语言处理&#…

【云原生安全篇】一文掌握Harbor集成Trivy应用实践

【云原生安全篇】一文掌握Harbor集成Trivy应用实践 目录 1 概念 1.1 什么是 Harbor 和 Trivy&#xff1f; 1.1.1 Harbor 1.1.2 Trivy 1.2 Harbor 与 Trivy 的关系 Trivy 在 Harbor 中的作用&#xff1a; 1.3 镜像扫描工作流程 2 实战案例&#xff1a;在Harbor 配置 Trivy …

2018年国赛高教杯数学建模D题汽车总装线的配置问题解题全过程文档及程序

2018年国赛高教杯数学建模 D题 汽车总装线的配置问题 一&#xff0e;问题背景   某汽车公司生产多种型号的汽车&#xff0c;每种型号由品牌、配置、动力、驱动、颜色5种属性确定。品牌分为A1和A2两种&#xff0c;配置分为B1、B2、B3、B4、B5和B6六种&#xff0c;动力分为汽油…

面向pymupdf4llm与MinerU 面试题

PyMuPDF4LLM 面试题&#xff1a; 基础知识 你能否解释一下 PyMuPDF 在 PDF 解析中的工作原理&#xff1f;它与其他解析工具&#xff08;如 PDFMiner、Tesseract&#xff09;相比有哪些优势&#xff1f;PyMuPDF 提取文本时&#xff0c;如何保证页面布局的完整性&#xff1f;如何…

Golang | Leetcode Golang题解之第416题分割等和子集

题目&#xff1a; 题解&#xff1a; func canPartition(nums []int) bool {n : len(nums)if n < 2 {return false}sum, max : 0, 0for _, v : range nums {sum vif v > max {max v}}if sum%2 ! 0 {return false}target : sum / 2if max > target {return false}dp …

前端算法学习,包含复杂度、双指针、滑动窗口、二叉树、堆等常见题型和方法,含leetcode例题

前端算法题 学习 复杂度 时间复杂度 代码的运行时间随着数据规模增长的趋势 最好情况的时间复杂度&#xff1a;O(1)最坏情况的时间复杂度平均情况下的时间复杂度均摊复杂度&#xff1a; 空间复杂度 双指针 两个指针同向、背向移动 快慢指针 可以用于判断链表中是否有环 …

fastadmin 根据选择数据来传参给selectpage输入框

文章目录 js代码php代码&#xff1a;完结 js代码 $(document).on(change,#table .bs-checkbox [type"checkbox"],function(){let url$(#chuancan).attr(data-url)urlurl.split(?)[0]let idsTable.api.selectedids(table)if(ids.length){let u_id[]ids.forEach(eleme…

Seata学习笔记

目录 Seata的三大角色 角色 相关流程 相关事务模式 AT 模式&#xff08;默认模式&#xff09; 概述 整体机制 分析 XA 模式 概述 机制 分析 TCC 模式 概述 机制 分析 SAGA 模式 概述 机制 分析 参考&#xff1a; Seata的三大角色 角色 TC (Transaction Co…