博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
[STL] lower_bound和upper_bound
阅读量:4541 次
发布时间:2019-06-08

本文共 2483 字,大约阅读时间需要 8 分钟。

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如下图所示:

 

 

调用时注意,传入的firest 是第一元素的索引,传入的last是最后一个元素下一个元素的索引。

返回时,若所有元素都比targe 小,则返回last

 STL 的equal_range是基于lower_bound 和upper_bound实现的

 

1, lower_bound

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

     

1 int lower_bound(int* array, int low, int high, int key ) 2 { 3      4      5     int mid = 0; 6     while(low < high) 7     {    8         mid =  (low + high)/2; 9         if(array[mid] >= key)10             //若中位数的值大于等于key,我们要在左边子序列查找,但有可能middle处就是最终位置,所以我们要包含mid,让high保持不动, 让low不断逼近high。11             high = mid;// 注意,包含mid,high=mid,不是high = mid+1;12         else13             low = mid+1; //若中位数的值小于key的值,我们要在右边子序列中查找, 不包含mid14 15     }   16     return high;17 18 }

 

2, upper_bound

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

 

1 int upper_bound(int* array, int low, int high, int key ) 2 { 3      4      5     int mid = 0; 6     while(low < high) 7     {    8         mid =  (low + high)/2; 9         if(array[mid] > key)10             //若中位数的值大于等于key,我们要在左边子序列查找,但有可能middle处就是最终位置,所以我们要包含mid,让high保持不动, 让low不断逼近high。11             high = mid;// 注意,包含mid,high=mid,不是high = mid+1;12         else13             low = mid+1; //若中位数的值小于key的值,我们要在右边子序列中查找, 不包含mid14 15     }   16     return high;17 18 }

 

 

另外,也可以用一个变量来记录当前的位置,写起来也很简单。。在传统二分基础上加两个判断

1 #if 1 2 int my_lower_bound(int *array, int low, int high, int key)  3 { 4     int mid, pos= high;        5     high --; 6  7     while(low <= high) 8     { 9         mid = (low + high)/2;10         if(array[mid] >=  key){      11             if(mid < pos)12                 pos = mid;13             high = mid- 1;  14         }15         else{16            low = mid + 1; 17         }18     }19     return pos;20 }21 int my_upper_bound(int *array, int low, int high, int key)22 {23     int mid, pos= high;       24     high --;25 26     while(low <= high)27     {28         mid = (low + high)/2;29         if(array[mid] >  key){      30             if(mid < pos)31                 pos = mid;32             high = mid- 1;  33         }34         else{35            low = mid + 1; 36         }37     }38     return pos;39 }40 #endif

 

 

 

转载于:https://www.cnblogs.com/diegodu/p/3795077.html

你可能感兴趣的文章
SVN操作步骤
查看>>
Xianqi UVa 1589
查看>>
无刷新效果统计在线人数
查看>>
2017-2018-2 1723《程序设计与数据结构》问题汇总 (更新完毕)
查看>>
c# 通过反射 实例化类
查看>>
[ubuntu]中文用户目录路径改英文
查看>>
spark 编程教程
查看>>
LeetCode--Valid Parentheses
查看>>
BZOJ3124 SDOI2013 直径 DFS
查看>>
BZOJ4566: [Haoi2016]找相同字符
查看>>
python:extend (扩展) 与 append (追加) 之间的天与地
查看>>
Python测试——安装篇总结
查看>>
7 -- Spring的基本用法 -- 11... 基于XML Schema的简化配置方式
查看>>
输入1则输出0,输入0则输出1
查看>>
placeholder字体样式及兼容
查看>>
个人简历
查看>>
《怎样成为一个高手——罗振宇》观后感
查看>>
ASCII表格
查看>>
x-www-form-urlencoded
查看>>
存储引擎
查看>>