查找算法之二分查找

一、算法介绍

二分查找,也称为折半查找,是一种在有序数组中查找特定元素的高效算法。对于包含 n 个元素的有序数组,二分查找的步骤如下:

  • 确定搜索范围:首先,将要查找的元素与数组中间的元素进行比较。如果查找的元素等于中间元素,则找到了目标值。否则,如果目标值小于中间元素,则在左半边继续查找;如果目标值大于中间元素,则在右半边继续查找。
  • 缩小搜索范围:根据比较结果,将搜索范围缩小为剩余数组的一半,并重复执行步骤 1,直到找到目标值或确定目标值不存在。

二分查找算法的关键优势在于每一步都能将搜索范围减半这使得算法的时间复杂度为 O(log n),相比线性搜索算法的 O(n) 更加高效,尤其是对于大型数据集。

二、时间复杂度计算

二分搜索最坏的情况就是折半一直找到最后一个元素,首先观察规律

开始时,是从n个元素中查找

第一次折半时,是从 n 2 \frac{n}{2} 2n个元素中查找

第二次折半时,是从 n 4 \frac{n}{4} 4n个元素中查找

假设第k次折半后只剩一个元素,即是从 n 2 k \frac{n}{2^k} 2kn个元素中查找

n 2 k \frac{n}{2^k} 2kn= 1,即 n = 2 k 2^k 2k,由对数定义知道 k = log ⁡ 2 n \log_{2}n log2n,在计算机科学中如果没有特殊说明,默认就是以2为底,即k= log ⁡ n \log n logn

即操作k次才能找到最后一个元素,所以时间复杂度为O( log ⁡ n \log n logn)

三、Java代码示例

package com.datastructures;/*** 二分查找算法的示例代码* @author hulei*/
public class BinarySearchExample {/*** 在有序的整型数组中使用二分查找算法来寻找指定目标值的索引。** @param arr 一个已排序的整型数组。* @param target 要在数组中查找的目标值。* @return 如果目标值存在于数组中,则返回其索引;如果目标值不存在,则返回-1。*/public static int binarySearch(Integer[] arr, int target) {int left = 0; // 初始化左边界为数组的第一个元素的索引int right = arr.length - 1; // 初始化右边界为数组的最后一个元素的索引while (left <= right) { // 当左边界不大于右边界时继续循环int mid = left + (right - left) / 2; // 计算中间位置,避免溢出if (arr[mid] == target) {return mid; // 如果中间位置的元素等于目标值,返回其索引} else if (arr[mid] < target) {left = mid + 1; // 如果中间位置的元素小于目标值,调整左边界} else {right = mid - 1; // 如果中间位置的元素大于目标值,调整右边界}}return -1; // 如果没有找到目标值,返回-1}public static void main(String[] args) {Integer[] sortedArray = {11, 22, 33, 44, 55, 66, 77, 88, 99, 100, 111, 123};int targetValue = 55;int result = binarySearch(sortedArray, targetValue);if (result != -1) {System.out.println("元素位置索引为: " + result);} else {System.out.println("没有发现目标元素");}}}

代码分析:
该函数是一个实现二分查找的静态函数,其输入参数为一个整型数组 arr 和一个目标值 target,返回目标值在数组中的索引,如果目标值不存在则返回 -1。

