当前位置: 首页 > article >正文

二分查找--折半查找--看完这篇学不会你来打我

二分查找前言二分查找(binary search)也叫折半查找是一种在有序数组中基于分治策略的高效搜索算法因为它的有序性使得我们可以用“减而治之”的策略来进行查找。本文将大家讲一下二分查找的原理和代码1为什么要用二分查找1.1顺序查找暴力搜索最简单的查找也就是顺序查找只需要在数组中逐一的将target从前往后判断直到找到相等元素这个想必都很容易想到。在无序数组中查找指定元素target时由于没有更多的信息所以在最坏的情况下比如数组中不含target——只有依次遍历到最后一个元素后才可以得到结论。时间复杂度此时是o(n)。如果是无序数组这样做似乎无可厚非如果是有序数组这样做似乎就太过于老实了那么就有人要问了主播主播有没有查找效率更高的方法有的兄弟有的——二分查找intsearch(int*nums,intnumsSize,inttarget){for(inti0;inumsSize;i){if(nums[i]target){//找到了returni;}}return-1;//没找到没有走到if心里}intsearch(vectorintnums,inttarget){for(inti0;inums.size();i){if(nums[i]target){returni;}}return-1;}1.1.2 时间复杂度在有序数组中查找方法时间复杂度顺序查找o(n)二分查找o(logn)二分查找由于用到了数组的有序性大大提高了算法效率1.2 二分查找的原理及代码1.2.1二分查找原理其实大多数人应该很容易想明白举个例子要在这个{2,4,5,7,8,9,12}里面用二分查找元素8我采用左右都是闭区间这种方式仔细说一下[left,right]这种写法左右都是闭区间[left,right]while (left right) 这里用 因为left right是有意义的所以用 或者想一下如果换了上面这个例子如果到最后8了left right退出循环返回-1这不坏了吗if (nums[mid] target)里面 right 要赋值为 mid - 1因为现在这个nums[mid]一定不是target那接下来要查找的左区间最后的位置就是 mid - 1nums[mid] target的情况是一个道理要选mid1intbinsearch(int*nums,intnumsSize,inttarget){intleft0;intrightnumsSize-1;while(leftright){intmidleft(right-left)/2;if(nums[mid]target){rightmid-1;}elseif(nums[mid]target){leftmid1;}else{returnmid;}}return-1;}intbinsearch(vectorintnums,inttarget){intleft0;intrightnums.size()-1;while(leftright){intmidleft(right-left)/2;//这里这样写是防止它越界if(nums[mid]target){rightmid-1;}elseif(nums[mid]target){leftmid1;}else{returnmid;}}return-1;}时间复杂度 o(n)空间复杂度 o(1)大多数初学者或许有疑问这里为什么要这么写int mid left (right - left) / 2;而不是int mid (right left) / 2;其实为了防止leftright这个加起来的结果int越界为了避免越界我们通常采用left (right - left) / 2;另一种开区间的写法我放在最后1.2.2 最坏情况逐行分析一下代码很容易发现如果我们先判断的是nums[mid] target也就是成功判定的话接下来我们要往左半部分如果失败呢我们还要继续判断nums[mid] target从而判断它能否往右这样看往左需要一次判断而往右一共需要两次判断这样就造成了不同情况所对应的查找长度的不均衡一直往左和一直往右查找长度相差约两倍即使目前来看它在最坏的情况下也可以保证O(log n),但是经过我们仔细观察一下还略有不足那么就有人要问了主播主播这样的二分查找的确很强但是还是不够平衡稳定而且还是太长了那么有没有又简单好理解又平衡的二分查找呢有的兄弟有的——二分查找pro版1.3 二分查找 pro和promax上面这种二分查找在时间复杂度上看的确可以了还是略有瑕疵白圭之玷尚可磨也之所以在它的平衡上出现问题最根本的问题是往左边的一次判断和往右边的两次判断机会不相匹配聪明的你一定可以想到解决这个问题只需要把向右侧的次数减少或者让向右侧也只需要一次判定所以解决问题的思路就这两种调整前后的宽度适当加长缩短左右侧的数组pro版统一沿两个方向深入所需的比较次数比如说都统一为一次promax版比如像这样像第一种pro版本情况就不细说了大致可以把这个数组六四分这种样子让mid(leftright)∗6/10mid(leftright)*6/10mid(leftright)∗6/10总之是让右边占的比例小一点总体效果就会更均衡如果用斐波那契数列弄一下的话效果会更好总之是一个进步不过需要注意的是如果完全不要右边那就变成从后往前的顺序查找了那样就得不偿失了对于第二种promax版的情况其实和前面的二分查找思路基本类似判断它是否在左侧如果targetnum[mid]那就让right到mid-1因为此时mid!target,否则targetnum[mid]关于target返回值是left因为最后一定要走targetnum[mid]这里target如果存在那一定是在左边这个关于int mid left (right - left 1) / 2;是为了让他向后取整防止找数组中最后一个数的情况比如在{3,5}里找5带进去试一下就会发现它会往后取整这样就可以取到数组中最后一个元素了了intbinsearch2(int*nums,intnumsSize,inttarget){intleft0;intrightnumsSize-1;while(leftright){intmidleft(right-left1)/2;if(targetnums[mid]){rightmid-1;}else{leftmid;}}return(targetnums[left])?left:-1;}intbinsearch2(vectorintnums,inttarget){intleft0;intrightnums.size()-1;while(leftright){intmidleft(right-left1)/2;if(targetnums[mid]){rightmid-1;}else{leftmid;}}return(targetnums[left])?left:-1;}1.4 总结二分查找在逻辑上很容易理解但是只有真敲一遍才会出现各种小问题建议理解后自己敲一遍为山九仞功亏一篑。如果看完没学会那我很抱歉是我标题党了不要来打我1.5完整测试代码完整测试代码#includestdio.h#includewindows.hintsearch(int*nums,intnumsSize,inttarget){for(inti0;inumsSize;i){if(nums[i]target){returni;}}return-1;}intbinsearch(int*nums,intnumsSize,inttarget){intleft0;intrightnumsSize-1;while(leftright){intmidleft(right-left)/2;if(nums[mid]target){rightmid-1;}elseif(nums[mid]target){leftmid1;}else{returnmid;}}return-1;}intbinsearch2(int*nums,intnumsSize,inttarget){intleft0;intrightnumsSize-1;while(leftright){intmidleft(right-left1)/2;if(targetnums[mid]){rightmid-1;}else{leftmid;}}return(targetnums[left])?left:-1;}intmain(){SetConsoleOutputCP(65001);inta[]{2,4,5,7,8,9,12};intnsizeof(a)/sizeof(a[0]);// 计算数组长度inttargets[]{7,2,12,6};// 测试用例存在和不存在intmsizeof(targets)/sizeof(targets[0]);printf(Array: );for(inti0;in;i)printf(%d ,a[i]);printf(\n\n);for(intj0;jm;j){inttargettargets[j];intindex1search(a,n,target);intindex2binsearch(a,n,target);intindex3binsearch2(a,n,target);printf(目标值%d\n,target);printf( 线性搜索结果%d\n,index1);printf( 二分搜索结果%d\n,index2);printf( 二分搜索promax结果%d\n,index3);printf(\n);}return0;}

相关文章:

二分查找--折半查找--看完这篇学不会你来打我

二分查找前言 二分查找(binary search) 也叫折半查找,是一种在有序数组中基于分治策略的高效搜索算法,因为它的有序性,使得我们可以用 “减而治之” 的策略来进行查找。 本文将大家讲一下二分查找的原理和代码 1为什么要用二分查找 1.1顺序查…...

无套路垃圾分类房定制

最近跟几个做社区管理的朋友聊天,都在吐槽垃圾分类房那点事儿。 “说是定制,结果送来跟隔壁小区一模一样,就换了个logo。” “用了半年,门坏了三次,厂家推来推去没人修。” “合同里藏了一堆增项,最后比预算…...

1.4 Logical Database Design (Mapping ER model to Relational Model) 数据库第一周

Mapping ER model concepts to relations • Entity • Binary 1:1, 1:m, m:m relationships • Complex relationships • Multi-valued attributesEntity• For each entity: • create a relation that includes all the attributes of that entity. • For composite attri…...

白色情人节,致我最爱的你

...

心电域泛化研究从0入门系列 | 第二篇:心电信号预处理全攻略——扫清域泛化建模的第一道障碍

写在第二篇开篇:预处理做不好,域泛化模型直接“报废”看完第一篇,我们已经吃透了心电信号的基础概念、核心波形、导联体系,也摸清了域偏移的核心来源:设备、人群、采集环境、标注差异带来的数据分布不一致。这一篇我们…...

编辑器实现首行缩进效果

问题描述: 编辑器如何实现首行缩进效果? 解决方案: 目前暂无配置实现,可通过事件首行添加空格间接实现。 this.formData.name (this.formData.name || ) JavaScript 更多请参见EOS Low-Code Platform 8...

如何定义开发工程师和测试工程师之间的关系

我们如何定义开发与测试之间的关系? 我将测试工程师(QA)与开发工程师(Dev)的关系比作“互为师生”,这是一个非常新奇的比喻。它打破了传统观念中“开发是制造者,测试是找茬者”的对立关系&#…...

前端开发攻略---微信JSSDK iOS签名失败终极解决方案:Android正常但iOS报错“invalid signature”

这个问题很经典,根源在于 iOS 和 Android 对单页应用(SPA)路由的底层处理机制不同。简单来说,在进行 JSSDK 签名时:Android 认为当前页面的 URL 就是你浏览器地址栏里看到的 URL。iOS 则比较“固执”,它只认…...

LangChain开发-安全配置管理:密钥存储的三种方案与选择建议

一、密钥泄露的风险 1.1 真实案例 案例一:GitHub泄露 └── 开发者将API Key硬编码在代码中,推送到公开仓库 └── 被恶意程序扫描到,短时间内产生巨额消费案例二:日志泄露 └── 密钥被打印到日志文件中 └── 日志被上传到监…...

必看!2026年海外用工EOR名义雇主服务五强品牌排行榜

随着跨国用工需求的增加,EOR名义雇主服务的重要性愈加明显。本文将为您推荐2026年海外用工领域的EOR名义雇主服务五强,这些品牌在市场上都有着良好的口碑和高效的服务。通过品牌排行榜的评测,您能更好地了解各家服务商在合规性、效率及成本控…...

OpenClaw安装指南

OpenClaw 是一个功能强大的工具。以下是在 Linux 和 Windows 系统上部署 OpenClaw 的步骤指南。 1. 环境准备 操作系统:支持 Linux (推荐 Ubuntu 20.04 LTS 或更新版本) 和 Windows (10 或更新版本)。依赖项: Python: 需要 Python 3.7 或更高版本。建议…...

3000亿条数据、50PB存储,这家机构如何用数据治理打通产业数据任督二脉

某国家级产业服务中心(以下简称“S公司”)作为国家发改委与地方政府共建的法定机构,承担着服务区域重大战略、推动产业集群创新发展的重要使命。随着业务快速扩张,S公司面临着数据量爆炸式增长、数据来源庞杂、标准不一、质量参差…...

第4.3.1章 自动驾驶融合定位方法总结(三):大白话通俗易懂总结NDT配准原理

目录 NDT配准大白话:终于搞懂它在优化什么了! 目录 1. 一句话总结:NDT到底在干啥 2. 从生活例子理解:你在玩射击游戏 3. NDT的核心:就是找残差...

关于智榜样学习过程中1day漏洞的学习心得

看到“1day漏洞”,脑中自动关联:概念与本质定义辨析:漏洞已公开但无官方补丁,厂商已知但修复中,攻击窗口期极短生命周期位置:介于0day(厂商未知)和Nday(补丁已发布&#…...

BioCredProv.dll文件彻底修复方法 附免费的下载解决办法

在使用电脑系统时经常会出现丢失找不到某些文件的情况,由于很多常用软件都是采用 Microsoft Visual Studio 编写的,所以这类软件的运行需要依赖微软Visual C运行库,比如像 QQ、迅雷、Adobe 软件等等,如果没有安装VC运行库或者安装…...

三电平有源电力滤波器仿真探索

三电平有源电力滤波器仿真 01) 并联型APF有源电力滤波器,三相三电平NPC; 02)谐波检测采用基于瞬时无功功率理论的ipiq检测方法; 03)采用电压外环电流内环双闭环控制; 04) 电压外环:APF直流侧电压采用PI控制&#xff0c…...

