(转)STL之二分查找(binary_search(),lower_bound(),upper_bound() )

二分查找(二分检索):

 

二分法检索又称折半检索,二分法检索的基本思想是设字典中的元素从小到大有序地存放在 数组array)中,     首先将给定值key与
 
字典中间位置上元素的关键码(key)比较,如果相等,则检索成功;       否则,若key小,则在字典前半部分中继续进行二分法检索;若
 
key大,则在字典后半部分中继续进行二分法检索。     这样,经过一次比较就缩小一半的检索区间,如此进行下去,直到检索成功或
 
检索失败。      偶数个取中间2个其中任何一个作为中间元素。        二分法检索是一种效率较高的检索方法,要求字典在 顺序表中按
 
键码排序。
 
 
 
二分查找函数: binary_search():
 
头文件:  #include<algorithm>
 
函数模板:binary_search(arr[],  size  ,  indx)         
 
参数说明:     arr[]: 数组首地址;
                         size:  数组元素个数;
                         indx:    需要查找的值。
 
函数功能:  在数组中以二分法检索的方式查找,若在数组(要求数组元素非递减)中查找到indx元素则返回其下标,若查找不到则返回值为假。
 
 
 
lower_bound():
 
头文件:  #include<algorithm>
 
函数模板: 如 binary_search()
 
函数功能:  函数lower_bound()在first和last中的 前闭后开区间进行二分查找,返回大于或等于val的 第一个元素位置。如果所有元素都小于val,则返回 last的位置
 
举例如下:
 

一个数组number序列为:4,10,11,30,69,70,96,100.设要插入数字3,9,111.pos为要插入的位置的下标

 

pos = lower_bound( number, number + 8, 3) - number,pos = 0.即number数组的下标为0的位置。

 

pos = lower_bound( number, number + 8, 9) - number, pos = 1,即number数组的下标为1的位置(即10所在的位置)。

pos = lower_bound( number, number + 8, 111) - number, pos = 8,即number数组的下标为8的位置(但下标上限为7,所以返回最后一个元素的下一个元素)。

 

所以,要记住:函数lower_bound()在first和last中的前闭后开区间进行二分查找,返回大于或等于val的第一个元素位置。如果所有元素都小于val,则返回last的位置,且last的位置是越界的!!~

返回查找元素的第一个可安插位置,也就是“元素值>=查找值”的第一个元素的位置

 

upper_bound():

 

头文件:#include<algorithm>

 

函数模板: 如binary_search()

 

函数功能:函数upper_bound()返回的在前闭后开区间查找的关键字的上界,返回大于val的第一个元素位置

 

例如:一个数组number序列1,2,2,4.upper_bound(2)后,返回的位置是3(下标)也就是4所在的位置,同样,如果插入元素大于数组中全部元素,返回的是last。(注意:数组下标越界)

返回查找元素的最后一个可安插位置,也就是“元素值>查找值”的第一个元素的位置

 

注意:

          lower_bound(val): 返回容器中第一个值【大于或等于】val的元素的iterator位置。
         upper_bound(val): 返回容器中第一个值【大于】val的元素的iterator位置。
 
拓展:
         insert()用法:
              比如vector _rows中已经有了{0,1,3,5}
              这时要放入4,则std::lower_bound( _rows.begin(), _rows.end(), 4);将会返回5,就是应该插入的那个位置后面的那个值
             然后_rows.insert( iter, 4);这句将按照从小到大的顺序将4放进去,最后的顺序是{0,1,3,4,5}
基于STM32F407,使用DFS算法实现最短迷宫路径检索,分为三种模式:1.DEBUG模式,2. 训练模式,3. 主程序模式 ,DEBUG模式主要分析bug,测量必要数据,训练模式用于DFS算法训练最短路径,并将最短路径以链表形式存储Flash, 主程序模式从Flash中….zip项目工程资源经过严格测试可直接运行成功且功能正常的情况才上传,可轻松复刻,拿到资料包后可轻松复现出一样的项目,本人系统开发经验充足(全领域),有任何使用问题欢迎随时与我联系,我会及时为您解惑,提供帮助。 【资源内容】:包含完整源码+工程文件+说明(如有)等。答辩评审平均分达到96分,放心下载使用!可轻松复现,设计报告也可借鉴此项目,该资源内项目代码都经过测试运行成功,功能ok的情况下才上传的。 【提供帮助】:有任何使用问题欢迎随时与我联系,我会及时解答解惑,提供帮助 【附带帮助】:若还需要相关开发工具、学习资料等,我会提供帮助,提供资料,鼓励学习进步 【项目价值】:可用在相关项目设计中,皆可应用在项目、毕业设计、课程设计、期末/期中/大作业、工程实训、大创等学科竞赛比赛、初期项目立项、学习/练手等方面,可借鉴此优质项目实现复刻,设计报告也可借鉴此项目,也可基于此项目来扩展开发出更多功能 下载后请首先打开README文件(如有),项目工程可直接复现复刻,如果基础还行,也可在此程序基础上进行修改,以实现其它功能。供开源学习/技术交流/学习参考,勿用于商业用途。质量优质,放心下载使用。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值