STL中的每个算法都非常精妙,接下来的几天我想集中学习一下STL中的算法。

ForwardIter lower_bound(ForwardIter first, ForwardIter last,const _Tp& val)算法返回一个非递减序列[first, last)中的第一个大于等于值val的位置。

ForwardIter upper_bound(ForwardIter first, ForwardIter last, const _Tp& val)算法返回一个非递减序列[first, last)中第一个大于val的位置。

lower_bound和upper_bound如下图所示:

1, lower_bound

  这个序列中可能会有很多重复的元素,也可能所有的元素都相同,为了充分考虑这种边界条件,STL中的lower_bound算法总体上是才用了二分查找的方法,但是由于是查找序列中的第一个出现的值大于等于val的位置,所以算法要在二分查找的基础上做一些细微的改动。

首先是我修改数据结构课本上的二分查找实现的lower_bound算法:

int my_lower_bound(int *array, int size, int key)
{int first = 0, last = size-1;int middle, pos=0;       //需要用pos记录第一个大于等于key的元素位置while(first < last){middle = (first+last)/2;if(array[middle] < key){      //若中位数的值小于key的值,我们要在右边子序列中查找,这时候pos可能是右边子序列的第一个first = middle + 1;pos = first;}else{last = middle;           //若中位数的值大于等于key,我们要在左边子序列查找,但有可能middle处就是最终位置,所以我们不移动last,pos = last;              //而是让first不断逼近last。}}return pos;
}

  STL中的实现比较精巧,下面贴出源代码:

//这个算法中,first是最终要返回的位置
int lower_bound(int *array, int size, int key)
{int first = 0, middle;int half, len;len = size;while(len > 0) {half = len >> 1;middle = first + half;if(array[middle] < key) {     first = middle + 1;          len = len-half-1;       //在右边子序列中查找}elselen = half;            //在左边子序列(包含middle)中查找}return first;
}

2, upper_bound

upper_bound返回的是最后一个大于val的位置,也是有一个新元素val进来时的插入位置。

我依然将二分查找略做修改:

int my_upper_bound(int *array, int size, int key)
{int first = 0, last = size-1;int middle, pos = 0;while(first < last){middle = (first+last)/2;if(array[middle] > key){     //当中位数大于key时,last不动,让first不断逼近lastlast = middle;pos = last;}else{first = middle + 1;     //当中位数小于等于key时,将first递增,并记录新的位置pos = first;}}    return pos;
}

下面的代码是STL中的upper_bound实现:

int upper_bound(int *array, int size, int key)
{int first = 0, len = size-1;int half, middle;while(len > 0){half = len >> 1;middle = first + half;if(array[middle] > key)     //中位数大于key,在包含last的左半边序列中查找。len = half;else{first = middle + 1;    //中位数小于等于key,在右半边序列中查找。len = len - half - 1;}}return first;
}

转载于:https://www.cnblogs.com/fnlingnzb-learner/p/5845438.html

lower_bound和upper_bound算法相关推荐

  1. lower_bound和 upper_bound 用法(STL)

    lower_bound和 upper_bound的头文件是#include<algorithm> lower_bound 返回第一个大于等于 x 的数的地址/迭代器 upper_bound ...

  2. lower_bound、upper_bound、equal_range详解

    lower_bound.upper_bound.equal_range定义在头文件<algorithm>中 同时,有序容器如set,map也会提供成员函数lower_bound. 函数声明 ...

  3. lower_bound和upper_bound的实现

    binary search算法特别讲究细节,微小的改动都会带来不同的结果,这篇博客将放上lower_bound和upper_bound的实现 lower_bound的实现 说明:inputs是升序排序 ...

  4. lower_bound和upper_bound的用法

    二分查找算法可以解决最简单的二分查找问题:a数组单调递增,并且其中没有重复的数值.我们遇到的实际问题可能就没有这么简单,可能会有重复的数值.比如a数组里有3个5.这时我们查找5就有一个问题:到底返回哪 ...

  5. C++ STL: lower_bound 和 upper_bound

    接口声明 以下有两个不同的版本 lower_bound template <class ForwardIterator, class T>ForwardIterator lower_bou ...

  6. 【ACM】Uva 1152 (4 Values whose Sum is 0) 二分查找lower_bound() 和upper_bound()的使用

    [问题描述] The SUM problem can be formulated as follows: given four lists A, B, C, D of integer values, ...

  7. vector的插入、lower_bound、upper_bound、equal_range实例

    对于这几个函数的一些实例以便于理解: #include <cstdlib> #include <cstdio> #include <cstring> #includ ...

  8. STL中的lower_bound和upper_bound的理解

    STL迭代器表述范围的时候,习惯用[a, b),所以lower_bound表示的是第一个不小于给定元素的位置 upper_bound表示的是第一个大于给定元素的位置. 譬如,值val在容器内的时候,从 ...

  9. 二分检索函数lower_bound()和upper_bound()

    二分检索函数lower_bound()和upper_bound() 一.说明 头文件:<algorithm> 二分检索函数lower_bound()和upper_bound() lower ...

最新文章

  1. 分析 JDK 源码丨Java Thread
  2. hihoCoder-1829 2018亚洲区预选赛北京赛站网络赛 B.Tomb Raider 暴力 字符串
  3. Python中time模块详解
  4. 【拓扑排序】【堆】CH Round #57 - Story of the OI Class 查错
  5. 第二课 壳的介绍以及脱壳常用思路
  6. 其实吧,微信就是已经用电脑上线,第二天消息还是从手机上重新接收
  7. Sqlite-Sqlite3中的数据类型
  8. Spring Boot——WebMvcConfigurerAdapter已过时解决方案
  9. powerdesigner 同步mysql 报错_Win7下PowerDesigner连接mysql,反向工程,导出差异脚本,或直接同步...
  10. 从严治码-别人在项目中下毒,我该怎么治?
  11. Andorid之KeyguardManager的介绍
  12. 近期新机发布一览:最便宜的只需699元!
  13. sql索引调优_使用内置索引利用率指标SQL Server索引性能调优
  14. C# aspx 数据绑定集中(待修改)
  15. 在电子表格计算架构上应用稀疏数组技术的设计
  16. OrCAD/Pspice元件库说明
  17. 个性化域名邮箱的配置云阿里云域名解析详细教程
  18. widows计算器恢复
  19. 来扯点ionic3[3] 页面的生命周期事件,也就是凡间所说的钩子
  20. (私人收藏)2019WER积木教育机器人赛(普及赛)解决方案-(全套)采集深度学习样本

热门文章

  1. 大数据时代第一部分思维导图_大数据时代总结思维导图模板分享
  2. 米的换算单位和公式_求小学数学的公式、换算和单位转英文字母(米cm)
  3. C++描述的位运算总结
  4. linux筛选之后备份到命令,linux find 命令使用备份
  5. Q4,IT人从来没输过!
  6. 【福利】思科/华为/华三模拟器软件分享,附下载链接
  7. window创建计划自动启动服务器,Windows下搭建svn服务器端--创建自动启动的服务
  8. 从运维域看 Serverless 真的就是万能银弹吗?
  9. 安全容器的发展与思考
  10. vue第二次ajax失效,解决VUE-Router 同一页面第二次进入不刷新的问题