管道和消息队列

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录一、管道(Pipe)管道的分类无名管道1.创建方式2.使用方法3.使用管道实现 ps aux | grep bash 指令命名管道1.命名管道的创建2.命名管道的使用二…...

优学宝V2.0:一套系统搞定所有知识付费场景,多商户+全功能+在线刷题,强得离谱!

优学宝知识付费系统V2.0功能说明书 一、系统核心架构 多商户管理机制 平台方可快速开通独立子商户 各商户数据完全隔离,独立运营 商户功能权限可按需配置(如A商户仅开放视频课程,B商户仅开放题库) 二、主要功能模块 1. 在线学…...

分布式驱动电动汽车十四自由度动力学模型的联合仿真探索

分布式驱动电动汽车十四自由度动力学模型综合了车辆的操纵模型和平顺模型,自由度包括四个车轮的垂向跳动和四个车轮绕旋转轴线的滚动,车体的六个自由度,包括在车体坐标系内的x,y,z的平动和绕x、y、z轴的翻滚、俯仰和横…...

Paperiii 官网入口:www.paperiii.com——拒绝盗版冒牌网站

近日,小编收到了很多同学的私信,说他们在找paperiii官网的时候误入了很多盗版网站,结果维权不成,损失惨重。今天小编就手把手教大家如何正确进入paperiii的官网:www.paperiii.com,拒绝盗版网站。 第一种方…...

