二分查找(Java) 详细讲解 一文足矣_二分查找找到多个会怎样-程序员宅基地

技术标签: 算法  数据结构  

目录

以下是二分查找的详细步骤:

初始化左右边界:将初始查找范围设置为整个数组,即left = 0,right = array.length - 1。

计算中间元素的索引:mid = (left + right) / 2。

检查中间元素是否是目标元素:

重复步骤2和步骤3,直到找到目标元素或左边界大于右边界

代码

 我的其他博客



二分查找,也称为折半查找,是一种在有序数组中查找特定元素的高效算法。其基本思想是每次将查找范围缩小一半,直到找到目标元素或确定目标元素不存在。

以下是二分查找的详细步骤:

  1. 初始化左右边界:将初始查找范围设置为整个数组,即left = 0right = array.length - 1

  2. 计算中间元素的索引:mid = (left + right) / 2

  3. 检查中间元素是否是目标元素:

    • 如果 array[mid] == target,则找到目标元素,返回 mid
    • 如果 array[mid] < target,说明目标元素在右半部分,更新 left = mid + 1
    • 如果 array[mid] > target,说明目标元素在左半部分,更新 right = mid - 1
  4. 重复步骤2和步骤3,直到找到目标元素或左边界大于右边界

代码

public class BinarySearch {
    // 二分查找函数
    public static int binarySearch(int[] array, int target) {
        int left = 0;
        int right = array.length - 1;

        while (left <= right) {
            int mid = left + (right - left) / 2;

            // 检查中间元素是否是目标元素
            if (array[mid] == target) {
                return mid; // 找到目标元素,返回索引
            } else if (array[mid] < target) {
                // 目标元素在右半部分
                left = mid + 1;
            } else {
                // 目标元素在左半部分
                right = mid - 1;
            }
        }

        // 目标元素不存在
        return -1;
    }

    public static void main(String[] args) {
        int[] array = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};
        int target = 7;

        int result = binarySearch(array, target);

        if (result != -1) {
            System.out.println("目标元素 " + target + " 在数组中的索引为 " + result);
        } else {
            System.out.println("目标元素 " + target + " 不存在于数组中");
        }
    }
}

这段代码演示了如何使用二分查找在有序数组中查找目标元素。在 main 方法中,我们定义了一个有序数组 array,并在其中查找目标元素 target。最后输出结果,指示目标元素是否存在以及其索引位置。 

优缺点

优点:

  1. 时间复杂度低: 二分查找的时间复杂度是 O(log n),相比线性搜索 O(n),在大型有序数据集上具有更高的效率。

  2. 简单清晰: 算法逻辑相对简单,易于理解和实现。

  3. 节省空间: 二分查找通常只需要很少的额外空间,主要用于存储左右边界、中间索引等变量。

缺点:

  1. 仅适用于有序数据: 二分查找要求数据集是有序的,如果数据集无序,需要先进行排序,这可能增加额外的时间复杂度。

  2. 不适用于链表: 二分查找需要随机访问,对于链表这样的数据结构,二分查找的效率较低,因为它无法直接跳到中间元素。

  3. 只能查找单一元素: 二分查找适用于查找单一元素的情况,如果需要查找多个匹配的元素,可能需要其他算法。

  4. 不适用于动态数据集: 如果数据集经常发生变化,频繁的插入和删除可能会导致数组重新排序,使得二分查找的优势减弱。

总体来说,二分查找是一种非常有用的算法,尤其适用于有序数据集的查找操作。然而,使用前需要考虑数据集的特点和操作需求,以确保选择最适合的算法。

其他的用途

在实际应用中,二分查找常常用于:

  1. 搜索: 在有序数组中快速查找某个元素的索引。
  2. 算法优化: 在某些算法中,通过二分查找可以提高搜索效率,例如在分治算法中。
  3. 数据库操作: 在数据库索引的查找过程中,二分查找也有着广泛的应用。
  4. 游戏开发: 在有序数组或有序集合中查找元素,如查找排行榜中的玩家。

总体来说,二分查找在需要高效搜索有序数据集的情况下是非常有用的。

