每日算法-二分查找

适用场景

适用于有序数组中查找某一个值.
每查找一次,就将搜寻范围缩小一半,
平均时间复杂度是O(log_{2}N), 简记作:O(lgN).

主要难点

主要难点在于边界条件的判断;

大致思路:

1.当供查找的数组不合法时,直接返回结果,查询无果;

2.当数组长度等于1时,直接判断是否相等即可;

3.当数组仅有两个元素时,直接分别判断;

4.当数组元素多于2个时, 采用如下策略:

1) 有限比较数组头尾两个元素与查询目标元素的值比较, 因为是有序数组,如果在界外,则直接判断给出查询结果;

2)如果和边界元素比较后,范围在界内,则开始真正的二分查找法,分别采用low, high, mid三个游标来界定查询范围.

实现方式

1.迭代法

2.递归法

3.Arrays.binarySearch(int[] arr, int target) API

实践代码如下:


import java.util.Arrays;/*** 默认有序数组arr[]是从小到大的顺序排列的,如果不是则需要先结合排序算法使用.*/
public class BinarySearch {// 迭代法public int binarySearch1(int[] arr, int target) {// 先判断数据的有效性if (arr == null || arr.length < 1) {return -1;}int low = 0;final int length = arr.length;int high = length - 1;int mid;// System.out.println("length:" + length + ",low:" + low + ",high:" + high//         + ",mid:" + (low + high) / 2);// 先判断头尾游标的值if (length == 1) {if (arr[0] == target) {return 0;} else {return -1;// not found}} else { // length >= 2if (arr[low] == target) {return low;} else if (arr[high] == target) {return high;} else if (arr[low] > target || arr[high] < target) {//如果待查找的数值在有序数组最大或者最小值之外,直接判查询未果,无须再二分查找了.return -1;}}while (low < high) {mid = (low + high) / 2;// System.out.println("low:" + low//         + ",value[low]:" + arr[low]//         + ",high:" + high + ",value[high]:" + arr[high]//         + ",mid:" + mid + ",value[mid]:" + arr[mid]);//这段非常重要,否则将可能出现死循环,//当头游标和尾游标的中间值已经是起始或者末尾两个游标位之一时,代表查找结束,且无果.if (high == mid || low == mid) {return -1;}if (arr[mid] < target) {low = mid;} else if (arr[mid] > target) {high = mid;} else if (arr[mid] == target) {return mid;}}return -1;}// 递归法public int binarySearch2(int[] arr, int target) {// System.out.println("enter binarySearch2");if (null == arr || arr.length < 1) {return -1;}final int length = arr.length;if (length == 1) {if (arr[0] == target) {return 0;} else {return -1;// not found}} else { // length >= 2if (arr[0] == target) {return 0;} else if (arr[arr.length - 1] == target) {return arr.length - 1;} else if (arr[0] > target || arr[length - 1] < target) {return -1;// not found}}return binarySearchRecursion(arr, 0, arr.length - 1, target);}private int binarySearchRecursion(int arr[], int low, int high, int target) {// System.out.println("length:" + arr.length + ",low:" + low + ",high:" + high//         + ",mid:" + (low + high) / 2);int mid;while (low < high) {mid = (low + high) / 2;//这段非常重要,否则将可能出现死循环,//当头游标和尾游标的中间值已经是起始或者末尾两个游标位之一时,代表查找结束,且无果.if (mid == low || mid == high) {return -1;}if (arr[mid] == target) {return mid;} else if (arr[mid] < target) {return binarySearchRecursion(arr, mid, high, target);} else if (arr[mid] > target) {return binarySearchRecursion(arr, low, mid, target);}}return -1;}// Arrays.binarySearch API法public int binarySearchArrays(int[] arr, int target) {if (arr == null || arr.length <= 0) {return -1;}//Arrays.sort(arr);return Arrays.binarySearch(arr, target);}public static void main(String[] args) {// 多个测试用例数组int[] arr = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20,};int[] arr2 = {1, 2, 4,};int[] arr3 = {1, 2, 4, 6};int[] arr4 = {1, 2, 4, 6, 8};int[] bigArr = new int[10000];for (int i = 0; i < 10000; i++) {bigArr[i] = i * 2;}System.out.println("init arr done!");int wanted = 6;int[] toBeSearchArr = bigArr;BinarySearch bs = new BinarySearch();System.out.println("binearySearch1 :" + bs.binarySearch1(toBeSearchArr, wanted));System.out.println("binearySearch2 recursion :" + bs.binarySearch2(toBeSearchArr, wanted));System.out.println("Arrays.binarySearch():" + bs.binarySearchArrays(toBeSearchArr, wanted));}
}

