二分查找

二分查找总结 一、概述 1、定义 二分查找是一种广泛使用的搜索算法,主要用于在有序数组(一般是升序,后面的内容也只是针对升序情况)上查找元素 2、主要思想 二分查找算法背后的主要思想是充分利用元素之间的有序性、以及数组的随机访问特性,每次都与查找区间的中间元素比较大小,根据比较结果不断将查找范围缩小一半(采用分治策略,剪枝?),直到元素被找到,或者,查找区间被缩小为0 3、工作流程 将中间元素... 阅读详情

二分查找

(1)策略:
每经过至多两次比较,或者命中,或者将问题规模缩减一半
T(n)=O(1)+T(n/2)T(n)=O(1)+T(n/2)T(n)=O(1)+T(n/2)
解得T(n)=O(logn)T(n)=O(logn)T(n)=O(logn)

(2)实现:


int binSearch(int value,int lo,int hi){
    int mid;
    while(lo<hi){
       mid = (lo+hi)>>1;
       if(value<Array[mid])hi = mid;
       else if(value>Array[mid])lo= mid+1;
       else return mid;
    }
    return lo;
}

(3)比较操作次数:
在这里插入图片描述
加入对比较次数的考量,二分查找的平均性能为
O(1.5logn)O(1.5logn)O(1.5logn)

(4)二分查找的不足:
二分查找转向左右分支的比较次数不相等,向左侧只需要一次比较,而向右侧需要两次比较,而递归深度却相同。
(5)针对比较次数做针对性改进:
1、Fibonacci查找
使递归深度不平衡,对转向成本的不平衡进行补偿,进而优化算法效率。
不再均衡划分向量,而是使左侧更长,右侧更短。若设整体长度是fib(k)-1,则在fib(k-1)-1处划分。从而左侧长度为fib(k-1),右侧长度为fib(k-2)-1,称作Fibonacci查找,在查找次数上是最优的。
2、直接解决:
将三分支转化为了两分支,缺点是最好情况下性能倒退,但整体性能更稳定

int binSearch_TwoBranch(int value,int lo,int hi){
    int mid;
    while(hi-lo > 1) {
       mid = (lo+hi)>>1;
       if(value<Array[mid])hi = mid;
       else if(value>=Array[mid])lo= mid;
    }
    return Array[lo]==value?lo:-1;
}

(6)满足语义要求的实现