与他类似的查找

  1. 线性查找(Linear Search):

    • 特点: 顺序遍历数据集,逐个比较元素,直到找到目标或遍历完整个数据集。
    • 适用场景: 数据集无序或未排序,或者需要查找的元素在数据集中的位置相对较靠前。
  2. 哈希查找(Hashing):

    • 特点: 使用哈希函数将元素映射到一个索引,快速定位元素。
    • 适用场景: 适用于需要快速查找、插入和删除的情况,但要求数据结构具有哈希函数的支持。
  3. 插值查找(Interpolation Search):

    • 特点: 根据目标值的估计位置进行查找,适用于有序且均匀分布的数据集。
    • 适用场景: 数据集有序且均匀分布时,插值查找可能比二分查找更快。
  4. 树结构查找(二叉搜索树、平衡二叉搜索树、B 树等):

    • 特点: 使用树结构进行有序数据的查找,支持高效的查找、插入和删除操作。
    • 适用场景: 适用于需要频繁的插入和删除操作,同时要求有序性的数据集。
  5. 线性索引查找(例如块索引):

    • 特点: 使用索引结构,将数据集分块,通过索引快速定位块,然后再在块内进行查找。
    • 适用场景: 适用于大型数据集,其中块的数量相对较小,但每个块中的元素数量较大。

 我的其他博客

HTTP与HTTTPS的区别-程序员宅基地

什么情况下会产生StackOverflowError(栈溢出)和OutOfMemoryError(堆溢出)怎么排查-程序员宅基地

谈谈我对HashMap扩容机制的理解及底层实现-程序员宅基地

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/AliceNo/article/details/134615388

智能推荐

前端导出当前页面为PDF或者图片_前端怎样导出整个网页为pdf-程序员宅基地

文章浏览阅读412次。前端导出当前页面为PDF或者图片_前端怎样导出整个网页为pdf

linux grep 正则表达式-程序员宅基地

文章浏览阅读1.1w次,点赞5次,收藏50次。目录1、grep命令2、grep 与正则表达式3、关于匹配的实例4、grep实例1、grep命令功能:输入文件的每一行中查找字符串。基本用法:grep [-acinv] [--color=auto] [-A n] [-B n] '搜寻字符串' 文件名参数说明:-a:将二进制文档以文本方式处理-c:显示匹配次数-i:忽略大小写差异-n:在行首显示行号-A:After的意思,显示匹配字符串后n行的数据-B:before的意思,显示匹配字符串前n行的数据-v:显示_linux grep 正则表达式

电商数据分析17——电商平台评价系统的数据分析与管理_优化业绩评价平台-程序员宅基地

文章浏览阅读1.1k次,点赞22次,收藏18次。在数字经济时代,电商平台已成为消费者购物的首选。随之而来,评价系统作为连接消费者与产品的重要桥梁,对于购买决策和产品改进起着至关重要的作用。通过数据分析来优化评价管理,不仅可以提升产品信誉,还能显著提高销售业绩。本文将深入探讨评价系统的作用、数据分析在评价系统管理中的应用,以及通过实际案例来展示评价系统管理优化的策略。_优化业绩评价平台

在linux中挂载磁盘ext3和ext4之间的区别_linux 命令mount ext3 和 ext4 u盘有什么区别-程序员宅基地

文章浏览阅读1.7k次。转载:https://blog.csdn.net/zhaoyoulin2016/article/details/80221101Linux kernel 自 2.6.28 开始正式支持新的文件系统 Ext4。 Ext4 是 Ext3 的改进版,修改了 Ext3中部分重要的数据结构,而不仅仅像 Ext3 对 Ext2 那样,只是增加了一个日志功能而已。Ext4可以提供更佳的性能和可靠性,还有更..._linux 命令mount ext3 和 ext4 u盘有什么区别

专业课知识问答-背诵版-程序员宅基地

文章浏览阅读671次,点赞8次,收藏8次。背背背,不理解怎么背?

计算机毕业设计springboot校园流浪猫管理平台777i79[附源码]_监控校园流浪猫-程序员宅基地

文章浏览阅读191次。选题背景:随着社会的发展和进步,越来越多的人开始关注动物福利问题。在校园中,流浪猫的数量逐渐增加,给校园环境和学生生活带来了一定的影响。因此,设计一个校园流浪猫管理平台具有重要的现实意义和紧迫性。选题意义:首先,校园流浪猫管理平台可以提供一个集中管理的平台,方便学校和相关部门对流浪猫进行统一管理和监控。通过该平台,可以及时记录流浪猫的数量、位置和健康状况等信息,为后续的管理工作提供数据支持。其次,该平台可以促进校园内流浪猫的救助和领养工作。通过平台的信息发布功能,可以将流浪猫的情况及时通知到感兴_监控校园流浪猫