测试结果如下:

init arr done!
binearySearch1 :3
binearySearch2 recursion :3
Arrays.binarySearch():3[Done] exited with code=0 in 1.508 seconds

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

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

相关文章

AI生成音乐——创作的革命与未来的思考

AI在创造还是毁掉音乐&#xff1f; 最近一个月&#xff0c;音乐大模型的轮番上线&#xff0c;迅速降低了素人生产音乐的门槛&#xff0c;并引发了关于音乐圈是否会被AI彻底颠覆的热议。短暂的兴奋过后&#xff0c;更多理性的目光开始审视AI产品的版权归属、创意产业在AI阴影下…

Redis 7.x 系列【6】数据类型之字符串(String)

有道无术&#xff0c;术尚可求&#xff0c;有术无道&#xff0c;止于术。 本系列Redis 版本 7.2.5 源码地址&#xff1a;https://gitee.com/pearl-organization/study-redis-demo 文章目录 1. 前言2. 常用命令2.1 SET2.2 GET2.3 MSET2.4 MGET2.5 GETSET2.6 STRLEN2.7 SETEX2.8…

全方位对比PostgreSQL和MySQL

目录 引言 技术架构与设计哲学 起源与发展 数据库引擎 PostgreSQL与MySQL&#xff1a;SQL语法与特性对比概览 PostgreSQL与MySQL高级特性对比&#xff1a;数据类型与事务处理能力 数据类型与功能特性 PostgreSQL与MySQL性能与可扩展性对比 PostgreSQL与MySQL性能与可扩…

南昌高校大学智能制造实验室数字孪生可视化系统平台建设项目验收

南昌高校大学智能制造实验室&#xff0c;作为该地区乃至全国智能制造领域的重要研究和教学基地&#xff0c;一直致力于探索和创新智能制造技术。近日&#xff0c;该实验室的数字孪生可视化系统平台建设项目成功通过了验收&#xff0c;标志着其在数字孪生技术领域取得了重大突破…

Trick :带 pop 的 STL 结构化绑定时不要用 auto

题目描述 给一个 n m n\times m nm 矩阵迷宫&#xff0c; 第 i i i 行第 j j j 列的值为 c i , j c_{i,j} ci,j​ &#xff0c; L H LH LH 在迷宫中迷路了&#xff0c;他需要你的帮助。 L H LH LH 当前在 ( 1 , 1 ) (1,1) (1,1) 的位置&#xff0c;出口在 ( n , m ) (n…

安卓应用内通信的核心-Handler

Handler Handler是安卓应用内通信的核心。 Handler相关的类简介 Handler机制整体可以看作一个传送带。 Looper 传送带的轮子。Handler 传送带上货物的入口和出口。Message 传送带上的货物。MessageQueue 传送带的皮带。 基础知识 一个Thread只有一个Looper&#xff0c;一…

滑动窗口2

1. 水果成篮&#xff08;904&#xff09; 题目描述&#xff1a; 算法原理&#xff1a; 根据题目意思&#xff0c;friuts表示第i棵树上的水果种类&#xff0c;然后我们有两个篮子去在这些树上去采水果&#xff0c;但是有限制就是一个篮子里就只能装一种水果&#xff0c;也就是…

矩阵运算在数据分析中的应用

矩阵运算在数据分析中的应用 大家好&#xff0c;我是免费搭建查券返利机器人省钱赚佣金就用微赚淘客系统3.0的小编&#xff0c;也是冬天不穿秋裤&#xff0c;天冷也要风度的程序猿&#xff01; 矩阵运算作为数学和计算机科学中的重要概念&#xff0c;在数据分析和科学计算中发…

elasticsearch源码分析-03选举集群状态

选举集群状态 es中存储的数据有一下几种&#xff0c;state元数据、lucene索引文件、translog事务日志 元数据信息可以分为&#xff1a; 集群层面的元信息-对应着metaData数据结构&#xff0c;主要是clusterUUid、settings、templates等索引层面的元信息-对应着indexMetaData数…

RK35x8通过TFTP下载内核到开发板