婴儿监护婴幼儿姿势识别婴儿行为状态检测数据集VOC+YOLO格式3143张6类别

注意数据集中大约1000张是原图剩余是增强图片主要是对目标区域改变对比亮度和加椒盐噪声数据集格式:Pascal VOC格式YOLO格式(不包含分割路径的txt文件,仅仅包含jpg图片以及对应的VOC格式xml文件和yolo格式txt文件)图片数量(jpg文件个数):3143…...

[算法][力扣350]两个数组的交集2

给你两个整数数组 nums1 和 nums2 ,请你以数组形式返回两数组的交集。返回结果中每个元素出现的次数,应与元素在两个数组中都出现的次数一致(如果出现次数不一致,则考虑取较小值)。可以不考虑输出结果的顺序。示例 1&a…...

递归实现深拷贝

hashMap部分解决对象循环引用问题var obj {name: Jack,test: function () {console.log(obj);},zero: 0,hobby: [null, undefined, 0, haha] }function copy (source, hashMap new WeakMap()) {//判断是否已经拷贝过if (hashMap.get(source)) return hashMap.get(source) /* …...

福州护校,谁家最强?

引言:医学中职教育的核心价值与选择逻辑在职业教育改革持续深化的背景下,医学类中职教育因其明确的职业导向和升学优势,成为初三毕业生的重要选择方向。其中,福州市榕卫技术学校凭借其独特的历史积淀与教学成果,在福州…...

2026更新版!10个降AI率网站测评:自考降AI率必备工具推荐

在当前的学术写作环境中,AI生成内容(AIGC)已经成为高校和自考学生必须面对的问题。随着查重系统对AI痕迹的识别能力不断提升,单纯依靠AI工具完成论文撰写已经难以满足要求。因此,越来越多的学生开始关注“降AI率”这一…...

亲测三亚记账:实力企业案例分享

在海南自贸港建设如火如荼的背景下,三亚作为国际旅游消费中心的核心城市,其市场主体活力持续迸发。对于众多在此扎根或新近成立的企业而言,财税合规不仅是经营的底线,更是把握政策红利、实现长远发展的基石。本文将结合行业观察与…...

JeechBoot前端表格内操作设置下拉

上面是最终的结果,这是在业务场景中很容易碰到的功能操作,下面就是该功能的代码展示。 //接口定义 export const openDoor1 (params: { id: string; dwState: string }) > {return defHttp.post({url: Api.openDoor,params:params , // 参数作为que…...

appstore上架-预览和截屏

上架App store ,如何获得到这些分辨率的截图呢? 有没有遇到这类的问题,明明是模拟器上直接截图,但是上传总会报如下错误。 一张或多张截屏的尺寸存在错误。了解更多 截屏尺寸应为:1242 2688px、2688 1242px、1284 2778px 或 27…...

Java基础语法全解析:从入门到实践

Java语法是编写Java程序的“规则手册”,具有严谨性、面向对象性和跨平台性的特点。掌握基础语法是实现复杂功能的前提,本文将以“概念语法实例”的形式,全面覆盖Java入门阶段的核心语法知识,帮助初学者快速建立Java编程思维。一、…...

国内电子档案管理系统厂商有哪些:趋势洞察与选型指南

前言在数字化转型深度推进的今天,电子档案已成为企业与机构实现高效管理、合规运营的核心资产,档案系统则成为衔接各类档案全生命周期管理的关键载体。从党政机关的涉密档案管控到大型企业的业财档一体化管理,从跨国集团的多区域档案协同到中…...