随便推点

如何提高或者修改WiFi发射功率-程序员宅基地

文章浏览阅读2.6k次。比如MTK系列网卡驱动方案,驱动里边提供了一个.dat的配置文件,配置文件里边有TxPower的选项,(值为0—100,Set Transmit Power by percentage),网卡模块在出厂的时候已经将校准功率值写入EEPROM了,修改TxPower的值可适当微调功率,但默认值为100。如果要提高发射功率那只能修改EEPROM了。每个厂家都有自己的一套修改网卡模块功率值的办法,彻底修改..._mt6762修改wifi功率

Delphi实现对注册表的监视和扫描[转]-程序员宅基地

文章浏览阅读61次。声明:CSDN以外的任合团体和个人转载本文必须注明出处和作者。 Delphi自带的TRegistry类只能实现注册表的基本操作,如果我们要实时监视注册表的变化或者扫描注册表特定项下的所有子项,TRegistry类就无能为力了。我啃了半天SDK,终于实现了Delphi对注册表的监视与扫描,不敢独享,拿来献给广大的Delphi爱好者。 监视注册表相关项的改变要用到一个AP..._api监视注册表变动

C++动态规划经典案例解析之合并石子_c++石子合并优化-程序员宅基地

文章浏览阅读2.3k次,点赞4次,收藏14次。区间类型问题,指求一个数列中某一段区间的值,包括求和、最值等简单或复杂问题。此类问题也适用于动态规划思想。如前缀和就是极简单的区间问题。现给定区间信息[3,6],求区间内所有数字相加结果。即求如下图位置数字之和。区间至少包括2个属性,起始端和结束端,求和范围包含左端和右端数字。累加数组中0~6区间的值s1。累加数组中0~2区间的值s2。将s1中的值减去s2中的值。得到最终结果。如果对任意区间的求解要求较频繁,会存在大量的重复计算。如分别求区间[2,5]和[1,5]之和时,分析可知区间。_c++石子合并优化

前端权限控制(一):前端权限管理及动态路由配置方案_前端权限管理如何实现-程序员宅基地

文章浏览阅读1.1w次,点赞10次,收藏135次。在项目中,尤其是在后台管理系统中,不同人员登陆,看到的页面菜单是不一样的,比如,一个公司的办公系统,超级管理员登陆可以看到所有的页面,而普通员工账号登录可能无法看到人员管理等页面,比如公司的员工个人资料页面只有人力资源部门有权利看,其他部门的员工是不允许查看公司员工信息数据的。当然了除了页面的权限,还会有一些按钮级别的权限,比如一个下载按钮,有的帐号可以用,有的人不能用,比如人员账号管理中,一个页面中有一个确认添加、删除该账号人员按钮,这个按钮只有管理员有权利点击,其他人员登陆是无法点击的。........_前端权限管理如何实现

java毕设分享 基于Django与协同过滤的电影推荐系统-程序员宅基地

文章浏览阅读238次,点赞5次,收藏5次。基于Django与协同过滤的电影推荐系统电影推荐系统——实现用户登录、评分、推荐,采用协同过滤算法用户注册、登录系统,对看过的电影进行评分,点击提交评分按钮,再点击查看推荐按钮即可看见推荐的电影列表。项目主页以及推荐结果如下:1.首先将项目克隆到本地,用Pycharm打开movierecommend文件夹,并install项目依赖2.将用到的csv文件导入mysql数据表中,详见数据库建表 ,配置好数据库;注意数据库相关代码(settings.py、views.py)可能都要进行修改以符合实际情况;(

c语言中point的用法_C/C++编程笔记:C语言编程知识要点总结!大一C语言知识点(全)...-程序员宅基地

文章浏览阅读3.5k次,点赞5次,收藏8次。一、C语言程序的构成与C++、Java相比,C语言其实很简单,但却非常重要。因为它是C++、Java的基础。不把C语言基础打扎实,很难成为程序员高手。1、C语言的结构先通过一个简单的例子,把C语言的基础打牢。C语言的结构要掌握以下几点:(1)C语言的注释是/* ··· */,而不是//···,//是C++的单行注释,有的C语言版本也认可。(2)C语言区分大小写,每句以分号结尾。(3)C语..._c语言point函数

推荐文章

热门文章

相关标签