【二分查找法及其应用】

news/2024/12/13 0:50:59/

文章目录

  • 一. 前提
  • 二. 基本思路
  • 三. 代码实现
  • 四. 封装在STL中的二分查找算法
  • 五. 练习

一. 前提

  • 待查找的序列是有序的;
  • 待查找的 a 采取顺序存储结构

二. 基本思路

设在升序序列 a [ low…high ] 查找的 k ,
首先找中间值 mid= a [ ( low+high )/2 ] ;
然后比较 k 和 a [ mid ] , 分成三个情况:
(1)k == a[ mid ] , 直接返回 a [ mid ] ;
(2)k < a [ mid ] , 新的查找区域变为左子表 a [ low , mid-1 ] ;
(3)k > a [ mid ] , 新的查找区域变为右子表 a [ mid+1 , high ] ;
下一次查找根据 新的查找区间 进行查找。

三. 代码实现

//二分查找法 
int BinSearch(int a[],int low,int high,int k)
{if(low<=high){  //当前区间存在元素 int mid=(low+high)/2;if(a[mid]==k)return mid;  //找到后返回其下标 if(a[mid]<k)return BinSearch(int a[],int low,int mid-1,int k);if(a[mid]>k)return BinSearch(int a[],int mid+1,int high,int k);}else{return -1; //区间不存在元素,返回 -1 }
}

可见二分查找的时间重要花费在元素比较上,其时间复杂度为O(log⁡2n\log_{2}nlog2n)

四. 封装在STL中的二分查找算法

  1. lower_bound
ForwoardIterator   lower_bound( ForwoardIterator begin , ForwoardIterator end , const T& num)

lower_bound( begin,end,num):从数组的begin位置到end-1位置二分查找第一个大于或等于num的数字,找到返回该数字的地址,不存在则返回end。通过返回的地址减去起始地址begin,得到找到数字在数组中的下标。

  1. upper_bound
 ForwoardIterator   upper_bound( ForwoardIterator begin , ForwoardIterator end , const T& num)

upper_bound( begin,end,num):从数组的begin位置到end-1位置二分查找第一个大于num的数字,找到返回该数字的地址,不存在则返回end。通过返回的地址减去起始地址begin,得到找到数字在数组中的下标。

  1. binary_search
bool binary_bound( ForwoardIterator begin , ForwoardIterator end , const T& num)

区间中存在要查找的值,返回 true ;否则, false

五. 练习

链接:poj 2549


http://www.ppmy.cn/news/22718.html

相关文章

Mask掩码

Python中Mask的用法引例Numpy的MaskedArray模块小于&#xff08;或小于等于&#xff09;给定数值大于&#xff08;或大于等于&#xff09;给定数值在给定范围内超出给定范围在算术运算期间忽略NaN和/或infinite值All men are sculptors, constantly chipping away the unwanted…

QWT--添加Label

文章目录一、前言二、添加画布标签三、游标读数一、前言 在使用QWT绘制曲线的时候&#xff0c;可能需要在画布上标明曲线的信息&#xff0c;例如我最近在做的静态录波&#xff0c;需要标明曲线的物理量&#xff0c;如下所示&#xff1a; 在QWT–数据游标一文中&#xff0c;其实…

【交互式用户流程与演示设计】上海道宁与​Overflow让您能更自信的展示您的设计

Overflow 让设计师和产品经理 能够自信地展示他们的设计 并讲述他们的设计故事 独特的动态和交互式演示 Overflow 的功能 使设计人员能够使用鼠标、键盘和手势 轻松导航用户流程 以闪电般的速度 放大和缩小以在重要时专注于细节 原型模式提供了 新的不同缩放级别和交互…

电力电子技术课程实验:实验一、DC/DC直流斩波电路制作与性能测试

电力电子技术课程实验&#xff1a;实验一、DC/DC直流斩波电路制作与性能测试实验一、DC/DC直流斩波电路制作与性能测试预习报告一、 知识准备二、降压斩波电路MATLAB/Simulink电路三、降压斩波电路MATLAB仿真四、 升压斩波电路MATLAB/Simulink电路五、升压斩波电路MATLAB仿真六…

【RuoYi-Vue-Plus】学习笔记 47 - 翻译功能 Translation 源码分析

文章目录前言参考目录功能代码实现及测试目录结构说明测试类功能调用流程分析1、翻译配置初始化 TranslationConfig#init2、翻译功能的实现2.1、创建自定义上下文序列化器 TranslationHandler#createContextual2.2、设置空值序列化器 TranslationBeanSerializerModifier#change…

C#里使用UdpClient和线程来创建UDP网络通讯

C#里使用UdpClient和线程来创建UDP网络通讯 在开发的过程中,时不时就需要使用到UDP通讯。 比如与仪器进行通讯,获取仪器的数据。 又或者与PLC通讯,而PLC采用UDP的协议,而不是使用TCP协议。 作为一个软件开发人员,所以必须要熟练地使用UDP进行通讯, 才可以随着应用范围的改…

互融云汽车融资租赁系统-汽车金融软件开发

汽车融资租赁作为汽车金融中典型的业务模式&#xff0c;是一种依托现金分期付款的方式&#xff0c;在此基础之上引入出租服务中所有权和使用权分离的特性&#xff0c;租赁结束后将所有权转移给承租人的现代营销方式。即在租赁期内&#xff0c;用户以分期支付租金的方式获得车辆…

开源工具系列3:Prowler

在处理云安全的问题时&#xff0c;一种非常重要的思路就是检测和持续监控云上资源的安全情况&#xff0c;通过专业工具的支持&#xff0c;可以让云安全管理在问题发生前发现云环境中的潜在威胁&#xff0c;进而去采取有效的处理措施。 Prowler 是什么 Prowler 是一个命令行工具…