二分查找求上下界
来源:互联网 发布:邪典电影 知乎 编辑:程序博客网 时间:2024/05/22 09:07
/** Note:* 二分法也是分治思想的一种体现* 分治三步:1.划分问题 2.递归求解 3.合并问题* 虽然递归能够实现二分,但一般把二分写成非递归形式* 二分思想很重要** 接下来三个模块求解 1.不重复value 2.重复value求上界 3.重复value求下界**/#include<bits/stdc++.h>using namespace std;int binary_serch(int *A,int x,int y,int v){ // 在区间[x,y)内查找v int m; while(x<y){ m=x+(y-x)/2; if(A[m]==v) return m; else if(A[m]>v) y=m; else x=m+1; } return -1;}// 二分查找求下界 可以处理value值出现多次的情况,返回的是value第一次出现的地方/** 因为是寻找插入v的下界,那么下界待选区间为[x,y]* A[m]和v的情况如下:* 1. A[m]=v,m的左侧可能还有v,因此y=m;* 2. A[m]>v,y=m* 3. A[m]<v,x=m+1,x肯定不能等于m因为A[m]!=v* 将1 2整合 A[m]>=v y=m* return x 即可*/int lower_binary_serch(int *A,int x,int y,int v){ // 处理的区间是[x,y) int m; while(x<y){ m=x+(y-x)/2; // 当A[m]=v时,左侧还可能存在v,所以y更新为m这时查找的是[x,m) if(A[m]>=v) y=m; // 当A[m]>v时,说明v在左侧,区间更新为[x,m) else x=m+1; // 当A[m]<v时,说明v在右侧,区间更新为[m+1,y] } return x;}// 如果想写出二分求上界int up_binary_serch(int *A,int x,int y,int v){ int m; while(x<y){ m=x+(y-x)/2; if(A[m]>v) y=m; else x=m+1; } return x;}int main(){ int a[]={0,1,2,2,3,3,3,9,11}; int v; for(int i=0;i<9;i++) printf("%d ",a[i]); printf("\n"); while(true){ cin>>v; printf("%d\n",binary_serch(a,0,9,v)); printf("%d\n",lower_binary_serch(a,0,9,v)); printf("%d\n",up_binary_serch(a,0,9,v)); } return 0;}
0 0
- 二分查找求上、下界
- 二分查找求上、下界
- 二分查找求上下界
- 二分查找求下界
- 二分查找求上下界的两种不同算法
- 二分查找求上界 下界
- 【java】二分查找 求下界 求上界
- 二分查找下界 下界
- 二分查找求上界和下界
- 二分查找求上界和下界
- 二分查找求上界和下界
- 二分查找 上下界 插入位置
- 上界,下界,二分查找
- 【模版】快速排序,二分查找及其求其上下界函数
- 关于二分查找及其上下界问题的一些思考
- 二分寻找上下界
- 二分查找,二分上界,二分下界
- 二分查找(上界,下界)
- 队列的链式存储结构及实现
- 语音学习笔记2------matlab实现傅里叶变换
- service总结
- 文章标题
- c++ 预定义
- 二分查找求上下界
- 管道通信
- Windows平台使用PyInstaller将Python脚本打包成可执行文件
- 三大linux发行版的比较
- C语言概述
- 邮件的异步发送
- Win10开发之UWP控件的隐藏空间
- vmei day 03 教你集成环信移动客服
- jsp和servlet的之间的关系