首页 > 其他分享 >二分查找

二分查找

时间:2024-06-22 12:31:55浏览次数:13  
标签:二分 target int 元素 mid 查找

二分查找算法思想

有序的序列,每次都是以序列的中间位置的数来与待查找的关键字进行比较,每次缩小一半的查找范围,直到匹配成功。

一个情景:将表中间位置记录的关键字与查找关键字比较,如果两者相等,则查找成功;否则利用中间位置记录将表分成前、后两个子表,如果中间位置记录的关键字大于查找关键字,则进一步查找前一子表,否则进一步查找后一子表。重复以上过程,直到找到满足条件的记录,使查找成功,或直到子表不存在为止,此时查找不成功。

二分查找优缺点

优点:

  1. 时间复杂度低: 二分查找的时间复杂度是 O(log n),相比线性搜索 O(n),在大型有序数据集上具有更高的效率。
  2. 简单清晰: 算法逻辑相对简单,易于理解和实现。
  3. 节省空间: 二分查找通常只需要很少的额外空间,主要用于存储左右边界、中间索引等变量。

缺点:

  1. 仅适用于有序数据: 二分查找要求数据集是有序的,如果数据集无序,需要先进行排序,这可能增加额外的时间复杂度。
  2. 不适用于链表: 二分查找需要随机访问,对于链表这样的数据结构,二分查找的效率较低,因为它无法直接跳到中间元素。
  3. 只能查找单一元素: 二分查找适用于查找单一元素的情况,如果需要查找多个匹配的元素,可能需要其他算法。
  4. 不适用于动态数据集: 如果数据集经常发生变化,频繁的插入和删除可能会导致数组重新排序,使得二分查找的优势减弱。

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

 

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

  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
  1. 重复步骤2和步骤3,直到找到目标元素或左边界大于右边界

 

实例:

描述

请实现无重复数字的升序数组的二分查找   给定一个 元素升序的、无重复数字的整型数组 nums 和一个目标值 target ,写一个函数搜索 nums 中的 target,如果目标值存在返回下标(下标从 0 开始),否则返回 -1   数据范围:0≤

标签:二分,target,int,元素,mid,查找
From: https://www.cnblogs.com/mimihuhudeliwu/p/18262149

相关文章

  • 704. 二分查找 27. 移除元素
    704.二分查找题目链接:https://leetcode.cn/problems/binary-search/ 前置条件:数值有序 效果:可以将时间复杂度优化为log(n) 思路:target(可能存在的)元素等于mid位元素时,返回当前下标target元素相对于mid位元素小时,选择左侧区域继续查找t......
  • 代码随想录Day1-二分查找法|快慢指针
    二分查找题目链接二分查找是一个较为基础的查找方式,对一个有序没有重复值的数组进行查找时,能够提供一个较好的时间复杂度\(O(log(n))\)算法概要对于有序并且没有重复值的数组来说,我们可以首先选定整个数组的中间下标,它的值则称为中间值,通过它把大数组分成两个小的数组,其中一个......
  • 【题解】CF1949B | 二分答案 霍尔定理
    本题可以做到低于\(O(n^2)\)。最大化最小值,考虑二分答案\(v\)变为检查可行性:每个主菜匹配的开胃菜的两个值都要在\((-\infty,x-v],[x+v,+\infty]\)间选取,问是否存在主菜与开胃菜的完美匹配。对开胃菜排序,得到第\(i\)个主菜可以匹配到的开胃菜集合为一个后缀和一个前缀:\([......
  • Maven 官网 查找&下载 jar包 & pom引用
    问题描述在我们在开发过程中,经常遇到程序中需要引用的某个版本jar包,但是在公司的私有仓库下载不到的情况。遇到这种情况,该怎么办呢?很多人应该首选百度搜索吧。(当然可以,但是,不一定能很快找到自己想要的某个版本的jar包)这里给出一个简洁,方便查找的方案。 完美方案在Maven......
  • 推荐几个免费网站安全扫描程序,可用于查找漏洞和恶意软件
    扫描您的网站、博客是否存在安全漏洞、恶意软件、木马、病毒和在线威胁我们经常关注网站设计、SEO和内容,而低估了安全领域。作为网站所有者,网络安全应该比任何事情都重要。以下是根据扫描功能和用户友好性推荐的一些最佳免费网站安全扫描程序。SUCURISUCURI是最受欢迎的免......
  • 两种查找模板
    目录1.顺序查找2.折半查找(二分查找)1.顺序查找顺序查找是一种最简单、最基本的查找方法。其基本思想是:从数组的首元素开始,将元素逐个与待查找的关键字进行比较,直到找到相等的为止。若整个数组中没有与待查找关键字相等的元素,则查找不成功。//顺序查找函数模板//用顺序......
  • 通过find 查找文件copy到指定目录
    方法一命令如下:findsrc_dir-name"access.log.2011102[2-6]*"-execcp{}dst_dir\;拷贝文件到远程主机上的目标目录的命令:findsrc_dir-name"access.log.2011102[2-6]*"-execscp{}用户名@主机ip:dst_dir\; 方法二findsrc_dir-name"access.log.2011102[......
  • 哈希查找(按个位取余的方式)
    步骤:1.构建哈希表进行分类2.进行哈希查找(算法)处理冲突:按个位取余发现有两个或多个数重复,如:会发现15,25,55,重叠了,对此进行冲突处理,冲突处理有三种:1.地址偏移法以上图为例,将和25按个位取余后重复的数填到25后面的位置,如果相邻的位置满了,在向后填。2.再哈希法 再次使......
  • java二分查找(对半查找)
    packageday04.Work;publicclassBinary{//使用二分查找//int[]arr={1,3,4,5,6,8,9,12,15,17,26,28,27}privatestaticintchazhao(int[]arr,inti){//左边为leftintleft=0;//右边为数组......
  • 从零开始学数据结构系列之第三章《先序线索二叉树查找及总代码》
    文章目录查找下一个节点总代码往期回顾查找下一个节点​  我们为啥没有像中序二叉树一样有第一个节点,因为我们一开始最大就是我们的根节点,所以无需遍历去寻找我们的第一个节点,我们的T就是我们的第一个节点​我们回过来看中序线索二叉树的节点应该是怎么写的/*......