int binSearch(int value,int lo,int hi){
    int mid;
    while(hi-lo > 1) {
       mid = (lo+hi)>>1;
       value<Array[mid]?hi = mid:lo=mid+1;
    }
    return --lo;
}
【二分查找】学习总结 二分查找:  (1) 一般的二分查找:          例如:找球号问题: 在某一国度里流行着一种游戏。游戏规则为:在一堆球中,每个球上都有一个整数编号i(0             这就是普通的二分查找,把所有的球号存入ans[ ]数组了,从小到大排序,然后二分查找,假设共n个球吧(数组中0----n-1)            首先边界 fir=0,end=n-1, 阅读详情

相关推荐

二分查找算法

摘要 二分查找,一个很经典的算法。但是真正理解透彻这个算法却不容易。下面记载一点自己学习二分查找的心得。 参考 正文: 二分查找有N多种写法,有各种各样的形式,选一种合适自己,自己能够理解记住的才是最好的。下面分享一个我比较赞的版本。 对于最最最原始的二分查找,即给出一个Key,查找出key值的索引号。 注意注意注意!!最经典的二分查找对返回来的索引号没有任何要求,只要其对应的值是...

SCUT_Sam 5007

详解二分查找(所有关于二分查找)

转载至: https://www.cnblogs.com/kyoner/p/11080078.html 我周围的人几乎都认为二分查找很简单,但事实真的如此吗?二分查找真的很简单吗?并不简单。看看 Knuth 大佬(发明 KMP 算法的那位)怎么说的: Although the basic idea of binary search is comparatively straightforward, the details can be surprisingly tricky… 这句话可以这样理解:思路很

luseysd的博客 2926

[算法|二分查找] 《有重复数字的升序数组的二分查找》

题目描述 请实现有重复数字的升序数组的二分查找: 给定一个 元素有序的(升序)整型数组 nums 和一个目标值 target ,写 一个函数搜索 nums 中的 target,如果目标值存在返回下标,否则返回 -1 示例1 输入 [1,2,4,4,5],4 输出 2 说明 从左到右,查找到第1个为4的,下标为2,返回2 示例2 输入 [1,2,4,4,5],3 输出 -1 示例3 输入 [1,1,1,1,1],1 输出 0 题解思路 第一想法:既然是二分查找,那就把二分查

喜欢前端的后端 MelodyJerry 1万+

基本算法连载(1)-顺序搜索与二分搜索

顺序搜索Programmer每天都碰到顺序搜索,其code snippet: /**//** 顺序遍历数组,搜索v值是否存在。如果存在,返回相应的位置索引,* 否则返回-1*/int sequentialSearch(int a[],int v,int l,int r)...{int i;for(i = l;i  r;i++)...{if(v == a[i])return i;}retur

naivebaby的专栏 1269

Reality Capture控制点修复/合并模型

通过增加控制点/修改对齐设置参数来修复模型被分为两个部分的解决方法

草履虫建模的博客 5239

京东联盟API实战:5分钟搞定商品返利链接生成(附Python代码)

本文详细介绍了如何利用京东联盟API快速构建自动化商品返利链接生成系统。通过Python代码实战,从API申请、环境配置到核心功能封装,手把手教你实现批量商品信息查询与推广链接生成,帮助内容创作者和开发者大幅提升电商推广效率。

weixin_29216957的博客 673

二分查找的不同版本算法实现

在有序区间[low,high)内查找元素e 「二分」的名字,就是把「待搜索区间」分为「有目标元素的区间」和「不包含目标元素的区间」,排除掉「不包含目标元素的区间」的区间,剩下就是「有目标元素的区间」。 版本一: public static int binSearch(int[]A, int e, int low, int high) { while (low < high...

weixin_44690103的博客 300

手把手教你用UNet实现轨道缺陷检测(附RSDDs数据集下载与完整代码)

本文详细介绍了如何使用UNet模型实现轨道缺陷检测,包括RSDDs数据集的下载与处理、UNet架构的改进与优化、训练策略设计以及模型部署的全流程。通过实战案例,展示了如何利用深度学习技术提升工业质检效率,特别适合从事工业缺陷检测和图像处理的开发者参考。

dapp9builder的博客 747

二分查找(Binary Search) 常见问题解决方法总结

缘由今天浏览 何登成的技术博客  无意中发现了写的blog,二分查找(Binary Search)需要注意的问题,以及在数据库内核中的实现。随想总结下二分查找的常见问题。问题背景今年的实习生招聘考试,我出了一道二分查找(Binary Search)的题目。题目大意如下:给定一个升序排列的自然数数组,数组中包含重复数字,例如:[1,2,2,3,4,4,4,5,6,7,7]。问题:给定任意自然数,对数...

Daniel 的技术笔记 不积跬步无以至千里,不积小流无以成江海。 1万+

新建菜单Office被替换为腾讯文档 - 解决方案

右键新建菜单中的Office被替换为腾讯文档。原因是安装了腾讯文档软件,此软件安装时会自动将新建菜单中的Office替换为腾讯文档,下文介绍解决方案。

NSJim的博客 2928

无人机飞控传感器全解析:从IMU到光流传感器的实战应用

本文深入解析了无人机飞控系统的核心传感器,从IMU、气压计、磁力计到光流传感器,详细阐述了其工作原理、数据融合策略及常见挑战。结合ICF5、Pixhawk 6C等主流飞控硬件,提供了从传感器校准、滤波器调优到应对室内光流定位、强磁干扰等实战场景的系统性优化指南,帮助开发者突破飞控“黑箱”,实现更稳定、可靠的飞行控制。

weixin_28396629的博客 167

二分查找之红蓝二分查找

/ 目标值在左半部分} else {left = mid;// 目标值在右半部分left : -1;// 返回最后一个满足条件的值的索引。

xiaoxie8023的博客 2327

python操作git推送自己分支并合并主分支(持续优化该工具)

python git

qq_44707265的博客 862

【二分查找】有这一篇足够了

【二分查找】(折半查找)有这一篇足够了 1.二分查找是干啥的 2. 力扣中的一些练习题 2.1 二分查找 2.2 第一个错误的版本 2.3 搜索插入位置 2.4 在排序数组中查找元素第一个和最后一个位置 2.5x的平方根 2.6 有效的完全平方数 3.总结一下

m0_58761900的博客 1万+

1、微软 Intune 全面指南:配置、管理与自动化

本文全面介绍了微软 Intune 的配置、管理和自动化操作,涵盖用户与设备管理、安全策略设置、跨平台应用部署、合规性监控及报告分析等内容。通过详细的操作步骤、自动化脚本示例和流程优化建议,帮助技术人员高效掌握 Intune 在混合办公环境中的实际应用,并展望其未来发展趋势。

ii567的博客 359

大语言模型应用指南:幻觉和偏见问题

大语言模型应用指南:幻觉和偏见问题 1. 背景介绍 1.1 大语言模型的发展历程 1.1.1 早期的语言模型 1.1.2 Tr

AI天才研究院 958

优选算法《二分查找》

在之前的学习当中我们已经初步了解过了二分查找的整体逻辑以及二分查找,接下来我们在本篇当中将系统的来学习二分查找的使用方式以及在什么情况下可以使用二分查找。在之前的学习当中我们了解到的二分查找是要求在有序的数组当中当数组元素有序时才能使用,但是其实这只是二分查找最朴素的使用场景,接下来我们将学习更多的二分查找的使用场景。相信通过被本章的学习之后你会有所收获,一起加油吧!!!

mljy.博客 2496

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

【算法】二分查找

本文总结了二分查找的特点、使用条件、和时间复杂度的分析,并且还将二分进行总结成三种情况,分别是朴素二分、查找左边界的二分和查找右边界的二分三种情况。通过若干到例题进行强化算法思维。

2302_80475369的博客 1841

锂电池充电器电路设计 里面有电路

锂电池充电器电路设计 里面有电路 3.7V升压到5V电路设计。

华为的C语言编程规范.pdf

华为技术有限公司内部技术规范。本规范制定了编写C语言程序的基本原则、规则和建议。从代码的清晰、简洁、可测试、安全、程序效率、可移植各个方面对C语言编程作出了具体指导。

二分查找详解

二分查找是一种简单而高效的查找算法,在有序数组查找中有广泛的应用。插值查找和BST是二分查找的变种,它们在某些情况下能够提供更高的效率。理解这些算法的原理和实现方式,对于提高编程能力和解决实际问题具有重要意义。

Weirdo的博客 2877

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

详解二分查找

一.为什么要使用二分查找 当有一个排好顺序的数组,我们需要知道我们要找的值是否在当前数组中,那么我们就需要自己实现一个查找的方法来进行实现,那么如果我们找的数在最后一个位置n处,假设这个n非常大,那么我们要是一次一次进行比较的话就要比较n次,这样就会显得非常慢,那么有没有一种相较于普通查找速度更快的方法吗,那就是二分查找。 二.二分查找的解释 二分查找:也称折半查找(Binary Search),它是一种效率较高的查找方法。但是,折半查找要求线性表必须采用顺序存储结构,而且表中元素按关键字有序排列。

weixin_47651920的博客 5939

[Algorithm][二分查找][二分查找OJ][搜索插入位置] + 二分查找原理 +二分查找模板

[Algorithm][二分查找][二分查找OJ][搜索插入位置] + 二分查找原理 +二分查找模板

SnowK博客 4251

c++二分查找

由于此时只剩下两个数了,所以我们不再二分了,直接判断A[8]是否等于17,或者A[9]是否等于17即可。//表示要在A[1]至A[N]范围查找x。因为我们要查找的数是3,小于A[mid],所以我们下次要在A[L]至A[mid]范围内查找,//查询数组A是否包含x。因为要查找的数是17,大于A[5],所以我们应该在A[5]至A[10]这一段查找,令L=1, R=10, 表示我们用在A[1],A[2],...A[10]里面查找。1、当要查找的数小于A[1]或者大于A[N],返回"no",否则进入二分查找过程。

浪子回头 1733
上一篇: 算法分析的方法
下一篇: 栈—表达式求值、进制转换
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值