对于有网线接口的RK35X8开发板&#xff0c;调试时候&#xff0c;可以通过网线下载内核镜像和设备树到开发板&#xff0c;不用每次修改驱动都要重新打开下载工具&#xff0c;进入下载模式。通过TFTP可以大大提高调试效率。 在ubuntu安装TFTP服务 安装tftp服务器 sudo apt-get…

【面试系列】前端开发工程师高频面试题及详细解答

欢迎来到我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;欢迎订阅相关专栏&#xff1a; ⭐️ 全网最全IT互联网公司面试宝典&#xff1a;收集整理全网各大IT互联网公司技术、项目、HR面试真题. ⭐️ AIGC时代的创新与未来&#xff1a;详细讲解AIGC的概念、核心技术、…

Python商务数据分析知识专栏(二)——Python数据分析基础

Python商务数据分析知识专栏&#xff08;二&#xff09;——Python数据分析基础 一、Python数据分析概述二、Numpy数值计算基础专栏二&#xff08;Python数据分析基础&#xff09;的总结 与 专栏三&#xff08;Python数据分析的应用&#xff09;开端 一、Python数据分析概述 二…

【笔记】Spring Cloud Gateway 实现 gRPC 代理

Spring Cloud Gateway 在 3.1.x 版本中增加了针对 gRPC 的网关代理功能支持,本片文章描述一下如何实现相关支持.本文主要基于 Spring Cloud Gateway 的 官方文档 进行一个实践练习。有兴趣的可以翻看官方文档。 由于 Grpc 是基于 HTTP2 协议进行传输的&#xff0c;因此 Srping …

深度学习之Transformer模型的Vision Transformer(ViT)和Swin Transformer

Transformer 模型最初由 Vaswani 等人在 2017 年提出,是一种基于自注意力机制的深度学习模型。它在自然语言处理(NLP)领域取得了巨大成功,并且也逐渐被应用到计算机视觉任务中。以下是两种在计算机视觉领域中非常重要的 Transformer 模型:Vision Transformer(ViT)和 Swi…

git 个人常见错误备注

问题1&#xff1a;all conflict fixed but you are still merging。。。。。 如果你已经解决了所有冲突&#xff0c;但 Git 仍然提示你正在进行合并&#xff0c;可能是因为你还没有完成合并过程。以下是详细步骤&#xff0c;确保你正确完成合并并提交更改&#xff1a; 确认所…

Tongsuo(铜锁)项目介绍 - 实现国密SSL协议

文章介绍 铜锁(Tongsuo)是一个提供现代密码学算法和安全通信协议的开源基础密码库,为存储、网络、密钥管理、隐私计算、区块链等诸多业务场景提供底层的密码学基础能力,实现数据在传输、使用、存储等过程中的私密性、完整性和可认证性,为数据生命周期中的隐私和安全提供保…

鸿蒙 如何 url decode

在 TypeScript 和 JavaScript 中进行 URL 编码的最简单方式是使用内置的 global 函数 encodeURIComponent()。以下是一个示例&#xff1a; let url "https://example.com/?name测试&job开发者"; let encodedURL encodeURIComponent(url); console.log(encode…

【RAG】FoRAG:面向网络增强型长形式问答的事实性优化RAG

一、解决问题 在基于网络的长形式问答&#xff08;Web-enhanced Long-form Question Answering, LFQA&#xff09;任务中&#xff0c;现有RAG在生成答案时存在的问题&#xff1a; 事实性不足&#xff1a;研究表明&#xff0c;现有系统生成的答案中只有大约一半的陈述能够完全得…

Qt开发笔记:Qt3D三维开发笔记(一):Qt3D三维开发基础概念介绍

若该文为原创文章&#xff0c;转载请注明原文出处 本文章博客地址&#xff1a;https://blog.csdn.net/qq21497936/article/details/140059315 长沙红胖子Qt&#xff08;长沙创微智科&#xff09;博文大全&#xff1a;开发技术集合&#xff08;包含Qt实用技术、树莓派、三维、O…

汇编语言基础教程

汇编语言基础教程 大家好&#xff0c;我是免费搭建查券返利机器人省钱赚佣金就用微赚淘客系统3.0的小编&#xff0c;也是冬天不穿秋裤&#xff0c;天冷也要风度的程序猿&#xff01;今天我们将深入探讨汇编语言的基础知识和应用&#xff0c;帮助大家理解汇编语言在计算机编程中…