  • 首先,函数定义了两个指针 left 和 right,分别指向数组的起始位置和末尾位置。
  • 然后,通过一个 while 循环,持续查找目标值。在每一次循环中,计算数组中间位置的索引 mid,并将其对应的值与目标值进行比较。
    • 如果中间值等于目标值,则返回 mid,即找到了目标值的索引。
    • 如果中间值小于目标值,说明目标值在当前中间值的右边,则将 left 更新为 mid + 1,缩小查找范围的左边界。
    • 如果中间值大于目标值,说明目标值在当前中间值的左边,则将 right 更新为 mid - 1,缩小查找范围的右边界。
  • 该函数的时间复杂度为 O(log n),其中 n 是数组的长度。

比如我要在以下数组
Integer[] sortedArray = {11, 22, 33, 44, 55, 66, 77, 88, 99, 100, 111, 123}
中查找目标值为55的元素的索引位置,返回结果为4,即元素55的索引位置为4
在这里插入图片描述

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

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

相关文章

引领农业新质生产力,鸿道(Intewell®)操作系统助力农业机器人创新发展

4月27日至29日&#xff0c;2024耒耜国际会议在江苏大学召开。科东软件作为特邀嘉宾出席此次盛会&#xff0c;并为江苏大学-科东软件“农业机器人操作系统”联合实验室揭牌。 校企联合实验室揭牌 在开幕式上&#xff0c;江苏大学、科东软件、上交碳中和动力研究院、遨博智能研究…

查看笔记本电池容量/健康状态

1. 打开命令行提示符 快捷键“win R”后输入“cmd” 2. 在命令提示符中输入命令 “powercfg /batteryreport" 并回车 3. 查看文件 最后就可以看到笔记本的电池使用报告了

高效率的做事方法?

高效率的做事方法可以帮助我们更好地管理时间和资源&#xff0c;以下是一些建议&#xff1a; 1.明确目标和计划&#xff1a; 在开始任何任务之前&#xff0c;先明确你的目标是什么。 制定一个详细的计划&#xff0c;包括步骤、时间表和预期结果。 将任务分解成小块&#xff0…

第11章 数据库技术(第一部分)

一、数据库技术术语 &#xff08;一&#xff09;术语 1、数据 数据描述事物的符号描述一个对象所用的标识&#xff0c;可以文字、图形、图像、语言等等 2、信息 现实世界对事物状态变化的反馈。可感知、可存储、可加工、可再生。数据是信息的表现形式和载体&#xff0c;信…

python实现的基于单向循环链表插入排序

相比于定义一个循环双向链表来实现插入排序来说&#xff0c;下面的实现采用一个单向循环链表来实现&#xff0c;并且不需要定义一个单向循环链表类&#xff0c;而是把一个list&#xff08;数组/顺序表&#xff09;当成单向循环链表来用&#xff0c;list的元素是一个包含两个元素…

css 将div固定在页面顶部不随页面滑动

为了将一个 div 设置为固定在页面顶部&#xff0c;并且高度为 5rem&#xff0c;宽度为 100vw&#xff0c;不随页面滚动&#xff0c;可以使用几种不同的 CSS 技术来实现。下面我将列举几种常见的方法&#xff1a; 1. 使用 position: fixed 最直接的方法是使用 position: fixed…

Docker的介绍及与传统虚拟化技术的区别

Docker是一个开源的应用容器引擎&#xff0c;它使得开发者可以将应用及其依赖包打包到一个可移植的容器中&#xff0c;然后发布到任何流行的Linux或Windows操作系统的机器上。Docker基于Go语言开发&#xff0c;它的出现极大地简化了应用程序的部署、管理和扩展。 以下是Docker…

【Windows,亲测有效】手动激活Sublime Text

前言 Sublime Text 是一款非常好用的文本编辑器&#xff0c;但是免费版时不时会跳弹窗 本方法无毒无害&#xff0c;简单易上手 2023/12/22 更新&#xff1a;实测从 4143 支持到 4169 开始 先确保你用的是官方版本的 Sublime Text&#xff0c;还没下的可以去官方下载&#…

Winform的App.config文件配置的读取

配置 App.config 文件&#xff1a; 在 Visual Studio 中&#xff0c;打开您的项目并找到 App.config 文件&#xff08;如果不存在&#xff0c;则可以通过右键单击项目&#xff0c;选择“添加” > “新建项” > “应用程序配置文件”来创建它&#xff09;。在 App.config…

typescript学习笔记3

类型推断&#xff08;Type Inference&#xff09; TypeScript 编译器会在编译过程中进行类型推断。这意味着在很多情况下&#xff0c;你不需要明确地为变量或表达式指定类型&#xff0c;TypeScript 会根据上下文自动推断出最合适的类型。 typescript let x 10; // TypeScript…

Shell脚本知识点汇总表格总结

现在后端开发程序员&#xff0c;基本上都需要具备基本的运维能力&#xff0c;所以shell脚本编程也是非常重要的。所以需要掌握shell脚本的知识&#xff0c;并具备编写shell脚本的能力&#xff0c;我想把最近这几年在广州图书馆看的关于shell脚本的知识做个总结汇总&#xff0c;…

net lambda 、 匿名函数 以及集合(实现IEnumerable的 如数组 、list等)

匿名函数&#xff1a;》》》 Action a1 delegate(int i) { Console.WriteLine(i); }; Lambda:>>> Aciont a1 (int i) > { Console.WriteLine(i); }; 可以简写 &#xff08;编译器会自动根据委托类型 推断&#xff09; Action a1 &#xff08;i&#xff09;> {…

笔记本无线网络共享给有线使用

1.鼠标右击wifi图标选择打开网络和Internet设置 2.选择WLAN项&#xff0c;点击进入更改适配器选项 3.进入到以下界面&#xff0c;右击以太网选择启动&#xff08;不确定的话可以在设备管理器查看网卡&#xff09; 4.右击WLAN选项&#xff0c;点击属性 5.点击共享&#xff0…

搭建vue3组件库(一): Monorepo架构搭建

文章目录 1. 以 pnpm 构建 monorepo1.1 全局安装 pnpm1.2 配置 pnpm 的 monorepo 工作区1.3 仓库项目内的包相互调用1.4 TypeScript 初始化配置文件 2. 通用配置文件2.1 添加 .editorconfig 编辑器格式配置文件2.2 添加 .gitignore git 忽略文件2.3 添加 .npmrc npm配置文件2.4…

esp32s3使用psram后音频播报不了的问题解决记录

idf.py menuconfig开启psram后会报错 提示需要打补丁&#xff1a; 根据提示切换到IDF_PATH目录&#xff0c;然后执行git apply %ADF_PATH%/ida_patches/idf5.0_freertos.patch打补丁。 再次编译提示如下错误&#xff1a; assert failed: spi_flash_disable_interrupts_cach…

【Qt QML】Pane组件

Pane&#xff08;窗格&#xff09;提供与应用程序样式和主题匹配的背景色。窗格不提供自己的布局&#xff0c;但需要您定位其内容&#xff0c;例如通过创建RowLayout或ColumnLayout。 声明为窗格的子项的项自动成为窗格的contentItem的父项。动态创建的项需要显式地添加到conte…

VSCode 配置 CMake

VSCode 配置 C/C 环境的详细过程可参考&#xff1a;VSCode 配置 C/C 环境 1 配置C/C编译环境 方案一 如果是在Windows&#xff0c;需要安装 MingW&#xff0c;可以去官网(https://sourceforge.net/projects/mingw-w64/)下载安装包。 注意安装路径不要出现中文。 打开 windows…

06 - 步骤 add constants

简介 Add Constants 步骤是用于在数据流中添加常量字段的步骤。它允许用户在数据流中插入一个或多个常量字段&#xff0c;并为这些字段指定固定的数值、字符串或其他类型的常量值。 使用 场景 我需要在数据清后&#xff0c;这个JSON 字符串有一个固定的行流数据。 1、拖拽…

数字旅游引领未来智慧之旅:科技应用深度重塑旅游生态,智慧服务全面升级打造极致高品质旅游体验

随着信息技术的飞速发展&#xff0c;数字旅游作为旅游业与科技融合的新兴业态&#xff0c;正以其独特的魅力和优势&#xff0c;引领着旅游业迈向智慧之旅的新时代。数字旅游不仅通过科技应用重塑了旅游生态&#xff0c;更通过智慧服务为游客带来了高品质的旅游体验。本文将深入…

grpc笔记

教程地址 【狂神说】gRPC最新超详细版教程通俗易懂 | Go语言全栈教程_哔哩哔哩_bilibili rpc 定义&#xff1a;Remote Procedure Call——远程过程调用&#xff0c;通俗的含义是&#xff1a;远程定义好方法名、参数和返回值&#xff0c;RPC可以像调用本地方法那样调用远端方…