c语言实现lower_bound和upper_bound
lower_bound(int A*,int l,int r,int val);
对于有序数组求职为val的元素插入位置,第一个出现该元素的位置.
分析:
等待插入的元素是val,有序数列是A[](此处按照升序排列),寻找的范围是[l,r];
如果查找区间只存在一个元素 l==r;时.
只需要判断val>A[l]时返回插入下标是l+1:
否则val<=A[l]返回的下表是l(因为要找的插入位置,小于或者相等都会插入到查找位置)
否则如果存在l<r;(l>r为不合法的情况,或者如果l>r时交换l和r)
可以取中点m=(l+r)/2;
比较A[m],与val的值的大小.
如果:
1.val>A[m];则如果A[]中存在val,那么一定是在右边,因此令l=m+1;
2.val<A[m];则如果A[]中存在val, 那么一定是在左边,因此令r=m-1;
3.val=A[m];则如果A[]在m之前存在val,那么一定是在左边此时边界保留,或者不保留,令r=m;或者r=m-1(选择较好的m-1)
可以将二三合并为普遍情况r=m; (如果r=m-1没查到结果会出现到m处查到的情况,因此可以做这样的归并)
如果l<r 任意的m=(l+r)/2 < (r+r)/2即为r,任意计算出的r'<r;
如果l<r 任意的m=(l+r)/2 + 1 > (l+l)/2 + 1 (即为l+1) l'>l;
对于任意区间范围内l<r;是区间都在缩小,不会出现死循环直到l==r;(此时问题可解) ;
一次算法描述可以是
int lower_bound(int *A,int L,int R,int val){int l=L,r=R;while(l<r){ int m=(l+r)/2;if(val<=A[m]){r=m-1;}else{l=m+1;}}return val<=A[l]?l:l+1;
}
以一个例子说明
A[1]={1};
此时有l==r;
查找大值2;
由于2>A[(0+1)/2];
因此插入位置l+1,即为1;
查找相同值1;
插入位置是l,即为0.
查找小值0:
插入位置是0,即为0.
如果l<r
A[5]={1,2,2,2,2};
此时查找2 (r=m)
第i次查找
i= 1 2 3 4
l= 0 0 0 1
r= 4 2 1 1
m= 2 1 0 退出循环返回l,即为1.
如果零r=m-1;
l= 0 0 1
r= 4 1 1
m= 2 0 退出循环返回1
因此可以看出将情况A[m]=val,将r=m-1,效率更高O(log2n);
upper_bound思想同理
描述可以是
int upper_bound(int *A,int L,int R,int val){int l=L,r=R;while(l<r){int m=(l+r)/2;if(val>=A[m]){l=m+1;}elser=m-1;}return val>=A[r]?r+1:r;
}
int main(){int a[10]={1,2,2,2,2,2,2,4,5,6};printf("%d\n",lower_bound(a,0,9,2));printf("%d\n",upper_bound(a,0,9,2));return 0;
}
执行结果
c语言实现lower_bound和upper_bound相关推荐
- upperbound找不到_关于lower_bound( )和upper_bound( )的常见用法
头文件:#include lower_bound( )和upper_bound( )都是利用二分查找的方法在一个排好序的数组中进行查找的. 在从小到大的排序数组中, lower_bound( begi ...
- C++ STL: lower_bound 和 upper_bound
接口声明 以下有两个不同的版本 lower_bound template <class ForwardIterator, class T>ForwardIterator lower_bou ...
- 【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, ...
- vector的插入、lower_bound、upper_bound、equal_range实例
对于这几个函数的一些实例以便于理解: #include <cstdlib> #include <cstdio> #include <cstring> #includ ...
- lower_bound和 upper_bound 用法(STL)
lower_bound和 upper_bound的头文件是#include<algorithm> lower_bound 返回第一个大于等于 x 的数的地址/迭代器 upper_bound ...
- lower_bound和upper_bound算法
STL中的每个算法都非常精妙,接下来的几天我想集中学习一下STL中的算法. ForwardIter lower_bound(ForwardIter first, ForwardIter last,co ...
- STL中的lower_bound和upper_bound的理解
STL迭代器表述范围的时候,习惯用[a, b),所以lower_bound表示的是第一个不小于给定元素的位置 upper_bound表示的是第一个大于给定元素的位置. 譬如,值val在容器内的时候,从 ...
- 二分检索函数lower_bound()和upper_bound()
二分检索函数lower_bound()和upper_bound() 一.说明 头文件:<algorithm> 二分检索函数lower_bound()和upper_bound() lower ...
- lower_bound()和upper_bound()
二分检索函数lower_bound()和upper_bound() lower_bound():找到大于等于某值的第一次出现 upper_bound():找到大于某值的第一次出现 必须从小到大排序后才 ...
最新文章
- SAP QM 由于存在未清TO单导致QA11失败
- 【转】Android studio安装与配置
- Leetcode-997 Find the Town Judge(找到小镇的法官)
- Android Weekly Notes Issue #220
- 每天20分钟,只需一年,一年级学生英语听力达到六年级水平!关键是坚持一点都不难!
- 进度条ProgressBar及ProgressDialog
- ivx中字体显示_Windows 7 中的 SimSun-ExtB 是什么字体,为何与中易宋体 SimSun 显示出来不一样?...
- 开漏输出和推挽输出的区别?
- VC++ 应用程序无法正常启动0xc0150002
- web网络安全防护方案
- 金蝶KIS商贸高级版V6.1开发实现‘序时簿中心’增加'联系人'字段列
- Cheat Enginee(CE)的详细使用指南~包含下载安装教程以及核心功能讲解
- 蚂蚁金服旗下网商银行招聘了
- [附源码]Nodejs计算机毕业设计我的大学电子相册Express(程序+LW)
- Ubuntu下最便捷好用微信、QQ(Wine-Tim Wine-QQ )没有之一
- 电子科技大学--大数据论坛--相关资料
- Muli3D 3 qQuaternionRotationMatrix 函数 (矩阵转四元数)
- 何学林:房价为什么降不下来?房价上涨的刚性是由强大的利益共同体共同作用的结果(原创首发,深度好文)——何学林房地产大策划之十四
- 微信交电费访问服务器失败,微信怎么交电费?操作步骤,常见问题说明
- 企业费控,驶向「一体化」
热门文章
- SpringMVC---(2)
- Win7(Win2003)下安装Node.js(版本号:v0.11.0)提供下载
- Kaggle: Jigsaw Multilingual Toxic Comment Classification Top Solutions 金牌思路总结
- 投稿时Cover Letter的重要性(部分体会来自导师)
- 让Fedora 19支持ThinkPad鼠标中键和小红点实现滚轮效果
- 二手车好大风,老平台都推新服务
- 重庆大学计算机学院最好老师,“一切都是最好的安排”——蒲俊杰老师喜获重庆大学“最受学生欢迎老师”称号...
- 记一次服务器被木马注入攻击
- 【修改el-menu主菜单和子菜单悬浮的背景色】
- VOC2012数据集百度云链接