查找算法之二分查找

一、算法介绍

二分查找,也称为折半查找,是一种在有序数组中查找特定元素的高效算法。对于包含 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的元素是一个包含两个元素…

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

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

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;更通过智慧服务为游客带来了高品质的旅游体验。本文将深入…

Flask简介

Flask简介 安装概述使用PyCharm创建一个Flask程序 Flask程序的基本结构初始化路由和视图函数启动服务器请求-响应循环 安装 概述 Flask算是小型框架&#xff0c;小到可以称为“微框架”。Flask 非常小&#xff0c;因此你一旦能够熟练使用它&#xff0c;很可能就能读懂它所有的…

《MySQL对库的基本操作》

文章目录 一、查看数据库列表查看数据库中的所有表想知道当前处于哪个数据库里 二、创建一个数据库三、删除一个数据库知道两个集1.字符集2.校验集修改数据库的字符集和编码集 不同的校验码对数据库的影响四、数据库的备份与恢复注意事项&#xff1a;备份数据库中的表 总结 一、…

现代神经网络总结(AlexNet VGG GoogleNet ResNet的区别与改进)

VGG NIN GoogleNet 1.VGG&#xff0c;NIN&#xff0c;GoogleNet的块结构图对比(注意:无AlexNet) 这些块带来的区别与细节 AlexNet未使用块,主要对各个层进行了解: 卷积:捕捉特征 relu:增强非线性 池化层:减少计算量 norm:规范数据分布 全连接层:分类VGG块的改善(对比AlexNe…

开源博客项目Blog .NET Core源码学习(18:App.Hosting项目结构分析-6)

本文学习并分析App.Hosting项目中后台管理页面的_AminLayout.cshtml模版页面和登录页面。 _AminLayout.cshtml模版页面 后台管理页面中的大部分页面都使用_AminLayout.cshtml作为模板页面&#xff0c;如下图所示&#xff0c;后台页面的视图内容放置在表单中&#xff0c;使用la…

【C++航海王:追寻罗杰的编程之路】C++11(四)

目录 1 -> 相关文章 【C航海王&#xff1a;追寻罗杰的编程之路】C11(一) 【C航海王&#xff1a;追寻罗杰的编程之路】C11(二) 【C航海王&#xff1a;追寻罗杰的编程之路】C11(三) 2 -> lambda表达式 2.1 -> C98中的一个例子 2.2 -> lambda表达式 2.3 ->…

Python 与 TensorFlow2 生成式 AI(三)

原文&#xff1a;zh.annas-archive.org/md5/d06d282ea0d9c23c57f0ce31225acf76 译者&#xff1a;飞龙 协议&#xff1a;CC BY-NC-SA 4.0 第七章&#xff1a;使用 GAN 进行风格转移 神经网络在涉及分析和语言技能的各种任务中正在取得进步。创造力是人类一直占有优势的领域&…

MetaGPT初体验之HelloWorld-Git教程编写

[目录] 1.环境准备 2.效果预览 3.总结 4.智能体完整输出 5.源码及教程点我去AIGIS公众号查看本文 前言 5.1假期坚持研究智能体的玩法可以说非常敬业了。今天我们来小试一把目前GitHub最火爆智能体框架MetaGPT,让它给我们写一篇Git教程&#xff0c;看看是不是像传说中的那么神奇…